Vibe-coding · Les

Betalingen veilig verifiëren

Vertrouw op de server, niet op de client.

Les 4 van 413 stappen

Betalingen veilig verifiëren is een gratis Vibe-coding-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Vibe-coding. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Vibe-coding bevat in totaal 4 lessen.

Vertrouw niets van de client

De gouden regel voor betaalbeveiliging: de client kan liegen. Een succespagina, een queryparameter of een JavaScript-callback — een vastberaden gebruiker kan ze allemaal vervalsen of opnieuw afspelen.

Toegang en levering van het product moeten worden bepaald door signalen die je cryptografisch kunt vertrouwen en die afkomstig zijn van de servers van de aanbieder, nooit van de browser van de gebruiker.

Webhooksignaturen verifiëren

Webhooks komen binnen op een openbare URL, dus iedereen zou er valse evenementen naartoe kunnen sturen. Aanbieders ondertekenen elke webhook met een geheim dat alleen jij en de aanbieder kennen.

Controleer altijd de handtekening voordat je de inhoud vertrouwt. Een verzoek zonder handtekening of met een onjuiste handtekening moet direct worden geweigerd — met deze ene controle blokkeer je de meest voorkomende betaalexploit.

Write a webhook endpoint that verifies the Stripe-Signature header using my webhook signing secret before processing the event. If verification fails, return 400 and do nothing. Explain exactly what attack this prevents.

Het bedrag en de valuta controleren

Zelfs een echt, ondertekend evenement moet je vergelijken met wat je verwacht. Controleer of het bedrag en de valuta overeenkomen met wat de bestelling had moeten kosten.

Als een bestelling van $9 een betaling van $0.50 meldt, wijs je die af. De handtekening bewijst dat het bericht van de aanbieder komt; de bedragcontrole bewijst dat de klant heeft betaald wat verschuldigd is.

In my checkout.session.completed handler, after verifying the signature, look up the expected price for the order from my database and confirm the paid amount and currency match before granting access. Show the rejection path if they differ.

Idempotente webhookverwerking

Aanbieders leveren webhooks ten minste één keer af, dus dubbele leveringen zijn normaal. Als je verwerker tegoeden toekent of een abonnement verlengt, kan het tweemaal verwerken van hetzelfde evenement echte schade veroorzaken.

Sla elke verwerkte evenement-ID op en sla herhalingen over. Zorg dat je verwerker een willekeurig aantal keer veilig voor hetzelfde evenement kan worden uitgevoerd.

Make my webhook handler idempotent: store each processed event ID in a table, and at the start of the handler skip any event ID already seen. Show the race-safe insert so two simultaneous deliveries can't both process the event.

Verifieer, neem niets aan

Verificatie betekent dat je het record van de aanbieder vergelijkt met je eigen record. Haal het gezaghebbende object op — de betaalintentie of het abonnement — en vergelijk de status ervan met wat je verwacht voordat je actie onderneemt.

Door de gegevens opnieuw op te halen via de API van de aanbieder in de verwerker, verklein je het verschil tussen een mogelijk verouderd evenement en de actuele werkelijkheid.

After receiving a payment webhook, re-fetch the PaymentIntent from Stripe by ID and confirm its status is 'succeeded' before fulfilling, rather than trusting the event payload alone. Explain when the live object and the event can disagree.

Reageer snel, verwerk veilig

Aanbieders verwachten snel een 2xx-antwoord; anders proberen ze het opnieuw, waardoor dubbele leveringen ontstaan. Bevestig de ontvangst meteen en voer zwaar werk daarna asynchroon uit.

Het patroon: controleer de handtekening, zet het evenement in de wachtrij en geef 200 terug. Een achtergrondwerker voert de levering uit. Zo blijft het eindpunt betrouwbaar bij hoge belasting en tijdens trage bewerkingen.

Refactor my webhook so it verifies the signature, pushes the event onto a job queue, and immediately returns 200. A separate worker does fulfilment. Explain why slow inline processing causes Stripe to retry and create duplicates.

Houd geheimen uit je code

API-sleutels, webhookgeheimen en ondertekeningssleutels zijn inloggegevens. Als je ze hardcodeert in de broncode of naar de client meestuurt, wacht er een beveiligingslek om te gebeuren.

