Quick Start
Platform Examples
Checkout Customization
Mobile Recipes
start(...)-anrop,
med återställning av övergivna sessioner inbyggd. Använd endast en manuell WebView om
inget av SDK:erna passar din stack.Förutsättningar
Innan du integrerar Dodo Payments i din mobilapp ska du se till att du har:- Dodo Payments-konto: Ett aktivt merchant-konto med API-åtkomst
- API-uppgifter: API-nyckel och webhook secret key från din dashboard
- Mobilappsprojekt: En Android-, iOS-, React Native- eller Flutter-applikation
- Backend-server: För säker hantering av skapandet av checkout-sessioner
Integreringsflöde
Den mobila integreringen följer en säker process i fyra steg där din backend hanterar API-anropen och mobilappen hanterar användarupplevelsen.status är endast en UI-ledtråd för vad som ska visas för användaren. Ge alltid åtkomst från payment.succeeded / subscription.active-webhooken på din backend – aldrig enbart från mobilresultatet.Backend: Create Checkout Session
Checkout Session API Docs
Mobile: Get Checkout URL
- iOS (Swift)
- Android (Kotlin)
- React Native (JavaScript)
- Flutter (Dart)
Mobile: Open Checkout in Browser
Pick your mobile SDK
Backend: Handle Payment Completion
Välj ditt SDK
Alla mobila SDK:n exponerar samma kontrakt: ett endastart(...)-anrop öppnar Dodos
hostade checkout i plattformens inbyggda webbläsaryta och returnerar en typad
CheckoutResult vars status är succeeded, failed, cancelled,
pending eller expired. Inget av dem innehåller en API-nyckel eller anropar Dodo
Payments API, och alla fyra stöder återställning av övergivna sessioner.
Android
com.dodopayments.api:checkout-android öppnar en Chrome Custom Tab. Kräver minSdk 23.iOS
dodopayments-mobile-sdk-ios öppnar SFSafariViewController. Kräver iOS 16+.React Native
@dodopayments/react-native-checkout, en Turbo Module över båda native cores. Kräver React Native 0.76+.Flutter
dodopayments_checkout, en Pigeon-kanal över båda native cores. Kräver Flutter 3.44+.Registrera ett callback-URL-schema
Alla fyra SDK:n lämnar tillbaka kontrollen till appen via ett anpassat URL-schema som du väljer, till exempelmyapp://checkout/return. Registrera det en gång per
plattform:
- Android
- iOS
- Expo
checkout_url i plattformens system-
webbläsare (Android Custom Tabs / iOS SFSafariViewController) och fånga
navigeringen till din return_url. Läs sedan status och payment_id som query-
parametrar. SDK:erna ovan gör exakt detta åt dig.Anpassa utseendet
Alla SDK:n accepterar en valfricustomization-parameter på start(...) /
CheckoutParams som styr den inbyggda webbläsarytans utseende och
beteende – verktygsfält, knappar och presentation. Detta är separat från
checkout-sidans eget tema, som konfigureras server-side via
customization.theme_config i
checkout-sessionen.
Alternativen är grupperade per plattform eftersom Androids Custom Tab och iOS:s
SFSafariViewController exponerar olika inbyggda kontroller. Alla fält är
valfria; om customization utelämnas helt används plattformens standardutseende.
Android - Custom Tab
Android - Custom Tab
default visar systemets “X”-ikon; back ritar i stället en bakåtpil.iOS - SFSafariViewController
iOS - SFSafariViewController
pageSheet visas som ett kort som kan svepas bort; fullScreen täcker hela skärmen.presentationStyle är fullScreen – pageSheet håller fälten fast oavsett denna inställning.- React Native
- Flutter
- Android (Kotlin)
- iOS (Swift)
Anpassa checkout-sidan
Avsnittet Anpassa utseendet ovan styr den inbyggda webbläsarytan – verktygsfält, knappar och färgschema. Själva checkout-sidan – vilka fält som visas, temat och vilka betalningsmetoder som visas – konfigureras server-side när du skapar checkout-sessionen. Dessa parametrar har störst inverkan på mobil konvertering. Parametrarna nedan finns på tre olika platser i begäran om checkout-sessionen – kolumnen Var den ska placeras visar vilket objekt varje parameter hör till. Det vanligaste misstaget är att placera en parameter i fel objekt; då ignoreras den utan meddelande.
show_order_details: false moves the contact and payment fields above the fold, instead of behind the order summary.
minimal_address: true för att endast samla in ett postnummer i stället för fullständiga gatu-, stads- och delstatsfält:

