Aller plus loin
Statuts & erreurs
Un paiement mobile money passe par plusieurs mains avant d'aboutir. Cette page dit ce que chaque état signifie, comment savoir où en est une transaction, et quoi faire quand ça se passe mal.
Les quatre statuts
En attente
La demande est partie, le client n’a pas encore validé. C’est l’état normal juste après un appel.
Réussi
L’argent est arrivé. Votre solde est crédité. C’est le seul état sur lequel on livre.
Échoué
L’opérateur a refusé : solde insuffisant, code faux, numéro invalide.
Annulé
Le client a abandonné, ou le panier est resté sans suite plus de deux heures.
Un statut peut changer plusieurs fois : pending puis completed,
parfois pending puis cancelled. Traitez toujours l'information
la plus récente, et ne livrez qu'une fois par token.
Vérifier où en est une transaction
Le webhook reste la source de vérité, mais vous pouvez demander l'état à tout moment — c'est recommandé quand un client revient sur votre page de remerciement.
{
"success": true,
"token": "9d3f7a21c4",
"status": "completed",
"amount": 5000,
"currency": "XOF",
"env": "live",
"customer": { "name": "Awa Diop", "email": null, "phone": "90123456" }
}
/api/v1/payments/REMPLACEZ_PAR_LE_TOKEN/status
Essayer
Utilisez vos clés de test : en mode test aucun argent ne circule. Vos clés restent dans ce navigateur — elles ne sont ni enregistrées ni transmises à un tiers. Dans votre intégration réelle, les clés doivent rester sur votre serveur, jamais dans une page.
<?php
// Un client revient sur votre page « merci » : ne vous fiez pas à l'URL, demandez.
$d = appelTchin('GET', '/payments/'.$token.'/status');
switch ($d['status'] ?? 'pending') {
case 'completed':
// Le webhook a peut-être déjà fait le travail : restez idempotent.
livrerUneSeuleFois($token);
return vue('merci');
case 'pending':
return vue('paiement-en-cours'); // proposez d'actualiser dans 10 s
case 'failed':
case 'cancelled':
return vue('paiement-echoue'); // proposez de réessayer
}
Ce que nous vérifions pour vous
Les webhooks se perdent : votre serveur redémarre, le réseau coupe, un pare-feu bloque. Deux services tournent en permanence pour que rien ne reste en suspens.
| Service | Cadence | Ce qu'il fait |
|---|---|---|
| Encaissements | 5 minutes | Interroge l'opérateur sur toutes les transactions en attente, met le statut à jour, crédite votre solde et vous renvoie le webhook. |
| Déboursements | 2 minutes | Finalise ou rembourse votre solde selon le résultat réel, et vous notifie. |
Un panier jamais payé — page ouverte, rien validé — est clôturé au bout de deux heures et passe
en cancelled. Vous n'avez donc jamais de transaction éternellement en attente.
Les codes HTTP
| Code | Signification |
|---|---|
200 | Requête traitée. Regardez quand même le champ success. |
201 | Créé — utilisé par les abonnements. |
400 | Requête refusée : solde insuffisant, déboursement rejeté. Le message dit quoi. |
401 | Clés absentes ou fausses. Vérifiez les deux en-têtes. |
402 | Paiement refusé par l’opérateur. |
403 | Compte suspendu. |
404 | Ressource inconnue, ou qui ne vous appartient pas. |
422 | Données invalides : champ manquant, opérateur hors du pays, moyen non éligible à l’abonnement. |
429 | Trop de requêtes. Attendez et réessayez — 120 par minute et par clé. |
500 | Panne de notre côté. Réessayez ; si cela dure, écrivez-nous. |
Forme des erreurs
{
"success": false,
"message": "Opérateur « mtn-ci » indisponible pour le pays TG."
}
{
"message": "The amount field is required.",
"errors": {
"amount": ["The amount field is required."]
}
}
Un 200 ne veut pas dire « ça a marché » : regardez toujours success.
Le champ message est rédigé pour être montré à un humain — le vôtre, pas forcément
votre client final.
Les erreurs qu'on voit le plus
| Symptôme | Cause habituelle |
|---|---|
| 401 alors que les clés semblent bonnes | Espace ou retour à la ligne collé dans l'en-tête, ou clés de test utilisées en live. |
| 422 sur l'opérateur | operator qui n'appartient pas au country envoyé. |
| Le client dit avoir payé, vous n'avez rien reçu | Webhook non joignable en HTTPS, ou réponse autre que 200. Notre rattrapage le renverra. |
| Commande livrée deux fois | Webhook reçu en double. Utilisez token comme clé d'idempotence. |
| Livraison sur un paiement de test | Le champ mode n'est pas vérifié. |
| 429 | Boucle d'interrogation trop rapide. Espacez à 5 secondes minimum. |
https://tchin.tech/api/v1
Retour au sommaire