Sla ze op in omgevingsvariabelen of een geheimenbeheerder. De geheime sleutel mag alleen op je server staan; de client krijgt de publiceerbare sleutel, die veilig openbaar kan zijn.

Audit my payment integration for leaked secrets: confirm the secret key and webhook signing secret are read from environment variables and never bundled into client code. Show the correct split between publishable and secret keys.

Terugbetalingen en geschillen afhandelen

Geldstromen lopen ook terug. Een terugbetaling of een geschil over een afschrijving moet de toegang intrekken of de toegangsrechten aanpassen, aangestuurd door webhookevenementen zoals charge.refunded en charge.dispute.created.

Als je alleen de betaling afhandelt en de terugboeking negeert, houdt een klant die geld heeft teruggekregen gratis toegang tot betaalde functies. Verbind de terugkerende evenementen net zo zorgvuldig als de heenweg.

Handle charge.refunded and charge.dispute.created webhooks: when a payment is reversed, revoke the matching entitlement and log it. Show how to find which user and order the refund corresponds to so I revoke the right access.

Logboekregistratie en controle

Wanneer er geld bij betrokken is, heb je een onveranderlijk spoor nodig. Leg elke ontvangen webhook, elke beslissing over productlevering en elke wijziging van toegangsrechten vast met tijdstempels en ID's.

Dit controlelogboek is je verdediging bij een geschil en je snelste hulpmiddel bij het opsporen van fouten wanneer een klant zegt: "Ik heb betaald, maar heb geen toegang". Leg nooit onbewerkte kaartgegevens vast, alleen verwijzingen.

Veilig falen

Wanneer verificatie mislukt — door een onjuiste handtekening, een niet-overeenkomend bedrag of een onbekende bestelling — is de veilige standaardinstelling toegang weigeren en jezelf waarschuwen, niet het voordeel van de twijfel geven.

Een betaalsysteem moet gesloten falen. Een vals-negatieve uitkomst ergert één klant die je handmatig kunt helpen; een vals-positieve uitkomst geeft je product weg of nodigt uit tot fraude.

Review my webhook handler's failure paths and make it fail closed: any verification or lookup failure denies access, logs the incident, and alerts me, rather than defaulting to granting access. List every branch that could accidentally grant access on error.

Een verificatiechecklist

Controleer voordat je live gaat de hele keten: handtekening geverifieerd, bedrag en valuta komen overeen, evenement idempotent verwerkt, object van de aanbieder vergeleken, geheimen in de omgeving, terugbetalingen afgehandeld en fouten leiden tot gesloten falen.

Vraag je AI-assistent om de integratie aan de hand van deze lijst te controleren. Elk ontbrekend item is een deur waar een aanvaller of fout doorheen kan lopen.

Audit my entire payment integration against this checklist and report any gaps: webhook signature verified, amount and currency validated, idempotent event handling, provider-side reconciliation, secrets in environment variables, refund and dispute handling, and fail-closed on errors.

Korte controle

Controleer wat elke webhookverwerker als eerste moet doen.

Samenvatting

Veilige verificatie betekent dat je alleen de ondertekende signalen van de aanbieder aanvaardt. Controleer de handtekening van elke webhook, controleer daarna het bedrag en de valuta, verwerk evenementen idempotent en vergelijk ze met het actuele object van de aanbieder voordat je toegang verleent.

Bewaar geheimen in omgevingsvariabelen, reageer snel en verwerk asynchroon, handel terugbetalingen en geschillen af door toegang in te trekken, leg een controlespoor vast en laat het systeem altijd gesloten falen. Doorloop de volledige checklist voordat je live gaat.

Gratis beginnen

Leer JavaScript met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
25
Lessen
100

Veelgestelde vragen

Is de les “Betalingen veilig verifiëren” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad Vibe-coding, waaronder “Betalingen veilig verifiëren”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Vibe-coding bevat in totaal 4 lessen.

Wat leer ik in “Betalingen veilig verifiëren”?

Vertrouw op de server, niet op de client. Je oefent met Vibe-coding door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Vibe-coding te beginnen?

Ervaring vooraf is niet nodig. Vibe-coding op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Betalingen veilig verifiëren”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Vibe-coding?

Ja. Elke les over Vibe-coding bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Betaalconcepten
  2. Een checkout instellen
  3. Abonnementen beheren
  4. Betalingen veilig verifiëren
← Terug naar Vibe-coding