Webhooks (IPN)¶
M-Pay reçoit automatiquement les notifications de paiement (IPN) du prestataire et met à jour les statuts en temps réel. Ce guide explique le fonctionnement et comment intégrer les notifications dans votre PMS.
Fonctionnement¶
Client paie
│
▼
PayZen traite ──► IPN envoyée à M-Pay
│
▼
Vérification HMAC-SHA256
│
▼
Mise à jour du PaymentRequest
│
▼
Email de confirmation (si activé)
│
▼
Votre PMS consulte le statut (polling)
Endpoint IPN¶
L'endpoint IPN est configuré dans votre back-office PayZen :
Configuration PayZen
L'URL de notification doit être configurée dans votre back-office PayZen : Boutique > Paramètres généraux > URL de notification
Sécurité¶
Vérification HMAC-SHA256¶
Chaque notification est vérifiée via une signature HMAC-SHA256 :
- PayZen envoie
kr-answer(données) etkr-hash(signature) - M-Pay recalcule le hash avec la clé HMAC du tenant
- Comparaison timing-safe pour éviter les attaques temporelles
- Si la signature est invalide, la notification est rejetée (HTTP 400)
Protection anti-replay¶
- Les notifications sont traitées de manière idempotente
- Un paiement déjà en statut terminal ne peut pas être modifié
Intégration avec votre PMS¶
Option 1 : Polling régulier (recommandé)¶
La méthode la plus simple. Votre PMS interroge régulièrement l'API M-Pay :
# Toutes les 5 minutes via un cron/scheduler
statuses = sync_payment_statuses(pending_reservation_refs)
for ref, data in statuses.items():
update_pms_reservation(ref, data["status"])
Option 2 : Webhook sortant (futur)¶
En développement
La fonctionnalité de webhook sortant (M-Pay notifie votre PMS) est prévue pour une version future.
Statuts reçus par IPN¶
| Statut PayZen | Statut M-Pay | Signification |
|---|---|---|
AUTHORISED |
AUTHORISED |
Empreinte enregistrée |
AUTHORISED_TO_VALIDATE |
AUTHORISED_TO_VALIDATE |
Pré-autorisation |
CAPTURED |
CAPTURED |
Paiement débité |
REFUSED |
REFUSED |
Refusé par la banque |
CANCELLED |
CANCELLED |
Annulé |
EXPIRED |
EXPIRED |
Expiré |
Données extraites de l'IPN¶
À chaque notification, M-Pay extrait et stocke :
| Donnée | Description |
|---|---|
provider_transaction_id |
UUID de la transaction PayZen |
status |
Statut normalisé |
masked_pan |
Numéro de carte masqué (ex: 497010XXXXXX0014) |
card_expiry_month |
Mois d'expiration |
card_expiry_year |
Année d'expiration |
token |
Alias de carte (pour les empreintes) |
order_cycle |
Cycle de la commande (OPEN / CLOSED) |