Sites Web13 min de lecture

Webhooks de paiement : signature, idempotence et sécurité (guide technique 2026)

Mohamed Bah·Fondateur, Kolonell
10 juin 2026
Partager :
Webhooks de paiement : signature, idempotence et sécurité (guide technique 2026)

Webhooks de paiement : signature, idempotence et sécurité (guide technique 2026)

Sites Web

Pourquoi le webhook est le maillon critique

Un webhook de paiement est l'appel serveur à serveur que le prestataire (Orange Money, Wave, Stripe) envoie à votre backend quand un paiement change de statut. C'est lui, et non la redirection du navigateur, qui fait foi. Un webhook mal sécurisé ouvre la porte aux fausses confirmations de paiement et aux doubles traitements.

Ce guide couvre les quatre piliers d'un webhook robuste : vérification de signature, idempotence, réponse HTTP correcte, et gestion des retries.

Anatomie d'un payload de webhook

Un webhook arrive par une requête POST vers votre endpoint, avec un corps JSON et des en-têtes de signature.

ChampTypeDescription
event_idchaîneIdentifiant unique de l'événement, clé d'idempotence
event_typechaîneType, par exemple payment.succeeded
order_idchaîneRéférence de la commande côté marchand
amountentierMontant en FCFA
statuschaîneSUCCESS, FAILED, PENDING
created_attimestampHorodatage de l'événement
signaturechaîneHMAC du corps, dans l'en-tête

En-têtes à lire

La signature voyage dans un en-tête dédié, souvent accompagné d'un horodatage pour bloquer les attaques par rejeu.

En-têteRôle
X-SignatureHMAC SHA-256 du corps brut
X-TimestampHorodatage d'envoi, pour fenêtre anti-rejeu
Content-Typeapplication/json

Vérification de signature HMAC

La signature prouve que le webhook vient bien du prestataire et que le corps n'a pas été modifié. Le calcul se fait sur le corps brut, jamais sur le JSON re-sérialisé.

  • Récupérer le corps brut de la requête, octet pour octet.
  • Récupérer l'en-tête X-Signature et X-Timestamp.
  • Calculer HMAC SHA-256 du corps avec votre secret de webhook.
  • Comparer en temps constant la signature calculée à celle reçue.
  • Rejeter si l'horodatage est plus vieux que 5 minutes (anti-rejeu).

Erreur classique

Beaucoup de bugs viennent d'un framework qui parse le JSON avant que vous lisiez le corps brut. Re-sérialiser change les espaces et casse le HMAC. Lisez toujours le raw body avant tout parsing.

Idempotence : ne traiter qu'une seule fois

Les prestataires renvoient le même webhook plusieurs fois (retries). Votre logique doit être idempotente : traiter event_id deux fois ne doit jamais débiter deux fois ni livrer deux fois.

StratégieMécanismeAvantage
Clé unique en baseIndex unique sur event_idRejet immédiat des doublons
Verrou par commandeLock sur order_id pendant traitementÉvite les conditions de course
Statut transactionnelTransition PENDING vers PAID atomiquePas de double passage

Le plus simple et robuste : un index unique sur event_id. Si l'insertion échoue pour doublon, renvoyez 200 sans retraiter.

Réponse HTTP et codes de statut

Ce que vous renvoyez décide si le prestataire réessaie ou non. Une mauvaise réponse provoque des retries inutiles ou, pire, la perte de l'événement.

Code renvoyéInterprétation prestataireQuand l'utiliser
200Reçu et traitéSuccès, ou doublon déjà traité
400Requête invalideSignature invalide, payload corrompu
401Non authentifiéSignature absente ou fausse
409ConflitTraitement déjà en cours (optionnel)
500Erreur serveurBug interne, déclenche un retry

Besoin d'un site web professionnel ?

Kolonell crée des sites web qui attirent des clients, optimisés pour le marché sénégalais. Devis gratuit en 2 minutes.

Vous préférez qu’on vous rappelle ?

Laissez votre WhatsApp, un expert Kolonell vous recontacte sous 24h ouvrées. Gratuit et sans engagement.

Vous êtes :

Renvoyez 200 le plus vite possible, puis traitez en arrière-plan si le travail est long. Un webhook qui répond en plus de quelques secondes risque un timeout côté prestataire.

Stratégie de retries

Si vous répondez par une erreur 5xx ou ne répondez pas, le prestataire réessaie selon un backoff exponentiel.

TentativeDélai indicatifAction backend
1immédiatTraiter ou logger l'échec
2environ 1 minuteVérifier idempotence
3environ 5 minutesVérifier idempotence
4environ 30 minutesAlerter le support si toujours en échec
5 et plusjusqu'à 24 hRéconciliation manuelle

Exemple concret

Un client paie une commande de 40 000 FCFA. Le prestataire envoie payment.succeeded. Votre serveur lit le raw body, vérifie le HMAC, contrôle que event_id n'existe pas en base, insère l'événement, passe la commande de PENDING à PAID dans une transaction, puis renvoie 200. Une minute plus tard, un retial dupliqué arrive avec le même event_id : l'insertion échoue sur l'index unique, vous renvoyez 200 immédiatement, aucune double livraison. Total : un seul traitement effectif, zéro double débit.

Checklist sécurité webhook

ContrôleStatut attendu
Vérification HMAC sur raw bodyobligatoire
Comparaison de signature en temps constantobligatoire
Fenêtre anti-rejeu sur l'horodatageobligatoire
Index unique sur event_idobligatoire
Endpoint en HTTPS uniquementobligatoire
Réponse 200 rapide, traitement asyncrecommandé
Journalisation de chaque événementrecommandé

FAQ

Pourquoi ne pas se fier à la redirection du navigateur ?

Parce que le client peut fermer l'onglet ou perdre sa connexion avant le retour. Seul le webhook serveur à serveur garantit que vous êtes notifié du statut réel.

Sur quel contenu calculer le HMAC ?

Sur le corps brut de la requête, octet pour octet, avant tout parsing JSON. Re-sérialiser le JSON change les espaces et invalide la signature.

Comment éviter le double traitement ?

Un index unique sur event_id en base. Si l'événement existe déjà, renvoyez 200 sans retraiter. C'est la méthode la plus simple et la plus fiable.

Que renvoyer si la signature est invalide ?

Un code 401 ou 400, sans traiter l'événement. Ne renvoyez jamais 200 pour un webhook dont la signature ne correspond pas.

Combien de temps un prestataire réessaie-t-il ?

Généralement jusqu'à 24 heures avec un backoff exponentiel. Après échec total, prévoyez une réconciliation manuelle ou un endpoint de rejeu.

Discutons de votre projet. Kolonell construit des backends de paiement sécurisés avec vérification de signature et idempotence par défaut. WhatsApp +221 77 596 93 33.

Tags :#webhooks#paiement#securite#hmac#idempotence#backend#api#integration
Partager :

Mohamed Bah

Fondateur, Kolonell

Passionné par le digital et l'entrepreneuriat en Afrique, Mohamed accompagne les entreprises sénégalaises dans leur transformation digitale depuis 2020. Fondateur de Kolonell, il croit que chaque PME mérite une présence en ligne professionnelle et accessible.