minimal_address: true reduces the billing address to a single postcode field.
theme: "system" så att checkout följer enhetens inställning för ljust eller mörkt läge:

With theme: system, the checkout follows the device's light or dark appearance automatically.
Full checkout session parameter reference
Mobiloptimerade recept
Varje recept nedan är en komplett request body för en checkout-session. Kopiera det som matchar ditt scenario, byt ut mot ditt produkt-ID och skicka det till din backends endpoint för att skapa sessioner.Minimal Mobile Checkout - fastest path to payment
Minimal Mobile Checkout - fastest path to payment
- Node.js SDK
- Python SDK
One-Click Returning Customer - saved card, instant confirmation
One-Click Returning Customer - saved card, instant confirmation
confirm: true för att hoppa över checkout-formuläret helt.- Node.js SDK
- Python SDK
status i deep-link-returen är endast en UI-ledtråd. Bekräfta åtkomst genom att lyssna efter payment.succeeded-webhooken på din backend.Subscription with Free Trial - trial before first charge
Subscription with Free Trial - trial before first charge
- Node.js SDK
- Python SDK
subscription.active-webhooken – inte när mobil-SDK:t returnerar. Se Subscription Integration Guide för det fullständiga webhook-flödet.On-Demand Mandate - save a card for future variable charges
On-Demand Mandate - save a card for future variable charges
- Node.js SDK
- Python SDK
Prenumerationsflöden från mobil
Prenumerationer skapas genom samma checkout-sessionflöde som används för engångsbetalningar – mobil-SDK:t öppnar den hostade checkouten, kunden prenumererar och appen hanterar deep-link-returen. Prenumerationens livscykel hanteras därefter helt på backend.Vanliga återkommande prenumerationer
För fakturering med fasta intervall (månadsvis eller årsvis) skapar du en checkout-session med en prenumerationsprodukt och en deep-linkreturn_url. Din backend tar emot subscription.active när prenumerationen har bekräftats.
On-demand-prenumerationer
On-demand-prenumerationer låter dig auktorisera en kunds betalningsmetod en gång och debitera varierande belopp senare – perfekt för påfyllning av wallet, pay-as-you-go och alla situationer där debiteringsbeloppet inte är känt i förväg. Se receptet On-Demand Mandate ovan för hela request body. Viktiga mobila överväganden:- Ange
show_on_demand_tag: falseså att checkout-sidan inte visar formuleringar om “subscription” eller “on-demand”. Vid användningsfall för korttokenisering förväntar sig kunderna inte prenumerationsterminologi. - När mandatet har auktoriserats tar din backend emot
subscription.active. Sparasubscription_id– du kommer att använda det för alla framtida debiteringar.
Prenumeration med kostnadsfri provperiod
Skickasubscription_data.trial_period_days i checkout-sessionen för att erbjuda en provperiod före den första faktureringscykeln. Kunden auktoriserar sin betalningsmetod när provperioden startar; den första debiteringen sker automatiskt när provperioden löper ut. Se receptet Subscription with Free Trial ovan för hela request body.
Uppgraderingar och nedgraderingar
Planändringar görs via API på din backend, inte genom en ny checkout-session. Dodo Payments beräknar pro rata automatiskt. Om du vill ge kunderna ett självbetjäningsalternativ kan du bädda in eller länka till Customer Portal.Subscription Integration Guide
On-Demand Subscriptions
Upgrade / Downgrade
Customer Portal
Minska avhopp i checkout
Mobila checkout-flöden har fler avhopp än webben – mindre skärmar, fler distraktioner och längre formulär bidrar alla. De snabbaste förbättringarna kommer från själva konfigurationen av checkout-sessionen.Optimera formuläret
Förifyll kunduppgifter
Varje fält som kunden slipper skriva in är en anledning mindre att avbryta:- Nya kunder – ange
customer.emailochcustomer.namefrån din auth-session. - Återkommande kunder – ange
customer.customer_idför att automatiskt förifylla alla sparade uppgifter. - Valuta – skicka alltid
billing_currencyochbilling_address.countrytillsammans.
Återställningsverktyg
Abandoned Cart Recovery
Payment Retries
Subscription Dunning
Recovery Overview
Bästa praxis
- Säkerhet: Skicka aldrig en API-nyckel i appen. Skapa checkout-sessioner på din backend och skicka endast den resulterande
checkout_urltill klienten. - Auktoritet: Behandla
CheckoutResult.statussom en UI-ledtråd. Ge åtkomst först när din backend har bekräftat betalningen. - Användarupplevelse: Visa ett laddningstillstånd medan din backend skapar sessionen och hantera
cancelledsom ett normalt resultat, inte som ett fel. - Testning: Använd test mode och testkort, och verifiera rundresan via return-URL på både en riktig enhet och en simulator.
- Konvertering: Ange
show_order_details: falseochminimal_address: trueför bästa slutförandegrad i mobil checkout. Att flytta upp betalningsmetoderna och minska antalet formulärfält är de två förändringar som ger störst effekt. - Valuta: Skicka alltid både
billing_currencyochbilling_address.countryuttryckligen – om någon saknas kan Adaptive Currency ändra faktureringsvalutan baserat på kundens IP-adress. - On-demand-fakturering: Ange
show_on_demand_tag: falsenär du använder on-demand-prenumerationer för korttokenisering. Kunder som använder ett flöde för påfyllning av wallet förväntar sig inte att se formuleringar om “subscription”. - Återställning: Aktivera återställning av övergivna kundvagnar i din Dodo Payments-dashboard för att automatiskt återengagera kunder som inte slutför checkout.
Felsökning
Vanliga problem
- Callback kommer aldrig fram: Schemat i
returnUrlmåste matcha det du registrerade. På Android är det manifestetsdodoCallbackScheme-platshållare; på iOS och React Native är detInfo.plistURL type. - Checkout återgår till webbläsaren i stället för appen (iOS): Du har inte vidarebefordrat den inkommande URL:en. Anropa
DodoCheckout.handleOpenURL(url)från.onOpenURL,scene(_:openURLContexts:)eller en React NativeLinking-lyssnare. PLATFORM_ERRORpå Android: Oftast beror det på att schemat inte matchar. Det kan även inträffa om dinMainActivityangerandroid:taskAffinity=""(standardvärdetflutter create), vilket gör att vissa OEM-versioner tappar den pågående checkouten.ALREADY_IN_PROGRESS: En checkout är fortfarande öppen. Vänta på eller stäng den föregående innan du startar en ny.- Bygget misslyckas med en olöst platshållare: Du lade till Android SDK men ställde aldrig in
manifestPlaceholders["dodoCallbackScheme"]. - Betalningen lyckades men åtkomst beviljades inte: Förväntat om du baserar dig på mobilresultatet. Ge i stället åtkomst från
payment.succeeded/subscription.active-webhooken. - Apple Pay / Google Pay visas inte på mobil: Checkout laddas i en inbäddad WebView (
WKWebView/ AndroidWebView), vilket döljer wallets och kan bryta 3-D Secure. Öppna den i stället med SDK:t eller i systemwebbläsaren (Custom Tabs /SFSafariViewController).
Ytterligare resurser
- Guide för betalningsintegrering
- Webhook-dokumentation
- Testprocess
- Tekniska vanliga frågor
- Anpassning av checkout-session
- On-Demand Subscriptions
- Uppgradering/nedgradering av prenumeration
- Återställning av övergiven kundvagn
- Customer Portal
