Webhooks PawaPay
Locayo utilise PawaPay comme passerelle de paiement mobile money. Lorsqu’un paiement est effectue (depot, remboursement ou commission), PawaPay envoie un callback HTTP (webhook) a Locayo pour confirmer le statut de la transaction.Les webhooks sont traites de maniere asynchrone via Celery. Le endpoint repond immediatement a PawaPay avec
{"status": "received"} puis delegue le traitement en arriere-plan. Cela garantit que Locayo repond en moins de 200ms, meme en cas de charge elevee.Architecture du flux webhook
Flux de confirmation de depot (loyer)
Lorsqu’un locataire paie son loyer via mobile money, le flux suivant se deroule :Le locataire initie le paiement
Depuis le portail locataire ou a la demande du bailleur, le locataire saisit son numero de telephone et son operateur (MTN, Orange, Wave).
PawaPay envoie un USSD Push
PawaPay envoie une requete USSD au telephone du locataire. Celui-ci valide avec son code PIN.
PawaPay envoie le callback
Une fois la transaction confirmee, PawaPay envoie un callback HTTP a l’endpoint
/api/v1/payments/webhooks/pawapay avec le statut COMPLETED.Locayo verifie la signature
Le callback est authentifie via la signature RFC-9421 incluse dans les en-tetes HTTP. Si la signature est invalide, le webhook est rejete avec un statut 403.
Flux de remboursement (caution)
Le remboursement de la caution utilise le systeme de payout PawaPay : Les payouts sont utilises dans deux cas :| Cas d’usage | Description |
|---|---|
| Remboursement de caution | La caution est renvoyee au locataire a la resiliation du bail |
| Liberation d’escrow | Les fonds reserves pour un service marketplace sont liberes vers le prestataire (87,5%) apres validation du travail |
Detection des paiements de commission
Lorsqu’un webhook est recu, Locayo identifie automatiquement le type de paiement :Verification escrow marketplace
Le systeme verifie d’abord si le
depositId correspond a un depot d’escrow marketplace (cle Redis pawapay_escrow:{depositId}). Si oui, le statut du job passe a ESCROW_FUNDED et le prestataire est notifie.Verification commission
Ensuite, le systeme verifie si le
depositId correspond a une facture de commission (pawapay_deposit_ref). Si oui, la facture est marquee comme payee et le bailleur recoit une notification.Idempotence et gestion des doublons
Locayo garantit que chaque paiement n’est traite qu’une seule fois, meme si PawaPay envoie le meme callback plusieurs fois :- Cle unique : chaque transaction est identifiee par son
depositId(UUID genere par Locayo a l’initiation) - Verification en base : avant d’enregistrer un paiement, Celery verifie qu’aucun paiement avec le meme
mobile_money_refn’existe deja - Traitement unique : si un doublon est detecte, le traitement est silencieusement ignore (
returnsans erreur)
L’idempotence est essentielle car PawaPay peut renvoyer un callback en cas de timeout reseau ou de retry automatique. Le systeme ne cree jamais de doublon dans l’historique des paiements.
Seuls les depots COMPLETED sont traites
Le endpoint webhook ne declenche le traitement Celery que pour les depots au statutCOMPLETED. Les autres statuts (PENDING, FAILED, REJECTED) sont enregistres dans les logs mais ne declenchent aucune action.
| Statut PawaPay | Action Locayo |
|---|---|
| COMPLETED | Traitement complet : enregistrement, recu, notification |
| FAILED | Log uniquement. Aucun enregistrement |
| REJECTED | Log uniquement. Aucun enregistrement |
Securite
- Signature RFC-9421 : chaque callback PawaPay est signe cryptographiquement. Locayo verifie la signature avant tout traitement
- Rate limiting : le endpoint webhook est limite a 20 requetes par minute pour prevenir les abus
- HTTPS obligatoire : les callbacks PawaPay sont toujours envoyes via HTTPS