Contenu des webhooks
Chaque webhook est une requête POST dont le corps JSON décrit le paiement, clés par ordre alphabétique. Vérifiez sa signature sur le corps brut, avant de le décoder.
payment.updated
{
"amount": "5000.00",
"created_at": "2026-11-06T10:15:30+00:00",
"currency": "XOF",
"description": "Commande #1234",
"event": "payment.updated",
"failure_message": "",
"link_metadata": {"order_id": "1234"},
"link_title": "Commande #1234",
"metadata": {},
"payment_id": "3f2a9c1e-5b7d-4e8a-9c21-7d4e5f6a8b90",
"phone": "22670123456",
"provider": "orange_bf",
"reference": "8d1c3b2a-7e6f-4a5b-9c8d-0e1f2a3b4c5d",
"status": "SUCCEEDED",
"test": false
}
| Champ | Type | Description |
|---|---|---|
event | texte | Toujours payment.updated |
payment_id | identifiant | Identifiant du paiement, pour GET /api/v1/payments/{id}/ |
status | texte | SUCCEEDED, PENDING, CANCELED, FAILED ou EXPIRED (voir ci-dessous) |
amount | texte décimal | Montant payé par le client, avant commission |
currency | texte | XOF |
phone | texte | Numéro du client, format international sans « + » |
provider | texte | orange_bf, moov_bf ou sank_money_bf |
reference | texte | Paiement direct : votre reference. Lien de paiement : identifiant interne de la visite |
description | texte | Description du paiement ou titre du lien |
metadata | objet | Paiement direct : votre metadata |
link_title | texte | Lien de paiement uniquement : titre du lien |
link_metadata | objet | Lien de paiement uniquement : les metadata du lien (votre identifiant de commande) |
failure_message | texte | Raison d'un échec, vide sinon |
test | booléen | true pour un paiement simulé ou un webhook de test |
created_at | date | Création du paiement (ISO 8601) |
Retrouver la commande
Paiement direct : utilisez reference. Lien de paiement : utilisez link_metadata, où vous avez placé votre identifiant de commande à la création du lien.
Statuts
| Statut | Signification | Définitif | Action |
|---|---|---|---|
SUCCEEDED | Paiement confirmé, argent encaissé | oui | Valider la commande |
PENDING | En attente de la confirmation du client | non | Attendre |
CANCELED | Refusé par l'opérateur ou abandonné | oui | Proposer un nouvel essai |
FAILED | Échec technique | oui | Proposer un nouvel essai |
EXPIRED | Aucune confirmation dans l'heure | oui | Proposer un nouvel essai |
Avant d'expirer, un paiement en attente est vérifié auprès de l'opérateur : si le client a bien payé, il passe en SUCCEEDED, jamais en EXPIRED.