Docs
ENFR
Tableau de bord
Démarrer

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 237670000999 pour 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, puis succeeded, failed ou expired. 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 2 n’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, 333333 et 444444 font é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

  1. 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).
  2. Créez un titulaire.
bash
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"}'
  1. 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.status passe à in_review.
bash
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…" }
  }'
  1. Décidez de la vérification. Approuvez-la. Pour tester votre parcours de refus, envoyez "result": "rejected" avec une reason, lisez verification.reason, puis renvoyez la vérification.
bash
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"}'
  1. Attendez cardholder.kyc_updated avec verification.status à verified, puis émettez une carte. Vous recevez 201 avec une carte active, ou 202 avec une carte pending suivie de card.issued ou card.issue_failed.
bash
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"}'
  1. Simulez des paiements. Un paiement accepté, puis un refusé. Vérifiez que votre code traite card.transaction et card.authorization_declined, et que le refus n’a rien changé sur la carte.
bash
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"}'
  1. 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.
  2. Résiliez-la. Résiliez la carte et vérifiez que card.terminated arrive 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 curl de Vérifier la signature).
  • Répondez 2xx en 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 failed et expired, paiements et reversements failed, card.issue_failed, vérifications refusées, paiements par carte refusés.
  • Chaque 202 est suivi d’un webhook, jamais d’une seconde création.
  • Vos tests échouent s’ils reçoivent "livemode": true.

Suivez ensuite Passer en production.