Gidsen

Betalingen toevoegen aan je app: checkout, abonnementen en webhooks

De eenvoudigste manier om betalingen aan je app toe te voegen is Stripe. Gebruik een Payment Link als je alleen een knop "Koop" nodig hebt en bestellingen met de hand kunt afhandelen. Gebruik Stripe Checkout als je app moet weten wie heeft betaald en automatisch moet reageren. Gebruik Checkout in abonnementsmodus plus het klantenportaal van Stripe voor terugkerende facturering. In alle gevallen behalve de simpelste heb je ook een webhook nodig: een serverendpoint dat Stripe aanroept als een betaling is gelukt. Test alles met de testsleutels en testkaarten van Stripe voordat je overschakelt naar live sleutels.

Deze gids legt elke optie uit, het webhookdeel dat de meeste tutorials overslaan, en wat je moet controleren voordat je echt geld ontvangt. De Stripe-details komen uit de eigen documentatie van Stripe, stand september 2026.

Waarom je überhaupt een betaalprovider gebruikt

Verzamel nooit kaartnummers in je eigen formulieren. Ruwe kaartgegevens verwerken valt onder PCI DSS (de beveiligingsstandaard van de kaartensector) en is een serieus risico. Een betaalprovider zoals Stripe hostt het betaalformulier, bewaart de kaart, regelt de authenticatie bij de bank, en vertelt je app het resultaat. Je app ziet alleen "klant X heeft betaald voor Y".

Deze gids gebruikt Stripe omdat het veel gebruikt wordt, goed gedocumenteerd is en door de meeste AI-app-builders wordt ondersteund. Er zijn andere providers, en sommige fungeren als "merchant of record" die de btw-afhandeling voor je overnemen. Als belastingnalevingen je zorgen baren, is dat model het vergelijken waard.

De drie manieren om met Stripe betalingen te ontvangen

OptieCode nodigWeet je app wie heeft betaald?Geschikt voor
Payment LinksGeenAlleen als je een webhook toevoegtEen paar vaste producten verkopen, donaties, vraag testen
Checkout (eenmalig)Servercode om een sessie aan te makenJa, via een webhookWinkels, betaalde downloads, eenmalige aankopen
Checkout (abonnement)Servercode plus webhookafhandelingJa, via een webhookSaaS, lidmaatschappen, alles met herhaalde betalingen

Payment Links

Een Payment Link is een betaalpagina die door Stripe wordt gehost en die je zonder code maakt in het Stripe-dashboard. Je krijgt een URL die je achter een knop in je app kunt zetten, in een e-mail kunt delen of als QR-code kunt tonen. Volgens de documentatie van Stripe kun je met Payment Links een product, een abonnement of een donatie verkopen. Je kunt klanten laten kiezen wat ze betalen, of het aantal aankopen beperken.

Het nadeel: je app weet niet automatisch dat een bepaalde ingelogde gebruiker heeft betaald. Voor een donatiepagina of een kleine shop waarin je bestellingen met de hand verwerkt op basis van de e-mails van Stripe, is dat prima. Voor "betaal om de Pro-functies te ontgrendelen" is het niet geschikt.

Stripe Checkout

Checkout is een betaalpagina die je server op aanvraag maakt voor een specifieke aankoop. Je server vertelt Stripe wat er wordt gekocht (en optioneel welke klant koopt), Stripe geeft een URL terug, en die stuur je naar de klant. Stripe beschrijft het als ondersteuning voor zowel eenmalige als abonnementsbetalingen, als volledig door Stripe gehoste pagina, een pagina ingebed in je site, of een ingebed formulier.

De stroom:

  1. De klant klikt op Kopen in je app.
  2. Je server maakt met je geheime sleutel een Checkout-sessie aan, met een ID dat de sessie koppelt aan je gebruiker of bestelling.
  3. De klant wordt naar Stripe doorgestuurd en betaalt.
  4. Stripe stuurt de klant terug naar je succespagina.
  5. Stripe stuurt een checkout.session.completed-gebeurtenis naar je webhook, en je server markeert de bestelling als betaald of ontgrendelt de toegang.

