We recommend checking out the introductory
section to understand the basics of direct
charge first. This guide assumes you’ve read that.
Direct debit is different from bank transfers. In direct debit, the customer enters their account details and authorizing info on your page; in bank transfers, you give them account details, and they make a transfer to you.
Supported Banks
Direct bank account debit is currently only supported for the following banks:
| Supported banks | Bank Code |
| Access Bank | 044 |
| Guaranty Trust Bank | 058 |
| First Bank | 011 |
| Sterling Bank | 232 |
| UBA | 033 |
| Zenith Bank | 057 |
Bank Transfer Process
Charging a Nigerian bank account involves three main steps:
- Initiate the payment: You send the payment details to the bank account charge endpoint.
- Authorize the charge: The customer authorizes the payment with their bank. The means of authorization will depend on the bank.
- Verify the payment: As a failsafe, you’ll call our API to verify that the payment was successful before giving value (via the verify transaction endpoint).
Step 1: Initiating the Payment
First, you’ll need the customer’s bank account details:
- You will need their
account_number.
- You will need their
account_bank (also referred to as the bank code; you can get this code with our get banks endpoint).
- You’ll need to specify the following bank details
amount, currency, email, fullname, and a unique tx_ref. You can also specify more details, such as the customer’s phone_number and custom meta information. See the reference documentation for details.
The currency you specify must match the account’s currency. This is
currently restricted to NGN accounts.
Send these payment details to the charge NG bank accounts endpoint. Here are some examples of using our SDKs:
// Install with: npm i flutterwave-node-v3
const Flutterwave = require('flutterwave-node-v3');
const flw = new Flutterwave(process.env.FLW_PUBLIC_KEY, process.env.FLW_SECRET_KEY);
const payload = {
amount: 7500,
currency: 'NGN',
email: 'developers@flutterwavego.com',
fullname: 'Flutterwave Developers',
phone_number: '+2349012345678',
tx_ref: 'UNIQUE_TRANSACTION_REFERENCE'
}
await flw.Charge.ng(payload);
Step 2: Handling the Response
If the request goes well, you’ll get a successful response that gives you the details of the created transaction and information on how to authorize it.
// Typically used by FirstBank and GTB
{
"status": "success",
"message": "Charge initiated",
"data": {
"id": 862960580,
"tx_ref": "UNIQUE_TRANSACTION_REFERENCE",
"flw_ref": "MPOG80201678720780553218",
"device_fingerprint": "N/A",
"amount": 7500,
"charged_amount": 7500,
"app_fee": 105,
"merchant_fee": 0,
"processor_response": "Pending validation",
"auth_model": "INTERNET_BANKING",
"currency": "NGN",
"ip": "N/A",
"narration": "Flutterwave Developers",
"status": "pending",
"auth_url": "https://api.ravepay.co/flwv3-pug/getpaid/api/short-url/SCN0eHPMN-",
"payment_type": "account",
"fraud_status": "ok",
"created_at": "2023-03-13T15:19:40.000Z",
"account_id": 35308,
"customer": {
"id": 407680026,
"phone_number": "2349012345678",
"name": "Flutterwave Developers",
"email": "developers@flutterwavego.com",
"created_at": "2022-08-11T15:32:30.000Z"
},
"meta": {
"authorization": {
"mode": "redirect",
"redirect": "https://api.ravepay.co/flwv3-pug/getpaid/api/short-url/SCN0eHPMN-",
"validate_instructions": ""
}
}
}
}
Here are some key details to note in the response:
-
status is "success", meaning that the charge was initiated successfully.
-
data.status is "pending", meaning that the customer needs to authorize the transaction with their bank.
-
meta.authorization contains the important details to authorize the payment:
-
The
mode is "redirect", which means the customer should be redirected to their bank for authorization.
-
You’ll have a
redirect field, which is where you should redirect your customer to.
Step 3: Authorizing the Transaction
To authorize the payment, you need to redirect the customer to the URL in the redirect field:
if (transaction.meta.authorization.mode == 'redirect') {
return res.redirect(transaction.meta.authorization.redirect);
}
Wehooks
When the customer makes the payment, we’ll send you a webhook notification. Here’s what the payload looks like:
{
"event": "charge.completed",
"data": {
"id": 862960580,
"tx_ref": "UNIQUE_TRANSACTION_REFERENCE",
"flw_ref": "MPOG80201678720780553218",
"device_fingerprint": "N/A",
"amount": 7500,
"currency": "NGN",
"charged_amount": 7500,
"app_fee": 105,
"merchant_fee": 0,
"processor_response": "Approved by Financial Institution",
"auth_model": "INTERNET_BANKING",
"ip": "N/A",
"narration": "Flutterwave Developers",
"status": "successful",
"payment_type": "account",
"created_at": "2023-03-13T15:19:40.000Z",
"account_id": 35308,
"customer": {
"id": 407680026,
"name": "Flutterwave Developers",
"phone_number": "2349012345678",
"email": "developers@flutterwavego.com",
"created_at": "2022-08-11T15:32:30.000Z"
},
"account": {
"account_name": "undefined undefined"
}
}
}
Now, your webhook endpoint can handle the event and complete the customer’s order. For help setting up webhooks, see our guide on webhooks.
In your webhook handler, you can then verify the payment and credit your customers with whatever they paid for. See our guide to transaction verification for details.