Tests
Le mode test en détail : les bacs à sable, les outils de test, les simulateurs du tableau de bord et un scénario complet de carte.
Tout ce qui suit utilise une clé de test (mr_test_…) et ne déplace aucun argent réel. Lisez d’abord Mode test pour comprendre la séparation entre données de test et de production.
Le mobile money en mode test
Les encaissements et les paiements passent par le bac à sable du partenaire de paiement, pas par les vrais opérateurs.
- Dans la plupart des pays, le bac à sable décide du déroulé d’un encaissement de test (validation sur le téléphone ou code) et du statut définitif atteint. Envoyez des numéros au format valide pour le pays (par exemple
237670000999pour le Cameroun). Les erreurs de format (400 phone_invalid) se comportent comme en production. - Dans les pays listés sous Numéros de test, seuls les numéros de test sont acceptés en mode test, et le dernier chiffre décide du résultat.
- Écrivez votre code pour chaque statut :
pending,requires_otp,processing, puissucceeded,failedouexpired. Ne supposez pas qu’un encaissement de test réussit toujours. - Les encaissements réussis créditent votre solde de test. Servez-vous de ce solde pour essayer les paiements et les reversements.
Numéros de test
Au Gabon, au Tchad, au Congo, en Centrafrique, au Mali, au Niger, en Guinée et en RD Congo, le mode test n’accepte que ces numéros, pour les encaissements comme pour les paiements. Tout autre numéro renvoie 400 test_phone_required : un test n’atteint jamais un vrai portefeuille.
| Pays | country, currency |
Réussit | Reste pending |
Échoue |
|---|---|---|---|---|
| Gabon | GA, XAF |
24100000001 |
24100000002 |
24100000003 |
| Tchad | TD, XAF |
23500000001 |
23500000002 |
23500000003 |
| Congo | CG, XAF |
24200000001 |
24200000002 |
24200000003 |
| Centrafrique | CF, XAF |
23600000001 |
23600000002 |
23600000003 |
| Mali | ML, XOF |
22300000001 |
22300000002 |
22300000003 |
| Niger | NE, XOF |
22700000001 |
22700000002 |
22700000003 |
| Guinée | GN, GNF |
224600000001 |
224600000002 |
224600000003 |
| RD Congo | CD, CDF |
243120000011 |
243120000012 |
243120000013 |
- Utilisez n’importe quel opérateur renvoyé par Lister les opérateurs pour le pays. Le statut définitif arrive en quelques secondes, par webhook et sur l’objet.
- Un numéro qui finit par
2n’atteint jamais de statut définitif : il sert à tester les longues attentes. - Orange Money en Guinée demande un code : l’encaissement est
requires_otp. Envoyez n’importe quel code à 6 chiffres avec authorize.000000,111111,222222,333333et444444font échouer l’encaissement ; tout autre code laisse le numéro décider.
Outils de test des cartes
Deux points d’accès jouent le rôle de l’émetteur de cartes. Ils demandent une clé de test et le rôle Propriétaire ou Finance.
| Point d’accès | Corps | Effet |
|---|---|---|
POST /v1/test/cardholders/{id}/verification |
result : approved ou rejected ; reason (facultatif, 200 caractères au plus) |
Décide d’une vérification en in_review. Avec rejected, reason devient verification.reason (par défaut : Document unreadable (simulation)). Envoie cardholder.kyc_updated. |
POST /v1/test/cards/{id}/authorizations |
amount (cents de dollar), merchant (facultatif, 40 caractères au plus), status : approved (par défaut) ou declined |
Accepté : le paiement et ses frais sont prélevés sur la carte et card.transaction est envoyé. Refusé : rien n’est prélevé et card.authorization_declined est envoyé, avec reason à Declined (simulation). |
Un scénario complet de carte
- Alimentez le solde cartes de test. Dans le tableau de bord, en mode test, ouvrez Cartes › Recharger et cliquez sur Simuler le dépôt (Propriétaire ou Finance). Il simule un dépôt d’USDT sur TRON (TRC20).
- Créez un titulaire.
curl https://api.monerail.com/v1/cardholders \
-H "Authorization: Bearer $MONERAIL_KEY" \
-H "Content-Type: application/json" \
-d '{"type": "customer", "first_name": "Awa", "last_name": "Ndiaye", "email": "awa@example.com", "phone": "+237670000999", "country": "CM"}'- Envoyez la vérification. Envoyez des images JPEG ou PNG en base64 : l’API vérifie le format et la taille (4 Mo chacune).
verification.statuspasse àin_review.
curl https://api.monerail.com/v1/cardholders/5df6acd9-4bac-4e19-869c-fcde6b79f389/verification \
-H "Authorization: Bearer $MONERAIL_KEY" \
-H "Content-Type: application/json" \
-d '{
"id_number": "CM12345678",
"birth_date": "1991-02-03",
"place_of_birth": "Douala",
"address": { "line1": "12 rue Joss", "city": "Douala" },
"documents": { "front": "data:image/jpeg;base64,/9j/4AAQ…", "back": "data:image/jpeg;base64,/9j/4AAQ…" }
}'- Décidez de la vérification. Approuvez-la. Pour tester votre parcours de refus, envoyez
"result": "rejected"avec unereason, lisezverification.reason, puis renvoyez la vérification.
curl https://api.monerail.com/v1/test/cardholders/5df6acd9-4bac-4e19-869c-fcde6b79f389/verification \
-H "Authorization: Bearer $MONERAIL_KEY" \
-H "Content-Type: application/json" \
-d '{"result": "approved"}'- Attendez
cardholder.kyc_updatedavecverification.statusàverified, puis émettez une carte. Vous recevez201avec une carteactive, ou202avec une cartependingsuivie decard.issuedoucard.issue_failed.
curl https://api.monerail.com/v1/cards \
-H "Authorization: Bearer $MONERAIL_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: test-card-awa-1" \
-d '{"cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389", "amount": 1000, "label": "Test card"}'- Simulez des paiements. Un paiement accepté, puis un refusé. Vérifiez que votre code traite
card.transactionetcard.authorization_declined, et que le refus n’a rien changé sur la carte.
curl https://api.monerail.com/v1/test/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/authorizations \
-H "Authorization: Bearer $MONERAIL_KEY" \
-H "Content-Type: application/json" \
-d '{"amount": 400, "merchant": "Notion"}'
curl https://api.monerail.com/v1/test/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/authorizations \
-H "Authorization: Bearer $MONERAIL_KEY" \
-H "Content-Type: application/json" \
-d '{"amount": 90000, "merchant": "Notion", "status": "declined"}'- Gérez la carte. Rechargez-la, videz-la, bloquez-la et débloquez-la. Chaque action peut répondre
202: traitez le webhook qui suit. - Résiliez-la. Résiliez la carte et vérifiez que
card.terminatedarrive et que son solde est revenu sur le solde cartes (Consulter le solde).
Les simulateurs du tableau de bord
En mode test, le tableau de bord propose les mêmes simulations derrière des boutons :
| Quoi | Où | Bouton (FR / EN) |
|---|---|---|
| Alimenter le solde cartes (Propriétaire ou Finance) | Cartes › Recharger | Simuler le dépôt / Simulate the deposit |
| Décider d’une vérification | Un titulaire en cours d’examen | Valider / Approve, Refuser / Reject |
| Payer avec une carte | Une carte | Simuler un achat / Simulate a payment |
Tester vos webhooks
- Créez un point de terminaison de test : les événements de test ne partent que vers eux, signés avec leur propre secret.
- Pour recevoir les événements sur votre machine, exposez votre serveur local par un tunnel HTTPS doté d’un nom de domaine.
- Pour tester votre vérification de signature sans Monerail, envoyez-vous un événement signé de la même façon (onglet
curlde Vérifier la signature). - Répondez
2xxen moins de 10 secondes, puis essayez une réponse en échec et observez les nouvelles tentatives. Utilisez Renvoyer un événement pour en rejouer un.
Avant la production
- Chaque statut définitif est traité : encaissements
failedetexpired, paiements et reversementsfailed,card.issue_failed, vérifications refusées, paiements par carte refusés. - Chaque
202est suivi d’un webhook, jamais d’une seconde création. - Vos tests échouent s’ils reçoivent
"livemode": true.
Suivez ensuite Passer en production.