Terug naar Blog
Dubbele betaalwebhooks: checklist voor één levering
Facturatie

Dubbele betaalwebhooks: checklist voor één levering

Verwerk dubbele PayRequest-betaalwebhooks met transactie-ID, bodyhandtekening en duurzaam takenregister. Controleer één levering met vijf testscenario’s.

4 oktober 20265 min lezen
P
PayRequest Team
Redactie productworkflows

Een dubbele betaalwebhook hoort voor dezelfde geverifieerde transactie één bedoelde leveringshandeling op te leveren. Controleer bij PayRequest payment.succeeded eerst de handtekening over de oorspronkelijke body en gebruik daarna transactie-ID data.id in een duurzame verwerkingssleutel. Een herhaalde melding mag geen extra levering of servicetegoed maken.

Dit is een ontwerp- en acceptatiechecklist voor ontwikkelaars met een eigen leveringssysteem. Een databaserecord garandeert op zichzelf geen precies-eenmaalhandeling in een extern systeem.

Controleer het echte webhookcontract

De PayRequest-webhookdocumentatie beschrijft HTTPS POST, X-PayRequest-Signature en HMAC-SHA256 over de oorspronkelijke requestbody. Gebruik een serversecret en tijdveilige vergelijking. Controleer formaat en lengte van de header: sommige vergelijkingsfuncties weigeren ongelijke lengtes. Bewaar de oorspronkelijke bytes voordat JSON wordt verwerkt.

Bij payment.succeeded is data.id het transactie-ID. De gepubliceerde betaalpayload documenteert geen apart event-ID op het hoogste niveau. Kopieer dus geen event.id-aanpak van een andere provider zonder controle. Houd secrets uit browsercode en log niet onnodig volledige klantgegevens.

Identificeer de betaling, niet de link

Een voorbeeldsleutel is integration-account / payment.succeeded / data.id. Neem accountscope op wanneer meerdere zakelijke accounts dezelfde ontvanger gebruiken. Dit is een eigen ontwerp, geen ingebouwd PayRequest-veld.

Een payment_link_id kan bij meerdere geldige betalingen horen. E-mail, bedrag en omschrijving zijn evenmin goede unieke sleutels: dezelfde klant kan tweemaal kopen. Dezelfde data.id vraagt herhalingsverwerking; een nieuwe data.id op dezelfde link is een nieuwe betaling.

Koppel de transactie via een gecontroleerde integratiereferentie aan een echte order of aanspraak. Een succesmelding bepaalt niet vanzelf pakket, periode of hoeveelheid. Zet onbekende referenties apart voor beoordeling.

Vergelijk bedrag en valuta met de bedoelde order voordat je levering toestaat. Onverwachte waarden vragen beoordeling in plaats van automatische levering.

Sla duurzaam op vóór bevestiging

Gebruik een unieke databaseconstraint en één atomaire transactie voor de geaccepteerde betaling en één wachtende leveringstaak. Een duurzame outbox scheidt ontvangst van langzaam werk. Bevestig succesvol na duurzame acceptatie; een bekende herhaling maakt geen nieuwe taak.

PayRequest accepteert 2xx. De docs noemen vijf pogingen voor depositwebhooks, maar voor betalingen alleen het bestaande queuebeleid zonder aantal. Gebruik het depositschema niet als betaalretrybeleid of bewaartermijn voor deduplicatie.

Crashes blijven mogelijk: een externe levering kan slagen voordat de worker voltooiing opslaat. Gebruik ondersteunde downstream-idempotentie of verifieer het externe resultaat vóór opnieuw leveren. Het lokale register garandeert geen precies-eenmaaluitkomst tussen systemen.

Voer deze originele replaymatrix uit

Test in een geïsoleerde ontvanger met fictieve, ondertekende gegevens en zonder echte levering. Onderteken fixtures met een testsecret; een gewijzigde body vraagt een nieuwe handtekening. Dit zijn voorgestelde tests, geen productieaccounttests.

TestInvoerVereiste uitkomst
HerhalingDezelfde transactie tweemaalEén betaling en één taak
GelijktijdigheidTwee geldige kopieën tegelijkUnieke constraint voorkomt twee taken
Tweede aankoopZelfde link, nieuw transactie-IDTwee betalingen en taken
VervalsingGewijzigde body, oude handtekeningAfwijzing vóór levering
WorkeronderbrekingCrash na duurzame taakopslagWachtend werk herstelbaar

Test ook onbekende referenties en ongeldige handtekeninglengtes. Tel opgeslagen records en externe handelingen apart. HTTP 200 bevestigt ontvangst, geen afgeronde levering.

Stem geld en levering afzonderlijk af

Bewaar transactie-ID, accountscope, verwerkingsstatus, taak-ID en externe resultaatreferentie. Onderzoek betaalde transacties met wachtende levering via dezelfde gecontroleerde route, zonder handmatige tweede levering buiten het register.

Begin met de PayRequest API-documentatie. Bekijk Betalingen matchen voor financiële afstemming; betaling en levering zijn afzonderlijke records.

Redactionele toelichting: AI hielp bij artikel en cover. Contract gecontroleerd op 4 oktober 2026. Sleutel, matrix en architectuur zijn originele aanbevelingen, geen productie-integratietest of leveringsgarantie.

Deel dit artikel