Les événements payout sont livrés via le même mécanisme de Pulse (webhook) que les
paiements. Enregistrez un endpoint webhook de projet dans le dashboard et abonnez-le aux
déclencheurs payout. Contrairement aux payment intents, les payouts n’ont pas de champ
webhook_url par payout ; la livraison se configure au niveau du projet.
Pour les mécaniques de livraison complètes — nouvelles tentatives, sémantique
at-least-once, livraison signée ou non signée, et comment vérifier l’authenticité — voir
Webhooks paiements. Tout ce qui y est décrit s’applique également
aux événements payout.
Événements
| Événement | Description |
|---|
payout.completed | Le payout a été réglé avec succès au destinataire. |
payout.failed | Le payout a échoué et le montant n’a pas été livré. |
Charge utile
{
"event": "payout.completed",
"payout": {
"id": "po_...",
"amount": { "value": 5000, "formatted": "5,000 XOF", "short": "5K", "currency": "XOF" },
"method": "momo_mtn",
"status": "completed",
"reference": "PO-2026-0001",
"description": "Salary payout",
"customer": { "id": "cus_...", "first_name": "Jane", "last_name": "Doe", "email": "[email protected]" },
"instrument": { "id": "poi_...", "type": "phone", "phone_number": "+22990000000", "country": "BJ" },
"gateway": { "transaction": { "id": "gw_tx_123", "reference": "po_ref_generated", "external_id": null } },
"fee_amount": 0,
"failure": { "code": null, "message": null },
"initiated_at": "2026-06-14T10:00:00+00:00",
"completed_at": "2026-06-14T12:00:00+00:00",
"failed_at": null,
"created_at": "2026-06-14T10:00:00+00:00"
}
}
Patron de handler
$event = json_decode(file_get_contents('php://input'), true);
// Re-récupérez pour obtenir le statut autoritaire — ne faites pas confiance au payload seul.
$payout = $orqex->payouts()->retrieve($event['payout']['id']);
if ($payout->status === 'completed') {
// traitez le payout réussi (de façon idempotente)
}
if ($payout->status === 'failed') {
// gérez l'échec : inspectez $payout->failure
}
http_response_code(200);
Règles de traitement
- Répondez avec 2xx rapidement ; faites le travail lent de façon asynchrone.
- Les événements sont at-least-once — basez votre traitement sur
payout.id + event.
- Re-récupérez toujours le payout depuis l’API et agissez sur ce statut autoritaire.
L’événement payout.completed signale qu’Orqex a vérifié le résultat — pas seulement que la
passerelle a accusé réception de la demande. Vous pouvez agir dessus en toute confiance après
re-récupération.