POST /api/v1/payments. Son id commence par pay_. Il vous est consultable via l’API et dans le tableau de bord.
Montants
Pour un paiement de 5 000 XAF réglé par mobile money :
Ce sont les mêmes noms que sur un retrait. Seul
net_amount compte pour votre solde.
Moyen de paiement
payment_method:mobile_moneyoucard.- Pour le mobile money,
mobile_money_countryetmobile_money_providerindiquent le pays et l’opérateur, par exempleCMRetMTN_MOMO_CMR.
currency et amount reflètent le montant réellement prélevé dans la devise de l’opérateur. Une carte, elle, encaisse toujours exactement la devise demandée, sans conversion.
next_action
Un paiement né d’une session de checkout ou d’une charge directe (POST /api/v1/payments) porte toujours un champ next_action : null quand il n’y a rien de plus à faire côté client (le mobile money aujourd’hui), ou un objet {"type": "...", ...} quand votre frontend doit terminer quelque chose pour confirmer le paiement. Pour une carte, type est "card_payment". Décidez toujours sur type, jamais sur la seule présence du champ : un futur moyen de paiement introduira son propre type sans jamais changer la forme de ceux déjà documentés.
Statuts
Un paiement ne passe à
succeeded qu’une seule fois. Marquez une commande comme payée à la réception du webhook payment.succeeded, pas à la redirection vers success_url : le client peut fermer l’onglet ou perdre sa connexion, alors que le webhook est renvoyé tant que votre serveur ne répond pas 2xx.
Un refus carte n’est pas toujours définitif
Sur le même formulaire, un client peut se tromper de carte puis réessayer avec la bonne. Le paiement passe alors defailed à succeeded, et vous recevez payment.failed puis payment.succeeded. Ne bloquez donc pas une commande pour toujours au premier payment.failed d’une carte : payment.succeeded a toujours le dernier mot. Cela ne concerne que la carte. Un paiement mobile money en failed reste en failed.