Stap 2 moet op de server gebeuren, omdat die je geheime sleutel gebruikt. Dat is de belangrijkste reden dat Checkout een backend nodig heeft.

Abonnementen

Abonnementen gebruiken Checkout in abonnementsmodus met een terugkerende prijs die je in Stripe instelt. De eerste betaling werkt zoals de stroom hierboven. Daarna gebeuren verlengingen, mislukte kaarten, upgrades en opzeggingen na verloop van tijd, vaak terwijl de klant niet in je app zit. Je app hoort daar alleen via webhooks van.

Voor klanten die hun eigen abonnement willen beheren, biedt Stripe een gehost klantenportaal. Volgens de documentatie van Stripe kunnen klanten daar betaalmethoden en factuurgegevens bijwerken, abonnementen wijzigen of opzeggen, en facturen bekijken en downloaden. Je stelt het in via het Stripe-dashboard en voegt een knop "Facturatie beheren" toe die de klant naar het portaal stuurt. Zo bouw je die schermen niet zelf.

Webhooks: het deel dat je niet kunt overslaan

Een webhook is een HTTP-verzoek dat Stripe naar je server stuurt als er iets gebeurt. (Zie wat is een webhook voor het algemene idee.) De fulfilmentgids van Stripe is duidelijk: je kunt bestellingen niet alleen op de succespagina afhandelen, omdat een klant kan betalen en daarna de verbinding verliezen voordat die pagina laadt. Voor abonnementen en vertraagde betaalmethoden zijn webhooks verplicht.

Gebeurtenissen die je moet afhandelen

GebeurtenisWat die betekentWat je app doet
checkout.session.completedCheckout is afgerondDe bestelling als betaald markeren of toegang geven
checkout.session.async_payment_succeededEen vertraagde methode (zoals een bankafschrijving) is later geslaagdNu afhandelen
checkout.session.async_payment_failedDie vertraagde betaling is misluktDe klant informeren; niet afhandelen
invoice.paidEen abonnementsbetaling is geslaagd, inclusief verlengingenToegang verlengen
invoice.payment_failedEen verlenging is misluktDe gebruiker waarschuwen; Stripe kan opnieuw proberen
customer.subscription.updatedAbonnement gewijzigd, of opzegging geplandHet abonnement van de gebruiker bijwerken
customer.subscription.deletedAbonnement beëindigdBetaalde toegang verwijderen

Regels voor een correcte webhook-handler

Deze komen rechtstreeks uit de webhookdocumentatie van Stripe. AI-gegenereerde handlers missen soms een van deze regels:

  • Controleer de handtekening. Elke gebeurtenis bevat een Stripe-Signature-header. Je handler controleert die met het ondertekeningsgeheim van het endpoint (dat begint met whsec_). Zonder dit kan iedereen een nepbericht "betaling geslaagd" naar je server sturen.
  • Gebruik de ruwe requestbody. Handtekeningcontroles mislukken als je framework de body eerst parseert of aanpast.
  • Geef snel een 2xx-antwoord en doe het zwaardere werk daarna. Time-outs tellen als fouten.
  • Behandel duplicaten. Stripe kan dezelfde gebeurtenis meer dan eens afleveren. Sla verwerkte gebeurtenis-ID's op, of maak de afhandeling veilig om twee keer uit te voeren.
  • Ga niet uit van volgorde. Stripe garandeert niet dat gebeurtenissen in de volgorde van ontstaan aankomen.
  • Reken op herhalingen. In de live-modus probeert Stripe mislukte afleveringen tot drie dagen opnieuw, dus een korte storing kost geen betalingen. Maar je handler moet met late gebeurtenissen overweg kunnen.

