Tester un webhook Stripe

Tester un webhook Stripe, sans déployer.

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.

  • Stripe-Signature
  • Content-Type

Où coller l'URL

Quatre étapes, aucune configuration côté serveur. Remplacez <domaine> et <votre-id> par les valeurs de votre session.

  1. 1

    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.

  2. 2

    Dans le Dashboard Stripe, ouvrez Développeurs → Webhooks (ou Workbench → Webhooks selon la version du dashboard), puis « Ajouter un endpoint ».

  3. 3

    Collez l'URL de capture dans le champ « URL de l'endpoint », choisissez les événements à recevoir (par exemple payment_intent.succeeded), puis enregistrez.

  4. 4

    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.

À quoi ressemble la requête reçue

Les headers ci-dessous sont ceux que Stripe documente sur chaque livraison. Tracehook les affiche dans l'ordre reçu, avec le corps brut.

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).

Content-Type

application/json ; le corps est l'objet Event de Stripe.

Forme du corps (exemple, valeurs fictives)
{
  "id": "evt_…",
  "object": "event",
  "api_version": "…",
  "created": 1758190000,
  "type": "payment_intent.succeeded",
  "livemode": false,
  "data": {
    "object": {
      "id": "pi_…",
      "object": "payment_intent",
      "…": "…"
    }
  }
}

Pièges fréquents

Ce qui explique la plupart des « le webhook n'arrive pas » ou « signature invalide ».

Vérifier la signature sur le corps brut

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.

Un secret par endpoint et par mode

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.

Tracehook répond toujours 200

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.

Tolérance d'horodatage

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.

Filtrez les événements

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.

Exemple curl

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.

Avec la CLI Stripe

stripe listen --forward-to https://<domaine>/h/<votre-id>/stripe
stripe trigger payment_intent.succeeded

stripe 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.

Limites à connaître

Une valeur, partout.

  • 50dernières requêtes par session
  • 1 Mopar requête, headers compris (413 au-delà)
  • 24 hsans activité, puis tout est effacé

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.

Votre prochain webhook Stripe, vous le lirez en direct.

Sans inscription