Aller au contenu
CashChap CashChap Docs

Sandbox et tests

Le mode test (Sandbox) reproduit toute la chaîne de paiement sans opérateur réel ni mouvement d'argent. Vous y testez l'API v2, le SDK, le widget, les liens de paiement, les terminaux, les retraits et les webhooks, avec des scénarios choisis par le numéro de téléphone.

Utiliser le mode test

  1. Prenez les clés Sandbox du service dans Développeurs › Clés API, environnement Sandbox (clé publique PKSANDBOX_…, clé secrète SKSANDBOX_…). Aucune validation KYC n'est requise.
  2. Utilisez-les exactement comme les clés Live : mêmes adresses, mêmes champs, mêmes erreurs. Les transactions portent "mode": "sandbox".
  3. Consultez les transactions de test en basculant le portail sur l'environnement Sandbox (bouton Sandbox / Live, en haut à droite) : elles sont stockées à part, jamais mélangées aux transactions Live, et purgées périodiquement.
  4. Déclarez un webhook Sandbox pour tester vos notifications sans toucher au webhook Live.
Tableau de bord du portail en mode Sandbox : bascule Sandbox / Live avec Sandbox sélectionné, étiquette SANDBOX dans le menu, relevé de compte marqué Sandbox avec les soldes de test (solde général et solde disponible 75 000 XOF, 0 XOF en cours et retiré), historique des transactions (75 000 XOF ce mois-ci), moyens de paiement, transactions récentes de test de Koffi Mensah à 15 000 XOF le 11 oct. 2026 entre 10:40 et 13:48, activités récentes du compte (connexion de 14:55, passage en mode Live de 13:55, connexions des collaborateurs) et Outils rapides, où le retrait est indiqué « Disponible en mode Live uniquement ».
Le portail en mode Sandbox : soldes et opérations de test, séparés du Live.

Numéros de test

Un numéro de test se compose du préfixe de l'opérateur, de zéros, puis d'un code de scénario à deux chiffres, soit 10 chiffres de numéro national au Bénin, écrits au format international, sans « + » : l'indicatif 229 devant, soit 13 chiffres en tout (2290166000000). La règle vaut pour tout opérateur : indicatif, préfixe de l'opérateur, zéros, puis le code. Les numéros à retenir :

NuméroOpérateurRésultat
2290166000000MTN Bénin (mtn-benin)succeeded en 5 secondes environ
2290166000012MTN Bénin (mtn-benin)failed insufficient_funds (solde insuffisant, E412)
2290195000000Moov Bénin (moov-benin)succeeded
2290195000012Moov Bénin (moov-benin)failed insufficient_funds

L'ancien format béninois reste accepté avec l'indicatif : 22966000012 devient 2290166000012. Un numéro sans indicatif (0166000000) est refusé avec phone_international_required, comme en Live. Dans la page de paiement, le payeur tape seulement la partie nationale (01 66 00 00 00) à côté de l'indicatif affiché +229. Tout autre numéro valide pour l'opérateur réussit en environ 5 secondes ; un numéro dont le préfixe est inconnu est refusé à l'entrée comme en Live (invalid_phone_number).

OpérateurPréfixes acceptés
MTN Bénin (mtn-benin)0142, 0146, 0150, 0151, 0152, 0153, 0154, 0156, 0157, 0159, 0161, 0162, 0166, 0167, 0169, 0190, 0191, 0196, 0197, 0198
Moov Bénin (moov-benin)0145, 0155, 0158, 0160, 0163, 0164, 0165, 0168, 0194, 0195, 0198, 0199

Les montants restent libres : les plafonds, les devises, les frais et l'arrondi sont calculés comme en production. Le choix automatique de l'opérateur ("provider": "auto") fonctionne aussi avec les numéros de test.

Scénarios

Les deux derniers chiffres du numéro choisissent le scénario :

