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 de test n’atteignent jamais un vrai opérateur ni un vrai portefeuille.
- Dans tous les pays ouverts, le mode test n’accepte que les numéros de test ci-dessous, et le dernier chiffre décide du résultat. Tout autre numéro renvoie
400 test_phone_required. Les erreurs de format (400 phone_invalid) se comportent comme en production. - Au Cameroun et en Gambie, Monerails simule lui-même l’opération. Dans les autres pays, elle part vers l’environnement de test d’un partenaire de paiement, toujours avec le numéro de test propre à ce partenaire, jamais avec le numéro d’un vrai portefeuille.
- É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 Cameroun, en Côte d’Ivoire, au Sénégal, au Bénin, au Togo, au Burkina Faso, au Gabon, au Tchad, au Congo, en Centrafrique, au Mali, au Niger, en Guinée-Bissau, en Guinée, en Gambie 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 |
|---|---|---|---|---|
| Cameroun | CM, XAF |
237660000001 |
237660000002 |
237660000003 |
| Côte d’Ivoire | CI, XOF |
2252100000001 |
2252100000002 |
2252100000003 |
| Sénégal | SN, XOF |
221700000001 |
221700000002 |
221700000003 |
| Bénin | BJ, XOF |
22900000001 |
22900000002 |
22900000003 |
| Togo | TG, XOF |
22800000001 |
22800000002 |
22800000003 |
| Burkina Faso | BF, XOF |
22660000001 |
22660000002 |
22660000003 |
| 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-Bissau | GW, XOF |
245000000001 |
245000000002 |
245000000003 |
| Guinée | GN, GNF |
224600000001 |
224600000002 |
224600000003 |
| Gambie | GM, GMD |
2200000001 |
2200000002 |
2200000003 |
| 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). |
Les paiements de test sont simulés par Monerails : ils suivent les mêmes règles qu’une vraie autorisation (carte bloquée, solde de la carte insuffisant ou plafond dépassé : paiement refusé, avec ses frais de refus) mais n’atteignent jamais le réseau de cartes. Quand une demande approved est refusée par ces règles, la réponse contient status: "declined", un decline_code (card_frozen, insufficient_funds ou limit_exceeded) et un message.
Limites du mode test
Les fonds des cartes de test sont partagés par toutes les entreprises de Monerails : le mode test des cartes est donc limité par entreprise.
| Limite | Valeur |
|---|---|
| Solde cartes de test + argent sur les cartes de test | 500 USD au plus |
| Recharge de test du solde cartes | de 10 à 100 USD par opération |
| Cartes de test actives | 10 au plus |
| Cartes de test émises | 20 par mois civil |
Au-delà d’une limite, le tableau de bord affiche un message clair et l’API répond 400 test_limit_reached (429 pour le quota mensuel d’émission). Résiliez ou videz les cartes de test inutilisées pour libérer de la place. Une carte de test inutilisée depuis 30 jours, ou toutes les cartes de test d’une entreprise sans activité de test depuis 60 jours, sont vidées vers le solde cartes de test puis résiliées automatiquement. Besoin de plus pour une démonstration ? Contactez-nous.
Un scénario complet de carte
- Alimentez le solde cartes de test. Dans le tableau de bord, en mode test, ouvrez Cartes › Recharger le solde cartes, saisissez un montant (de 10 à 100 USD en mode test) et cliquez sur Créditer le solde de test (Propriétaire ou Finance). Le solde de test est crédité immédiatement, sans crypto.
- Créez un titulaire.
curl https://api.monerails.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", "birth_date": "1991-02-03", "id_document": "national_id",
"documents": { "front": "data:image/jpeg;base64,/9j/4AAQ…", "back": "data:image/jpeg;base64,/9j/4AAQ…" }}'- Envoyez la vérification. Les photos de la pièce sont exigées dès la création du titulaire (JPEG ou PNG en base64 : l’API vérifie le format, le poids, 4 Mo chacune, et la résolution, au moins 600 × 400 px) et reprises ici ; renvoyez
documentsseulement pour les remplacer.verification.statuspasse àin_review.
curl https://api.monerails.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", "state": "Littoral" },
"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.monerails.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.monerails.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.monerails.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.monerails.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 le solde cartes | Montant, puis Créditer le solde de test / Credit the test balance |
| 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 Monerails, 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.