processing(USSD/STK prompt flow)redirect(provider-hosted completion flow)bankTransfer(customer must transfer to returned account details)pre-otp(customer code required before request)otp(customer must enter an OTP returned after request initiation)
1) Processing Flow (USSD/STK Prompt)
Customer receives authorization prompt on mobile device and confirms with PIN.What happens
- You initiate direct charge.
- Provider sends STK push/USSD prompt to customer.
- Customer authorizes on device.
- Transaction remains pending until provider final response.
How to detect
data.action is processing.
Merchant handling
- Show pending state to customer.
- Do not fulfill on initial response.
- Wait for webhook or verify by reference.
2) Redirect Flow
Provider returns a link; customer must complete payment on provider page/app.What happens
- You initiate direct charge.
- API responds with redirect URL.
- Customer completes payment on provider channel.
- Customer may return to your app/site afterward.
How to detect
data.action is redirect and URL is typically in data.data.link.
Merchant handling
- Redirect user to
data.data.link. - On return, still verify final status server-side.
- Do not mark success from redirect alone.
3) Bank Transfer Flow
Payfonte returns bank account details; the customer must make a bank transfer to complete payment.What happens
- You initiate direct charge with a bank transfer provider.
- API responds with account details for the customer payment.
- You display the account details to the customer.
- Customer sends the transfer from their banking app or bank channel.
- Transaction remains pending until provider confirmation.
How to detect
data.action is bankTransfer. Account details are returned in data.data.
Merchant handling
- Display the returned account details clearly to the customer.
- Include bank name, account number, account name, amount, reference, and expiry when present.
- Keep the payment pending until webhook or verification confirms final status.
- Do not fulfill on proof of transfer alone.
4) Pre-OTP Flow
Some providers require customer to generate a provider code/OTP before you send the charge request.What happens
- Customer generates code via provider USSD.
- Customer shares code with merchant.
- Merchant sends
customerInput.customerCode. - Provider processes charge.
Common USSD codes
- Orange Ivory Coast:
#144*82# - Orange Senegal:
#144#391# - Orange Burkina Faso:
*144*4*6*Amount*PIN# - Orange Mali:
#144#37#
Sample request
Merchant handling
- Collect OTP/customer code explicitly.
- Validate format before API call.
- Continue with normal webhook/verification completion flow.
5) OTP Flow
Some providers send an OTP to the customer after you initiate the Direct Charge request. Your application must collect that OTP from the customer and submit it to the confirmation API.What happens
- You initiate direct charge.
- API responds with
actionasotp. - Customer receives an OTP by SMS or provider channel.
- You display an interface where the customer can enter the OTP.
- Your backend submits the OTP with the transaction
reference. - Transaction remains pending until provider final response.
How to detect
data.action is otp. OTP instructions are returned in data.data.message, and data.data.numberOfDigits may tell you the expected OTP length.
Submit customer OTP
Confirmation response
Merchant handling
- Build a customer-facing OTP entry interface when
data.actionisotp. - Use
data.data.numberOfDigitsto guide validation when it is present. - Submit the OTP from your backend to
POST /payments/v1/payments/confirm. - Keep the payment pending until webhook or verification confirms final status.
Flow Decision Summary
Important Rules
See Amount Specification.Related Docs
Direct Charge API
Endpoint usage and request field definitions.
Example Payloads
Provider-specific payload templates.
Webhooks
Confirm final transaction outcome asynchronously.