Webhooks hebben een publiek HTTPS-adres nodig, dus ze werken meestal pas als je app gepubliceerd is. (De CLI van Stripe kan gebeurtenissen voor ontwikkelaars naar een lokale machine doorsturen.)

Een prompt die de hele stroom dekt

Voeg een eenmalige aankoop toe met Stripe Checkout voor het "Pro-pakket" (prijs-ID in STRIPE_PRICE_ID). Maak de Checkout-sessie op de server aan met STRIPE_SECRET_KEY uit de geheimen, en neem de ID van de ingelogde gebruiker op in de sessie. Voeg een endpoint POST /api/stripe/webhook toe dat de Stripe-handtekening controleert met STRIPE_WEBHOOK_SECRET op basis van de ruwe requestbody, checkout.session.completed afhandelt, en die gebruiker markeert als eigenaar van het Pro-pakket. Zorg dat het veilig is als dezelfde gebeurtenis twee keer binnenkomt. Voeg succes- en annuleringspagina's toe. Stel de geheime sleutel nooit bloot aan de browser.

Voor abonnementen voeg je toe: "Gebruik de abonnementsmodus met STRIPE_PRICE_ID. Verwerk invoice.paid, invoice.payment_failed, customer.subscription.updated en customer.subscription.deleted. Voeg een knop Facturatie beheren toe die het klantenportaal van Stripe opent."

Testmodus

Stripe heeft aparte sandbox-(test)- en livemodi met aparte sleutels. Sandboxsleutels beginnen met pk_test_, sk_test_ of rk_test_; livesleutels beginnen met pk_live_, sk_live_ of rk_live_. Testtransacties verplaatsen geen geld.

Nuttige testkaarten uit de testdocumentatie van Stripe (elke toekomstige vervaldatum, elke cvc van drie cijfers):

KaartnummerResultaat
4242 4242 4242 4242Betaling geslaagd
4000 0000 0000 0002Kaart geweigerd
4000 0000 0000 3220Vereist 3D Secure-authenticatie, daarna geslaagd

Test minimaal het volgende:

  • Een geslaagde betaling ontgrendelt het juiste ding voor de juiste gebruiker
  • Een geweigerde kaart toont een duidelijke melding en ontgrendelt niets
  • Het browsertabblad direct na betalen sluiten geeft toch toegang (dit bewijst dat de webhook werkt, niet alleen de succespagina)
  • Annuleren op de Stripe-pagina brengt de gebruiker terug naar je app zonder kosten
  • Bij abonnementen: opzeggen in het klantenportaal en controleren dat de toegang stopt wanneer dat hoort

Live gaan

  1. Activeer je Stripe-account met je bedrijfs- en bankgegevens.
  2. Zet live sleutels in bij de geheimen van je app. Stripe raadt beperkte sleutels aan met alleen de rechten die je integratie nodig heeft, in plaats van een onbeperkte geheime sleutel.
  3. Maak een live webhook-endpoint aan dat naar je gepubliceerde app wijst. Het heeft een eigen ondertekeningsgeheim, anders dan het testgeheim. Werk dat bij.
  4. Maak producten en prijzen opnieuw aan in de live-modus; test-ID's bestaan daar niet.
  5. Doe één echte kleine aankoop en restitueer die.

Bewaar elke sleutel in de geheimen van je project, nooit in code of in de chat. Onze beveiligingschecklist behandelt sleutels en webhookverificatie uitgebreider.

Belasting, terugbetalingen en administratie

