Hoe maak je een betaling of WhatsApp webhook idempotent?
Share

In this article
Ken elke webhook een unieke ID toe van de afzender, zoals een order-ID of bericht-ID, en voer de bijbehorende acties slechts één keer uit. Een herhaalde levering vindt de ID al verwerkt en doet niets. Publiceer het echte werk naar een wachtrij in plaats van het inline te doen, zodat de afzender niet hoeft te wachten.
Waarom komen webhooks meer dan eens aan?
Afzenders proberen opnieuw bij time-outs, netwerkstoringen en niet-2xx reacties, en geven de voorkeur aan tweemaal leveren boven helemaal niet leveren. Betaalplatforms en WhatsApp doen dit beide. Een handler die bij elke levering actie onderneemt, zal dubbele tickets uitgeven, een boekingsbevestiging twee keer versturen of twee keer kosten in rekening brengen.
Wat moet de idempotentie-sleutel zijn?
Gebruik de identificatie die de afzender garandeert stabiel te zijn bij herhaalde pogingen: de order-ID voor betaalwebhooks, de bericht-ID voor WhatsApp. Sla verwerkte sleutels op en controleer voordat je actie onderneemt. Een sleutel die je zelf per levering genereert werkt niet, omdat elke retry dan als een nieuw event wordt gezien.
Waarom publiceren naar een wachtrij in plaats van het werk in de handler te doen?
Het inline genereren van een ticket en versturen van een e-mail zorgt ervoor dat het platform moet wachten op werk waar het niet om geeft, wat time-outs en meer retries uitlokt. Bevestig snel, publiceer een payment-confirmed event naar RabbitMQ, en laat een consumer het werk doen. Een herhaalde levering publiceert slechts één keer; de tweede is een no-op.
Waar wordt dit in productie gebruikt?
Bij FindYourVibe is de betaalwebhook idempotent op order-ID en publiceert naar RabbitMQ voordat een consumer het ticket uitgeeft. Bij Trexind is elke WhatsApp webhook handler idempotent op bericht-ID, zodat een herhaalde levering de status één keer bijwerkt in plaats van boekings- of factureringsacties opnieuw te triggeren.
Hoe test je dat een webhook idempotent is?
Stuur dezelfde payload twee keer, bij voorkeur gelijktijdig, en controleer dat het bijeffect slechts één keer plaatsvond: één ticket, één boeking, één betaling. Speel daarna een oude payload af nadat de eerste volledig is verwerkt. Als een telling hoger is dan één, is de sleutelcontrole aan het racen of ontbreekt een unieke beperking.
Oorspronkelijk gepubliceerd op sakshamjain.codes/blog/idempotent-payment-and-whatsapp-webhooks. Heb je dit nodig? Bekijk mijn diensten op NexoRush of stuur me een bericht.