CodeScénarioEncaissementRetrait Mobile MoneyDélai simulé
00 Succès succeeded succeeded ~5 s
01 En attente puis succès succeeded succeeded ~45 s
02 En attente puis échec expired customer_timeout (E411) failed provider_error (E429) ~2 min
03 Longue attente puis échec expired customer_timeout (E411) failed provider_error (E429) ~15 min
09 Refus immédiat de l'opérateur failed provider_error (E419) failed provider_error (E429) immédiat
10 Client refuse ou annule failed customer_declined (E410) succeeded ~5 s
11 Client ne valide pas à temps expired customer_timeout (E411) succeeded ~5 s
12 Solde insuffisant failed insufficient_funds (E412) succeeded ~5 s
13 Plafond du compte client atteint failed customer_limit_reached (E413) succeeded ~5 s
14 Numéro non inscrit au Mobile Money failed customer_not_registered (E414) succeeded ~5 s
15 Opération non autorisée failed operation_not_allowed (E415) succeeded ~5 s
16 Montant non autorisé failed amount_not_allowed (E416) succeeded ~5 s
19 Échec opérateur (prélèvement) failed provider_error (E419) succeeded ~5 s
20 Bénéficiaire non inscrit succeeded failed recipient_not_registered (E420) ~5 s
21 Bénéficiaire ne peut pas recevoir succeeded failed recipient_not_allowed (E421) ~5 s
22 Plafond du bénéficiaire atteint succeeded failed recipient_limit_reached (E422) ~5 s
23 Retrait momentanément indisponible succeeded failed payouts_temporarily_unavailable (E423) ~5 s
29 Échec opérateur (retrait) succeeded failed provider_error (E429) ~5 s
  • Un code d'échec qui ne concerne pas l'opération (par exemple 12 sur un retrait) donne un succès rapide.
  • Le code 09 est refusé par l'opérateur simulé dès la demande ; les autres échecs surviennent après le délai, comme un vrai refus du client.
  • Pendant le délai, le statut est pending : c'est le moment de tester votre suivi (?wait=5), vos écrans d'attente et onPending du SDK.
  • Le code de la raison (failure.code) est celui de l'API v2 ; le code Exxx entre parenthèses est celui des webhooks et de vos journaux d'API.

Exemple complet

Terminal
# 1. Encaissement qui échouera pour solde insuffisant (code 12) après ~5 s
curl -X POST https://api.cashchap.com/v2/collections \
  -H "Authorization: Bearer VOTRE_CLE_SECRETE_SANDBOX" \
  -H "Idempotency-Key: essai-solde-insuffisant-1" \
  -H "Content-Type: application/json" \
  -d '{ "amount": 1000, "currency": "XOF", "provider": "mtn-benin", "phone": "2290166000012",
        "customer": { "name": "Test Solde", "email": "test@example.com" } }'

# 2. Lecture avec attente : la réponse revient dès le statut final (5 s au plus)
curl "https://api.cashchap.com/v2/transactions/4e1d2c3b-5a69-4b8c-9d0e-1f2a3b4c5d6e?wait=5" \
  -H "Authorization: Bearer VOTRE_CLE_SECRETE_SANDBOX"
Transaction (extrait)
{
  "data": {
    "id": "4e1d2c3b-5a69-4b8c-9d0e-1f2a3b4c5d6e",
    "object": "transaction",
    "status": "failed",
    "mode": "sandbox",
    "failure": { "code": "insufficient_funds", "message": "Le solde Mobile Money du client est insuffisant." },
    "...": "autres champs identiques au Live"
  },
  "meta": { "request_id": "req_…" }
}

Retraits, virements et remboursements en mode test

Les retraits Mobile Money de test suivent les mêmes scénarios (codes 20 à 29) vers un numéro autorisé de l'environnement Sandbox, avec la clé secrète Sandbox. Les virements bancaires ne sont pas simulés. Les remboursements de test sont simulés et validés automatiquement.

Factures de test

Les factures PDF des transactions de test portent le préfixe TS au lieu de CS, afin de ne jamais être confondues avec des factures réelles. Elles portent aussi le bandeau « MODE TEST (Sandbox) : aucun argent réel n'a été débité. Ce document ne prouve aucun paiement. », et le QR code de leur reçu mène à la page de vérification « Paiement de test » (voir Reçus et vérification).

Liste de recette avant la mise en production

  • Paiement réussi (00), refusé (10), solde insuffisant (12), délai dépassé (02, statut expired) : votre site réagit correctement à chaque cas et affiche failure.message.
  • Attente longue (01, 03) : vos écrans et votre suivi tiennent plusieurs minutes.
  • Coupure réseau simulée : la même requête rejouée avec la même Idempotency-Key ne crée pas de seconde transaction.
  • Même reference envoyée deux fois : 409 duplicate_reference géré.
  • Webhook Sandbox reçu, signature vérifiée, charge déchiffrée, traitement sans doublon.
  • Page de retour du SDK : confirmation côté serveur avant tout message de succès.
  • Remplacement des clés Sandbox par les clés Live et du webhook de test par le webhook Live.