Callbacks
PayRouter résout les paiements de façon asynchrone. Lorsqu'un fournisseur confirme
le résultat final, PayRouter fait avancer la transaction dans sa machine à états
puis notifie votre callback_url.
Votre callback marchand
Fournissez callback_url lors de la création d'une transaction. PayRouter y envoie
l'état final en POST :
POST https://your-app/payments/callback
Content-Type: application/json
{
"reference": "<payrouter-reference>",
"merchant_reference": "INV-2026-0001",
"transaction_status": "Success", // ou "Failed"
"amount": "100.00",
"currency": "CDF",
"customer_number": "0810000000",
"provider_reference": "<provider-txn-id>"
}
Répondez 200 OK. Traitez le callback comme idempotent — vous pouvez le
recevoir plusieurs fois pour la même transaction ; indexez votre traitement sur
reference.
Ne faites pas aveuglément confiance aux montants. Re-récupérez
GET /api/payments/transaction/<reference>/pour confirmer le statut faisant autorité avant de libérer des biens ou des fonds.
Webhooks fournisseur → PayRouter (entrants)
PayRouter expose des endpoints vérifiés que les fournisseurs appellent. Vous ne les appelez pas ; ils sont documentés par souci d'exhaustivité. Chacun est vérifié cryptographiquement et échoue en mode fermé (HTTP 401) sur une signature invalide :
| Fournisseur | Endpoint | Vérification |
|---|---|---|
| FreshPay | POST /api/callbacks/freshpay/ | AES-128-CBC + HMAC-SHA256 |
| Unipesa | POST /api/callbacks/unipesa/ | HMAC-SHA512 |
Les callbacks vérifiés sont stockés comme enregistrements RawCallback et traités
de façon asynchrone, ce qui déclenche ensuite votre callback marchand ci-dessus.
Les administrateurs peuvent auditer chaque callback entrant dans le portail admin
(Callbacks).