Tchin Docs

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

pending

En attente

La demande est partie, le client n’a pas encore validé. C’est l’état normal juste après un appel.

completed

Réussi

L’argent est arrivé. Votre solde est crédité. C’est le seul état sur lequel on livre.

failed

Échoué

L’opérateur a refusé : solde insuffisant, code faux, numéro invalide.

cancelled

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.

JSON
{
  "success":  true,
  "token":    "9d3f7a21c4",
  "status":   "completed",
  "amount":   5000,
  "currency": "XOF",
  "env":      "live",
  "customer": { "name": "Awa Diop", "email": null, "phone": "90123456" }
}
GET /api/v1/payments/REMPLACEZ_PAR_LE_TOKEN/status Essayer
Vos clés se trouvent dans votre espace, onglet API.

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
<?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.

ServiceCadenceCe qu'il fait
Encaissements5 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éboursements2 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

CodeSignification
200Requête traitée. Regardez quand même le champ success.
201Créé — utilisé par les abonnements.
400Requête refusée : solde insuffisant, déboursement rejeté. Le message dit quoi.
401Clés absentes ou fausses. Vérifiez les deux en-têtes.
402Paiement refusé par l’opérateur.
403Compte suspendu.
404Ressource inconnue, ou qui ne vous appartient pas.
422Données invalides : champ manquant, opérateur hors du pays, moyen non éligible à l’abonnement.
429Trop de requêtes. Attendez et réessayez — 120 par minute et par clé.
500Panne de notre côté. Réessayez ; si cela dure, écrivez-nous.

Forme des erreurs

JSON — erreur métier
{
  "success": false,
  "message": "Opérateur « mtn-ci » indisponible pour le pays TG."
}
JSON — 422, validation
{
  "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ômeCause habituelle
401 alors que les clés semblent bonnesEspace ou retour à la ligne collé dans l'en-tête, ou clés de test utilisées en live.
422 sur l'opérateuroperator qui n'appartient pas au country envoyé.
Le client dit avoir payé, vous n'avez rien reçuWebhook non joignable en HTTPS, ou réponse autre que 200. Notre rattrapage le renverra.
Commande livrée deux foisWebhook reçu en double. Utilisez token comme clé d'idempotence.
Livraison sur un paiement de testLe champ mode n'est pas vérifié.
429Boucle d'interrogation trop rapide. Espacez à 5 secondes minimum.
Base API https://tchin.tech/api/v1 Retour au sommaire

Bienvenue.

Votre adresse suffit, le compte se crée seul.

Votre code

Six chiffres envoyés à

Vous acceptez nos conditions et politiques.