Paiements : Mobile Money et carte
Un paiement CashChap est un encaissement (collection) : CashChap demande à l'opérateur de débiter le client, puis crédite votre solde. Cette page décrit les moyens de paiement, le choix de l'opérateur et le cycle de vie d'une transaction, communs à l'API, au SDK, au widget, aux liens de paiement, à la boutique et aux terminaux.
Moyens de paiement
Mobile Money
Le client reçoit sur son téléphone une demande de validation (notification ou code USSD) qu'il confirme avec son code secret. Cette demande vient de l'opérateur : elle annonce le montant dans la monnaie du compte Mobile Money (XOF au Bénin), même quand votre service est réglé dans une autre devise et que toutes les pages CashChap montrent, elles, la devise du service ; l'écran d'attente en prévient le client. Au Bénin, CashChap est raccordé à MTN Mobile Money et à Moov Money :
mtn-benin
moov-benin
Dans l'API v2, payment_method vaut mobile_money (valeur par défaut) et provider désigne l'opérateur. Le numéro (phone) doit appartenir à cet opérateur, sinon la demande est refusée avec invalid_phone_number. Le numéro s'écrit au format international, sans « + » : indicatif du pays puis numéro national. Au Bénin : 229, puis 01 et 8 chiffres (2290197000000) ; l'ancien format 229 + 8 chiffres est accepté et reçoit le 01. Un numéro national seul est refusé (phone_international_required), et le numéro doit être du pays de l'opérateur. Les réponses donnent le numéro sous la même forme (2290197000000) ; voir Numéros de téléphone. Un numéro bloqué par CashChap (fraude avérée) est refusé avec phone_number_blocked, à l'encaissement comme au retrait.
D'autres passerelles Mobile Money existent pour les marchands concernés : voir la liste. La liste exacte des moyens ouverts à votre service est donnée par GET /v2/payment-methods.
Choix automatique de l'opérateur
Vous ne savez pas à quel opérateur appartient le numéro du client ? Envoyez "provider": "auto" avec un encaissement Mobile Money : CashChap reconnaît l'opérateur d'après le numéro (préfixes de chaque opérateur, règle béninoise des 10 chiffres) et l'utilise comme si vous l'aviez indiqué. Le pays est déduit de l'indicatif : seuls les opérateurs de ce pays sont candidats. La réponse 202 indique l'opérateur retenu dans provider. Pour un retrait, l'opérateur enregistré sur le compte de retrait autorisé du numéro l'emporte.
- Un seul opérateur reconnaît le numéro : il est retenu ; les contrôles habituels s'appliquent (opérateur ouvert pour votre service, devise, plafonds).
- Plusieurs opérateurs : seuls ceux ouverts pour votre service sont gardés ; s'il en reste plusieurs, la demande est refusée.
- Aucun opérateur : la demande est refusée.
Dans ces deux cas de refus, l'API v2 répond 422 provider_required avec details.field = provider : vérifiez le numéro ou indiquez l'opérateur. Un provider explicite reste toujours prioritaire. Le widget, la boutique et les liens de paiement font ce choix pour le client.
Carte bancaire
visa
mastercard
Le paiement par carte (payment_method = card) n'est pas encore ouvert aux marchands : il peut être indisponible (card_payments_unavailable). Quand il l'est, le client saisit ses données de carte dans le widget hébergé par CashChap : votre site ne les manipule jamais. La carte est refusée sur les terminaux et en boutique (payment_method_not_allowed_on_channel).
Débit direct
Le moyen direct_debit couvre la passerelle BAXI au Nigéria (baxi-nigeria, NGN). Il fonctionne comme le Mobile Money : le client est identifié par son numéro de téléphone.
Canaux
Chaque transaction porte un canal (channel), déduit par CashChap de la clé utilisée : vous ne le déclarez jamais (un champ channel dans la requête est refusé). Le canal peut avoir ses propres frais (frais par canal et par terminal).
| Canal | Origine |
|---|---|
api | Votre serveur, avec la clé secrète. |
widget | Le widget ou le SDK, avec la clé publique. |
payment_link | Un lien de paiement. |
shop | Ma boutique, dans le portail. |
pos | Un terminal de paiement (TPE). |
dashboard | Un retrait demandé depuis le portail. |
Cycle de vie d'une transaction
- Demande : votre serveur, le widget, un lien de paiement ou un terminal envoie la demande. CashChap contrôle la clé, le service, l'opérateur, le numéro, la devise, les plafonds et les limites antifraude. Une demande refusée reçoit tout de suite une erreur et aucune transaction n'est créée.
- pending : la transaction existe (réponse 202 avec son
id) ; l'opérateur attend la validation du client (pending_reason=awaiting_provider). Cette attente dure de quelques secondes à quelques minutes ; l'opérateur la clôt lui-même si le client ne répond pas. - succeeded : le client a payé. Votre solde est crédité du montant net (
net_amount) ; CashChap envoie le webhookpayment.successet, si la notification est activée, un reçu au client. - failed ou expired : refus du client, solde insuffisant, délai dépassé… La raison est dans
failure(codeetmessageen français) et dans le webhookpayment.failed.
| Statut v2 | Signification | Définitif | Webhooks |
|---|---|---|---|
| pending | En attente de la validation du client ou de la réponse de l'opérateur. | Non | PENDING |
| succeeded | Paiement effectué, solde crédité (ou retrait effectué). | Oui | VALIDATED |
| failed | Paiement non effectué ; la raison est dans failure. | Oui | FAILED |
| expired | Le client n'a pas validé à temps (failure.code = customer_timeout). | Oui | FAILED + E411 |
| cancelled | Virement bancaire annulé avant traitement. | Oui | CANCELLED |
Un paiement remboursé garde le statut succeeded ; le montant remboursé figure dans refunded_amount. Le remboursement lui-même est une opération distincte (Remboursements).
Confirmer un paiement avant de livrer
Deux sources de vérité, à combiner :
- La lecture de la transaction :
GET /v2/transactions/{id}avec la clé secrète, ouGET /v2/transactions?reference=…avec votre référence. Ajoutez?wait=5pour que la réponse attende jusqu'à 5 secondes un statut final. Interrogez-la au retour du client, puis périodiquement tant qu'elle estpending(toutes les 5 à 10 secondes pendant deux minutes, puis plus espacé). - Le webhook : CashChap appelle votre adresse dès que la transaction aboutit. Vérifiez la signature, déchiffrez la charge, puis traitez. Détail dans Webhooks.
Dans les deux cas, contrôlez que mode vaut live, que amount et currency correspondent à la commande, et que la transaction n'a pas déjà été traitée chez vous. amount et currency restent ceux de votre demande ; les montants prélevés (amount_charged) et crédités (net_amount) sont dans la devise de l'opérateur et en XOF, et le bloc display donne ce que le client a vu, dans la devise du service.
Identifiants d'une transaction
id: identifiant (UUID) attribué par CashChap, renvoyé dans la réponse 202 et dans l'en-têteLocation. C'est lui qu'il faut garder pour suivre la transaction.reference: votre propre référence (1 à 64 caractères : lettres, chiffres,_ . : / -), par exemple un numéro de commande. Elle est unique par environnement : une seconde demande avec la même référence est refusée (duplicate_reference, avec l'idde la transaction existante). C'est la meilleure protection contre le double paiement.Idempotency-Key: en-tête obligatoire sur les créations. Rejouer la même requête avec la même clé (après une coupure réseau) rend la même réponse sans créer une seconde transaction. Voir Idempotence.metadata: objet libre (20 clés au plus, valeurs texte de 500 caractères au plus) renvoyé tel quel dans la transaction.request_id: identifiant de chaque appel (en-têteX-Request-Id), à donner au support.
Reçu et facture
Une transaction réussie génère une facture PDF (numéro CS + dix chiffres ; TS en mode test) accessible depuis le portail, et un reçu « Reçu Cashchap » envoyé par e-mail au client dont l'adresse est connue (paiements initiés par le client : widget, lien de paiement, API). Pour être prévenu vous-même, cochez Prélèvement validé dans Compte › Préférences, bloc Notifications : à chaque paiement Live validé, le titulaire reçoit l'e-mail « [CashChap] Paiement reçu » (avec le montant dans la devise du service, puis en XOF) et une notification dans le portail. Retrait validé ajoute une notification dans le portail ; l'e-mail de confirmation de chaque retrait est envoyé dans tous les cas. Rien n'est envoyé pour le Sandbox. Reçu, facture et e-mail du client sont dans la devise du service au moment du paiement : le client n'y voit jamais le XOF prélevé par l'opérateur. Un reçu imprimable (texte de 32 ou 48 colonnes, pour les imprimantes de caisse) s'obtient avec GET /v2/transactions/{id}/receipt?format=text. Reçus et factures portent un QR code d'authentification qui mène à la page publique de vérification : voir Reçus et vérification.