M-Pesa B2B
How to automate disbursement to PayBill and Till Numbers
The M-Pesa B2B API is used to send money to PayBill and Till Numbers from the IntaSend's configured PayBill Number. Use case for this is mainly bill and suppliers payments.
M-Pesa B2B Fields
When sending payment using the M-Pesa B2B API, the following fields must be specified in your transaction item. Please note the difference between sending to a Paybill and the TillNumber. An account_type must be specified. For Paybill, account_reference is required.
A. Sending to PayBill
Field | Value |
---|---|
name | Name of the beneficiary i.e business |
account | Paybill number |
account_reference | Provide reference account for this transaction. |
account_type | Paybill |
amount | Amount to send in KES |
narrative | Purpose of payment |
B. Sending to TillNumber
Field | Value |
---|---|
name | Name of the beneficiary i.e business |
account | Till number of the beneficiary |
account_type | TillNumber |
amount | Amount to send in KES |
narrative | Purpose of payment |
Note:
The account_type field is case-sensitive and must be specified exactly as shown in the tables above.
Step 1: Initiate M-Pesa B2B
To begin, please go through the Send Money Pre-requisite to obtain the API Keys, Device ID and everything else you need to proceed.
Once setup we recommend using the SDKs provided by IntaSend to make it easy for you to sign and approve with less efforts. We have done the heavy lifting for you, so do not reinvent the wheel if the SDK of your stack is already available.
NB: Refer to how to authenticate documentation for more details on client libraries setup.
from intasend import APIService
service = APIService(token=token)
transactions = [{'name': 'Business 1', 'account': 247247, 'account_type': 'PayBill', 'account_reference': '5172627278', 'amount': 10, 'narrative': 'Invoice X'},
{'name': 'Business 2', 'account': 123211, 'account_type': 'TillNumber', 'amount': 10000, 'narrative': 'Purchase'}]
requires_approval = 'YES' # Set to 'NO' if you want the transaction to go through
# without calling the approve method
response = service.transfer.mpesa_b2b(currency='KES', transactions=transactions,
requires_approval=requires_approval))
print(response)
use IntaSend\IntaSendPHP\Transfer;
$transactions = [
['name' => 'Business A','account'=>'524311','amount'=>'200', 'account_type'=>'PayBill', 'account_reference'=>'29822182', 'narrative'=> 'Bill Payment'],
['name' => 'Business B','account'=>'17626','amount'=>'150', 'account_type'=>'TillNumber', 'narrative'=> 'Purchase']
];
$requires_approval = 'YES'; // Set to 'NO' if you want the transaction to go through
// without calling the approve method
$transfer = new Transfer();
$transfer->init($credentials);
$response=$transfer->mpesa_b2b("KES", $transactions, $requires_approval=$requires_approval);
const IntaSend = require('intasend-node');
const intasend = new IntaSend(/*...Authenticate*/)
let payouts = intasend.payouts();
var req_approval = 'YES' // Set to 'NO' if you want the transaction
// to go through without calling the approve method
payouts
.mpesaB2B({
currency: 'KES',
requires_approval: req_approval,
transactions: [
{
name: 'Business A',
account: '21222',
account_type: 'PayBill',
account_reference: '5172627278',
amount: 20,
narrative: 'Purchase'
},
{
name: 'Business B',
account: '45422',
account_type: 'TillNumber',
amount: 50,
narrative: 'Purchase'
}
]
})
.then((resp) => {
console.log(`Payouts response:`, resp);
// Approve payouts method can be called here if you would
// like to auto-approve immediately
})
.catch((err) => {
console.error(`Payouts error:`, err);
});
Like the M-Pesa B2C transactions, the B2B is also a two step and may require approval.
Step 2: How to approve B2B Transaction
If requires_approval
is set to YES
, the response from Step 1 is passed to the approve function to approve the transaction.
approved_response = service.transfer.approve(response)
print(approved_response)
$response = $transfer->approve($response);
print_r($response);
payouts
.approve(resp, false)
.then((resp) => {
console.log(`Payouts approve:`, resp);
})
.catch((err) => {
console.error(`Payouts approve error:`,err);
});
Updated 6 months ago