Stripe-Signature
Signature de l'événement : horodatage t= et une ou plusieurs signatures v1= (HMAC-SHA256 du corps brut avec le secret de signature de l'endpoint).
Collez une URL de capture Tracehook comme endpoint de webhook Stripe et lisez l'événement tel que Stripe l'envoie : header Stripe-Signature, corps JSON brut, en direct. Sans compte, chiffré, effacé après 24 h.
Quatre étapes, aucune configuration côté serveur. Remplacez <domaine> et <votre-id> par les valeurs de votre session.
Créez une URL de capture (bouton ci-dessous). Vous obtenez une adresse de la forme https://<domaine>/h/<votre-id>. Vous pouvez y ajouter un sous-chemin, par exemple /stripe.
Dans le Dashboard Stripe, ouvrez Développeurs → Webhooks (ou Workbench → Webhooks selon la version du dashboard), puis « Ajouter un endpoint ».
Collez l'URL de capture dans le champ « URL de l'endpoint », choisissez les événements à recevoir (par exemple payment_intent.succeeded), puis enregistrez.
Déclenchez un événement en mode test (un paiement de test, ou « Envoyer un événement de test » depuis la page de l'endpoint). La requête apparaît dans votre session Tracehook à l'instant où Stripe l'envoie.
Les headers ci-dessous sont ceux que Stripe documente sur chaque livraison. Tracehook les affiche dans l'ordre reçu, avec le corps brut.
Signature de l'événement : horodatage t= et une ou plusieurs signatures v1= (HMAC-SHA256 du corps brut avec le secret de signature de l'endpoint).
application/json ; le corps est l'objet Event de Stripe.
{
"id": "evt_…",
"object": "event",
"api_version": "…",
"created": 1758190000,
"type": "payment_intent.succeeded",
"livemode": false,
"data": {
"object": {
"id": "pi_…",
"object": "payment_intent",
"…": "…"
}
}
}Ce qui explique la plupart des « le webhook n'arrive pas » ou « signature invalide ».
Stripe signe les octets exacts du corps. Si votre framework parse puis re-sérialise le JSON avant la vérification, la signature échoue. Tracehook conserve le corps brut (onglet Raw) : copiez-le tel quel pour reproduire le calcul.
Le secret de signature (whsec_…) est propre à chaque endpoint, et les modes test et live ont des endpoints distincts. Un 400 « signature invalide » vient le plus souvent d'un secret d'un autre endpoint.
L'URL de capture acquitte chaque événement. Stripe ne le réessaiera donc pas : c'est pratique pour observer, mais ne comptez pas sur les tentatives de renvoi pour tester votre gestion des échecs.
La vérification recommandée par Stripe rejette les événements dont le t= est trop ancien. Si vous rejouez depuis Tracehook (copie en cURL) après un long délai, désactivez cette tolérance dans votre test.
Un endpoint abonné à « tous les événements » reçoit beaucoup de trafic ; seules les 50 dernières requêtes sont conservées par session. Sélectionnez uniquement les types qui vous intéressent.
Pour vérifier que votre URL de capture reçoit bien une requête de cette forme, sans attendre le fournisseur.
curl -X POST https://<domaine>/h/<votre-id>/stripe \
-H 'Content-Type: application/json' \
-H 'Stripe-Signature: t=1758190000,v1=<signature-fictive>' \
-d '{"id":"evt_test","object":"event","type":"payment_intent.succeeded","data":{"object":{"id":"pi_test","object":"payment_intent"}}}'Cette commande imite la forme d'un événement Stripe (valeurs fictives, signature non valide). Pour un vrai événement signé, passez par le Dashboard ou la CLI.
stripe listen --forward-to https://<domaine>/h/<votre-id>/stripe
stripe trigger payment_intent.succeededstripe listen transfère les événements de votre compte test vers l'URL indiquée ; stripe trigger en génère un. Les requêtes transférées portent aussi le header Stripe-Signature.
Une valeur, partout.
Détails sur le chiffrement et la rétention : Sécurité & données. Routes, flux SSE et codes d'erreur : référence API. Autre fournisseur : tester un webhook GitHub.