Skip to main content
Une URL de webhook est publique : n’importe qui peut lui envoyer une fausse requête. Vérifiez donc la signature avant de traiter un événement.

Principe

Chaque requête porte l’en-tête MercyPay-Signature :
  • t est l’heure d’envoi, en secondes depuis 1970 ;
  • v1 est le HMAC-SHA256 en hexadécimal de la chaîne {t}.{corps brut}, calculé avec le secret de l’endpoint.
Pour vérifier :
  1. Lisez le corps tel qu’il est reçu, en octets, sans le parser.
  2. Refusez la requête si t a plus de 5 minutes d’écart avec votre horloge : une requête ancienne rejouée est ainsi rejetée.
  3. Calculez le HMAC-SHA256 de {t}.{corps brut} avec votre secret.
  4. Comparez-le à temps constant avec chaque valeur v1 de l’en-tête. Une seule doit correspondre.

Exemple en PHP

Le même contrôle en JavaScript et en Python est dans Gérer les webhooks.

Autres en-têtes

Changer de secret

Régénérez le secret depuis l’onglet Webhooks de la console Développeurs, ou avec POST /api/v1/webhook_endpoints/{id}/rotate_secret. Pendant 24 heures, chaque webhook porte deux v1 : un calculé avec le nouveau secret, un avec l’ancien. Votre serveur continue donc d’accepter les webhooks, quel que soit le secret qu’il utilise, le temps de déployer le nouveau.

Bonnes pratiques

  • Gardez le secret dans votre gestionnaire de secrets, jamais dans le code.
  • Refusez tout événement dont la signature ne correspond pas.
  • Gardez votre horloge à l’heure (NTP) : la tolérance est de 5 minutes.
  • Ne vous fiez pas à l’ordre d’arrivée : utilisez le status de la ressource.
  • Si un secret fuite, régénérez-le sans attendre.