Stripe-webhooks: instellen, verifiëren en testen

Gids voor Stripe-webhooks

Stripe-webhooks: endpoint, signature, testen met de CLI | We.Inc

Stel een Stripe-webhookendpoint in, verifieer Stripe-Signature met de raw body, test met stripe listen en stripe trigger, en lever Checkout-orders precies één keer.

Een Stripe-webhook is een HTTPS-endpoint op uw server waar Stripe event-JSON naartoe POST, zoals checkout.session.completed na een betaling. Uw handler moet de Stripe-Signature-header verifiëren tegen de onaangeroerde raw body met het whsec_-secret van het endpoint, snel een 2xx teruggeven en ermee overweg kunnen dat hetzelfde event meer dan eens binnenkomt.

De basis van Stripe-webhooks (gecontroleerd tegen de documentatie van Stripe, oktober 2026)

De meeste kapotte Stripe-integraties gaan mis op een van drie plekken: het framework parste de body vóór de verificatie, de handler deed traag werk en liep in een timeout, of een opnieuw verstuurd event leverde een order twee keer. Deze gids loopt door een handler die alle drie vermijdt, met hieronder een checker die een Stripe-Signature-header in uw browser verifieert, zodat u precies ziet wat de library berekent.

Veelgestelde vragen

Waarom krijg ik "No signatures found matching the expected signature"?

Bijna altijd omdat de body vóór de verificatie is veranderd, bijvoorbeeld door express.json() of een body parser die JSON opnieuw codeert. Koppel express.raw({ type: "application/json" }) alleen aan de webhookroute, of lees request.text() in een Next.js-route-handler. Een verkeerd secret geeft dezelfde melding.

Welke events heb ik nodig voor Stripe Checkout?

checkout.session.completed voor kaartbetalingen, plus checkout.session.async_payment_succeeded voor uitgestelde methodes zoals automatische incasso's. Stripe raadt ook aan checkout.session.async_payment_failed af te handelen, zodat u de klant kunt informeren. Controleer de payment_status van de sessie voordat u levert.

Kan ik op de succespagina vertrouwen in plaats van een webhook?

Nee. De documentatie van Stripe zelf zegt dat een klant kan betalen en het tabblad kan sluiten voordat uw succespagina laadt. Gebruik de succespagina gerust voor een snelle bevestiging, maar de webhook moet de levering ook in gang zetten, en beide paden moeten veilig twee keer kunnen draaien.

Komen Stripe-events op volgorde binnen?

Stripe garandeert geen volgorde. invoice.paid kan binnenkomen vóór customer.subscription.created. Houd event-id's bij om duplicaten te herkennen en haal het bijbehorende object op via de API als u de nieuwste staat nodig hebt.

Hoe verstuur ik een mislukt event opnieuw?

Klik op Resend bij het event in het Dashboard (werkt tot 15 dagen na aanmaak) of voer stripe events resend <event_id> --webhook-endpoint=<endpoint_id> uit met de CLI (tot 30 dagen). Automatische herhaalpogingen lopen hoe dan ook door.

De regel van de raw body

Eerst antwoorden, later werken

Precies één keer leveren

Code van de handler

Express met stripe-node

express.raw is alleen aan deze route gekoppeld, zodat de body constructEvent bereikt als de originele bytes.

Next.js App Router-route-handler

request.text() geeft de ongeparste body. Een fout binnen constructEvent betekent dat de signature of het secret niet klopt.

Testen met de Stripe CLI

Events lokaal doorsturen en afvuren

listen toont een whsec_-secret voor deze sessie. Zet het in uw lokale env en vuur daarna in een tweede terminal events af.

Events die het afhandelen waard zijn

Veelvoorkomende Stripe-eventtypes en wat u ermee doet

Stripe-Signature-checker

Plak een Stripe-Signature-header, de raw body en uw whsec_-secret om dezelfde controle te zien die de libraries uitvoeren. Het draait in uw browser met Web Crypto en verstuurt niets. Gebruik een secret uit test mode, nooit een live secret.

Stripe-Signature-header

Raw request body

Endpoint-secret (whsec_...)

Tolerantie in seconden

Deze body nu ondertekenen

Verifiëren

Resultaat

De header heeft geen t=-timestamp.

De header heeft geen v1=-signature.

Verwachte v1: {v}

De signature klopt.

De signature klopt niet: de body is veranderd of het secret is fout.

De timestamp is {n} seconden oud, binnen de tolerantie.

De timestamp is {n} seconden oud, buiten de tolerantie: een library zou hem weigeren.

Gratis beginnen · Geen creditcard nodig

Gerelateerd: Gidsen

Product

Voor wie

Functies

Bronnen

Bedrijf

Sitemap