Betalingen brengen verplichtingen met zich mee die code niet oplost. Dit is geen belastingadvies; overleg met een accountant.

  • Omzetbelasting, btw en GST. Afhankelijk van waar jij en je klanten zitten, moet je je misschien registreren, belasting heffen en aangifte doen. Stripe Tax kan belasting berekenen en innen bij het afrekenen, bijhouden waar je verkopen een verplichting kunnen opleveren, en helpen met registraties en aangiften. Maar de verantwoordelijkheid blijft bij jou. Merchant-of-record-providers zijn een alternatief dat meer van dit werk overneemt.
  • Terugbetalingen en geschillen. Bepaal je restitutiebeleid voor de lancering en zet het op je site. Geschillen (chargebacks) komen voor; bewaar gegevens over wat er is gekocht en geleverd.
  • Bonnetjes en facturen. Stripe kan bonnetjes per e-mail versturen; bedrijven hebben mogelijk echte facturen nodig.
  • Kosten. Elke provider rekent per transactie. Controleer de actuele prijspagina van de provider in plaats van cijfers uit artikelen te gebruiken.

Welke opzet bij je app past

  • Donaties of een handvol producten: Payment Links. Zie hoe bouw je een donatiewebsite voor een goed doel.
  • Een winkel met winkelwagen: Checkout met productregels en een webhook. Zie hoe bouw je een onlinewinkel.
  • SaaS of lidmaatschappen: Checkout in abonnementsmodus, webhooks en het klantenportaal. Zie hoe bouw je een SaaS-MVP en hoe prijs je een SaaS-product.
  • Een marktplaats die verkopers uitbetaalt: een andere, zwaarder gereguleerde opzet (Stripe Connect of iets vergelijkbaars). Plan dat apart.

Betalingen toevoegen in Mythex

Betalingen in apps die je op Mythex bouwt gebruiken je eigen Stripe-account en sleutels. Er is geen one-click "Stripe verbinden" voor je app. De gebruikelijke stroom:

  1. Haal Stripe-testsleutels op.
  2. Voeg STRIPE_SECRET_KEY toe (en later het webhookgeheim) aan de geheimen van het project. Dat kan via /secrets, de projectinstellingen, of de geheimenkaart die de agent toont als er een sleutel nodig is.
  3. Vraag de agent om Checkout met een prompt zoals hierboven.
  4. Test in Preview met testkaarten. Publiceer voordat je de webhook registreert, want die heeft je publieke URL nodig.
  5. Nadat je naar live sleutels bent overgestapt, publiceer je opnieuw zodat de live-app ze oppikt.

Zie betalingen ontvangen met Stripe en webhooks afhandelen in je backend in de documentatie.

Veelgestelde vragen

Wat is de makkelijkste manier om betalingen in een app te ontvangen?

Een Stripe Payment Link heeft geen code nodig: je maakt hem in het Stripe-dashboard en linkt ernaar vanuit je app. Als je app moet weten wie heeft betaald en er automatisch iets moet ontgrendelen, gebruik je in plaats daarvan Stripe Checkout met een webhook.

Heb ik een webhook nodig om betalingen te ontvangen?

Als je app moet reageren op een betaling, bijvoorbeeld een account ontgrendelen, een bestelling als betaald markeren of een verlenging verwerken, dan ja. De documentatie van Stripe zegt dat je niet alleen op de succespagina kunt vertrouwen, omdat een klant kan betalen en die pagina nooit bereikt. Webhooks zijn ook verplicht voor abonnementen.

Hoe test ik betalingen zonder echt geld?

Gebruik de sandbox-(test)-API-sleutels van Stripe en de testkaartnummers, zoals 4242 4242 4242 4242 met een toekomstige vervaldatum en een willekeurige cvc van drie cijfers. Testtransacties verplaatsen geen echt geld.

Regelt Stripe de btw of omzetbelasting voor mij?

Stripe Tax kan belasting berekenen en innen bij het afrekenen, en houdt bij waar je je mogelijk moet registreren. Maar jij blijft verantwoordelijk voor je belastingverplichtingen. Overleg met een accountant over jouw situatie.

Mythex · Pricing · Bouw alles met AI · Website- en app-templates · Mythex vergeleken · Woordenlijst voor apps bouwen met AI · Gratis tools voor apps bouwen met AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)