Sådan tilføjer du betalinger til din app: checkout, abonnementer og webhooks
Den enkleste måde at tilføje betalinger til din app på er Stripe: brug et Payment Link, hvis du bare har brug for en "Køb"-knap og kan håndtere ordrer i hånden, Stripe Checkout, hvis din app skal vide, hvem der har betalt, og reagere automatisk, og Checkout i abonnementstilstand samt Stripes kundeportal til gentagende fakturering. I alle tilfælde undtagen det simpleste har du også brug for en webhook — et server-endpoint, som Stripe kalder, når en betaling lykkes — og du bør teste alt med Stripes testnøgler og testkort, før du skifter til live-nøgler.
Denne guide forklarer hver mulighed, webhook-delen, som de fleste vejledninger springer over, og hvad du skal tjekke, før du modtager rigtige penge. Stripe-detaljerne stammer fra Stripes egen dokumentation pr. september 2026.
Hvorfor bruge en betalingsudbyder overhovedet
Indsaml aldrig kortnumre i dine egne formularer. Håndtering af rå kortdata gør dig omfattet af PCI DSS (kortbranchens sikkerhedsstandard) og er en alvorlig risiko. En betalingsudbyder som Stripe hoster betalingsformularen, gemmer kortet, håndterer bankens autorisation og fortæller din app resultatet. Din app ser kun "kunde X har betalt for Y".
Denne guide bruger Stripe, fordi det er udbredt, veldokumenteret og understøttet af de fleste AI-app-builders. Andre udbydere findes, og nogle fungerer som "merchant of record" og tager sig af momshåndteringen for dig; hvis skatteoverholdelse bekymrer dig, er den model værd at sammenligne.
De tre måder at modtage betalinger med Stripe
| Mulighed | Kode nødvendig | Ved din app hvem der har betalt? | Bedst til |
|---|---|---|---|
| Payment Links | Ingen | Kun hvis du tilføjer en webhook | Salg af få faste produkter, donationer, test af efterspørgsel |
| Checkout (engangs) | Serverkode til at oprette en session | Ja, via webhook | Butikker, betalte downloads, enkeltkøb |
| Checkout (abonnement) | Serverkode plus webhook-håndtering | Ja, via webhook | SaaS, medlemskaber, alt der er tilbagevendende |
Payment Links
Et Payment Link er en Stripe-hostet betalingsside, som du opretter i Stripe Dashboard uden kode. Du får en URL, du kan lægge bag en knap i din app, dele i en e-mail eller vise som QR-kode. Stripes dokumentation siger, at Payment Links kan sælge et produkt, et abonnement eller modtage donationer, og du kan lade kunderne vælge, hvad de vil betale, eller begrænse antallet af køb.
Hagen er: din app ved ikke automatisk, at en bestemt indlogget bruger har betalt. Til en donationsside eller en lille butik, hvor du selv udfører ordrer ud fra Stripes e-mailnotifikationer, er det fint. Til "betal for at låse Pro-funktionerne op" er det ikke.
Stripe Checkout
Checkout er en betalingsside, din server opretter efter behov for et bestemt køb. Din server fortæller Stripe, hvad der købes (og eventuelt hvilken kunde der køber), Stripe returnerer en URL, og du sender kunden derhen. Stripes dokumentation beskriver det som understøttende både engangs- og abonnementsbetalinger, som en fuldt Stripe-hostet side, en side indlejret på dit site eller en indlejret formular.
Flowet:
- Kunden klikker på Køb i din app.
- Din server opretter en Checkout Session med din hemmelige nøgle, inklusive et ID der kobler den til din bruger eller ordre.
- Kunden sendes videre til Stripe og betaler.
- Stripe sender kunden tilbage til din succes-side.
- Stripe sender en
checkout.session.completed-hændelse til din webhook, og din server markerer ordren som betalt eller låser adgangen op.
Trin 2 skal ske på serveren, fordi det bruger din hemmelige nøgle. Det er hovedgrunden til, at Checkout kræver en backend.
Abonnementer
Abonnementer bruger Checkout i abonnementstilstand med en tilbagevendende pris, du har oprettet i Stripe. Den første betaling fungerer som flowet ovenfor. Derefter sker fornyelser, mislykkede kort, opgraderinger og opsigelser over tid — ofte når kunden slet ikke er i din app — så din app hører først om dem gennem webhooks.
Til at lade kunderne administrere deres eget abonnement tilbyder Stripe en hostet kundeportal. Ifølge Stripes dokumentation kan kunder der opdatere betalingsmetoder og faktureringsoplysninger, ændre eller opsige abonnementer og se og hente fakturaer. Du konfigurerer den i Stripe Dashboard og tilføjer en knap "Administrér fakturering", der sender kunden dertil. Det sparer dig for at bygge de skærme selv.
Webhooks: den del du ikke kan springe over
En webhook er en HTTP-forespørgsel, Stripe sender til din server, når noget sker. (Se hvad en webhook er for den generelle idé.) Stripes guide til ordreopfyldelse er tydelig: du kan ikke stole på succes-siden alene til at opfylde ordrer, for en kunde kan betale og derefter miste forbindelsen, før siden indlæses. For abonnementer og forsinkede betalingsmetoder er webhooks påkrævet.
Hændelser værd at håndtere
| Hændelse | Hvad den betyder | Hvad din app gør |
|---|---|---|
checkout.session.completed | Checkout er færdig | Markér ordren som betalt eller start adgang |
checkout.session.async_payment_succeeded | En forsinket metode (f.eks. en bankdebitering) blev godkendt senere | Opfyld nu |
checkout.session.async_payment_failed | Den forsinkede betaling mislykkedes | Fortæl kunden; opfyld ikke |
invoice.paid | En abonnementsbetaling lykkedes, inklusive fornyelser | Forlæng adgangen |
invoice.payment_failed | En fornyelse mislykkedes | Advar brugeren; Stripe kan forsøge igen |
customer.subscription.updated | Planen er ændret, eller opsigelse er planlagt | Opdatér brugerens plan |
customer.subscription.deleted | Abonnementet er afsluttet | Fjern betalt adgang |
Regler for en korrekt webhook-handler
Disse kommer direkte fra Stripes webhook-dokumentation, og AI-genererede handlere glemmer nogle gange en af dem:
- Verificér signaturen. Hver hændelse har en
Stripe-Signature-header. Din handler tjekker den med endpointets signeringshemmelighed (den starter medwhsec_). Uden dette kunne en hvilken som helst sende en falsk "betaling lykkedes" til din server. - Brug den rå request-body. Signaturtjek fejler, hvis dit framework parser eller ændrer body'en først.
- Returnér et 2xx-svar hurtigt, og lav det langsomme arbejde bagefter. Timeouts tæller som fejl.
- Håndtér dubletter. Stripe kan levere den samme hændelse mere end én gang. Registrér behandlede hændelses-ID'er, eller gør opfyldelsen sikker at køre to gange.
- Antag ikke rækkefølge. Stripe garanterer ikke, at hændelser ankommer i den rækkefølge, de skete i.
- Forvent gentagelser. I live-tilstand forsøger Stripe fejlede leveringer igen i op til tre dage, så et kort nedbrud mister ikke betalinger — men din handler skal kunne håndtere sene hændelser.
Webhooks kræver en offentlig HTTPS-adresse, så de virker normalt først, når din app er udgivet (Stripes CLI kan videresende hændelser til en lokal maskine for udviklere).
En prompt der dækker hele flowet
Tilføj et engangskøb med Stripe Checkout for "Pro-pakken" (pris-ID i STRIPE_PRICE_ID). Opret Checkout Session på serveren med STRIPE_SECRET_KEY fra hemmeligheder, og inkludér den indloggede brugers ID i sessionen. Tilføj et POST /api/stripe/webhook-endpoint, der verificerer Stripe-signaturen med STRIPE_WEBHOOK_SECRET ved hjælp af den rå request-body, håndterer checkout.session.completed og markerer den bruger som havende Pro-pakken. Gør det sikkert, hvis den samme hændelse kommer to gange. Succes- og annullér-sider. Eksponér aldrig den hemmelige nøgle over for browseren.
Tilføj til abonnementer: "Brug abonnementstilstand med STRIPE_PRICE_ID. Håndtér invoice.paid, invoice.payment_failed, customer.subscription.updated og customer.subscription.deleted. Tilføj en knap Administrér fakturering, der åbner Stripes kundeportal."
Testtilstand
Stripe har adskilte sandbox- (test) og live-miljøer med separate nøgler. Sandbox-nøgler starter med pk_test_, sk_test_ eller rk_test_; live-nøgler starter med pk_live_, sk_live_ eller rk_live_. Testtransaktioner flytter ikke penge.
Nyttige testkort fra Stripes testdokumentation (fremtidig udløbsdato, vilkårlig tre-cifret CVC):
| Kortnummer | Resultat |
|---|---|
4242 4242 4242 4242 | Betaling lykkes |
4000 0000 0000 0002 | Kortet afvises |
4000 0000 0000 3220 | Kræver 3D Secure-godkendelse, og lykkes derefter |
Test mindst:
- En vellykket betaling låser det rigtige op for den rigtige bruger
- Et afvist kort viser en tydelig besked og låser intet op
- At lukke browserfanen lige efter betaling giver stadig adgang (det beviser, at webhooken virker, ikke bare succes-siden)
- At annullere på Stripe-siden sender brugeren tilbage til din app uden at noget er trukket
- For abonnementer: opsig i kundeportalen og bekræft at adgangen stopper, når den skal
Going live
- Aktivér din Stripe-konto med dine virksomheds- og bankoplysninger.
- Skift til live-nøgler i din apps hemmeligheder. Stripe anbefaler begrænsede nøgler med kun de rettigheder, din integration har brug for, frem for en ubegrænset hemmelig nøgle.
- Opret et live-webhook-endpoint der peger på din udgivne app. Det har sin egen signeringshemmelighed, forskellig fra test-hemmeligheden — opdatér den.
- Genopret produkter og priser i live-tilstand; test-tilstandens ID'er findes ikke der.
- Lav ét rigtigt, lille køb og refundér det.
Gem alle nøgler i din projekts hemmeligheder, aldrig i kode eller chat. Vores sikkerhedstjekliste dækker nøgler og webhook-verificering mere detaljeret.
Skat, refusioner og papirarbejdet
Betalinger medfører forpligtelser, som kode ikke løser. Dette er ikke skatterådgivning; tal med en revisor.
- Salgsafgift, moms og GST. Afhængigt af hvor du og dine kunder er, kan du skulle registrere dig, opkræve og indberette skat. Stripe Tax kan beregne og opkræve skat ved checkout, holde øje med, hvor dit salg kan skabe en forpligtelse, og hjælpe med registreringer og indberetning — men ansvaret ligger stadig hos dig. Merchant-of-record-udbydere er et alternativ, der tager mere af dette på sig.
- Refusioner og tvister. Beslut din refusionspolitik før lancering, og læg den på dit site. Tvister (chargebacks) forekommer; behold optegnelser over, hvad der blev købt og leveret.
- Kvitteringer og fakturaer. Stripe kan sende kvitteringer på e-mail; virksomheder har måske brug for ordentlige fakturaer.
- Gebyrer. Enhver udbyder tager gebyr pr. transaktion. Tjek udbyderens aktuelle prisside i stedet for at stole på tal i artikler.
Hvilken opsætning passer til din app
- Donationer eller et par produkter: Payment Links. Se sådan bygger du en donationsside for en nonprofit.
- En butik med kurv: Checkout med varelinjer og en webhook. Se sådan bygger du en webshop.
- SaaS eller medlemskaber: Checkout i abonnementstilstand, webhooks og kundeportalen. Se sådan bygger du en SaaS MVP og sådan prissætter du et SaaS-produkt.
- En markedsplads, der udbetaler til sælgere: en anden og mere reguleret opsætning (Stripe Connect eller lignende). Planlæg den separat.
Tilføj betalinger i Mythex
Betalinger i apps, du bygger på Mythex, bruger din egen Stripe-konto og dine egne nøgler; der findes ingen "Forbind Stripe"-knap med ét klik til din app. Det typiske flow:
- Hent Stripes test-nøgler.
- Tilføj
STRIPE_SECRET_KEY(og webhook-hemmeligheden senere) til projektets hemmeligheder — via/secrets, projektindstillinger eller hemmelighedskortet agenten viser, når den har brug for en nøgle. - Bed agenten om Checkout med en prompt som ovenfor.
- Test i Preview med testkort. Udgiv, før du registrerer webhooken, for den har brug for din offentlige URL.
- Efter du har skiftet til live-nøgler, udgiv igen, så den live app henter dem.
Se Accepter betalinger med Stripe og Håndtér webhooks i din backend i dokumentationen.
Spørgsmål
Hvad er den nemmeste måde at modtage betalinger i en app på?
Et Stripe Payment Link kræver ingen kode: du opretter det i Stripe Dashboard og linker til det fra din app. Hvis din app skal vide, hvem der har betalt, og låse noget op automatisk, skal du i stedet bruge Stripe Checkout med en webhook.
Skal jeg bruge en webhook for at modtage betalinger?
Hvis din app skal reagere på en betaling — låse en konto op, markere en ordre som betalt, håndtere en fornyelse — så ja. Stripes dokumentation siger, at du ikke kan stole på succes-siden alene, fordi en kunde kan betale og aldrig nå frem til den. Webhooks er også påkrævet for abonnementer.
Hvordan tester jeg betalinger uden rigtige penge?
Brug Stripes sandbox-API-nøgler (test) og deres testkortnumre, f.eks. 4242 4242 4242 4242 med en fremtidig udløbsdato og en vilkårlig tre-cifret CVC. Testtransaktioner flytter ikke rigtige penge.
Håndterer Stripe moms og salgsafgift for mig?
Stripe Tax kan beregne og opkræve skat ved checkout og holde øje med, hvor du måske skal registrere dig, men du er selv ansvarlig for dine skatteforpligtelser. Tal med en revisor om din situation.