Test data
The numbers, cards and accounts that determine the outcome of your trials — one table per payment method.
Valid with a test key only
This data exists in the test environment only. In production it is rejected like any other invalid input.
Mobile Money
The phone number determines the transaction outcome. Each country has its own numbers, for both collecting and paying out.
COMPLETED— the transaction succeeds.FAILED— the transaction fails, with a specific reason.SUBMITTED— the transaction stays in progress, to test how you handle waiting.
Providers : MTN_MOMO_CMR, ORANGE_CMR
docs.sandboxNumbers.dialCodeHint +237
Payments (deposits)
| docs.sandboxNumbers.numberNational | Result | failureCode |
|---|---|---|
| 653456019 | FAILED | PAYER_LIMIT_REACHED |
| 653456029 | FAILED | PAYER_NOT_FOUND |
| 653456039 | FAILED | PAYMENT_NOT_APPROVED |
| 653456069 | FAILED | UNSPECIFIED_FAILURE |
| 653456129 | SUBMITTED | — |
| 653456789 | COMPLETED | — |
Withdrawals (payouts)
| docs.sandboxNumbers.numberNational | Result | failureCode |
|---|---|---|
| 653456089 | FAILED | RECIPIENT_NOT_FOUND |
| 653456119 | FAILED | UNSPECIFIED_FAILURE |
| 653456129 | SUBMITTED | — |
| 653456789 | COMPLETED | — |
Cards
On the test payment page, the number entered determines the outcome. Expiry date: any future date. CVC: any three digits.
| Number | Network | Result |
|---|---|---|
| Visa | 3-D Secure required — authentication step, then payment accepted | |
| Visa | Payment accepted | |
| Visa | Insufficient funds | |
| Visa | Card declined by the bank | |
| Visa | 3-D Secure required, then declined after authentication | |
| Mastercard | Payment accepted |
Expiry date: any future date. CVC: any three digits. These are Stripe's test cards: they only work with a kpay_test_ key.
Customer abandons
A customer may close the tab without paying. The transaction then stays pending and no webhook is sent. Test data lets you reproduce this case.
The most commonly missed case
An abandoned transaction is neither a success nor a failure. Make sure your integration does not treat it as paid, and set an order expiry.
Related resources
Was this page helpful?