Skip to main content
Den här sidan beskriver det officiella Dodo Payments Flutter-paketet, dodopayments_checkout på pub.dev. Det finns även ett separat community-byggt paket. Se Community Projects.

Checkout Sessions API

Skapa checkout_url som detta SDK öppnar från din backend.

Mobile Integration Guide

Se hur detta SDK passar in i det fullständiga mobila betalningsflödet.
dodopayments_checkout öppnar Dodo Payments hosted checkout i SFSafariViewController på iOS och i en Custom Tab på Android, och returnerar en typad CheckoutResult. Det använder samma native code som de fristående iOS- och Android-SDK:erna, och all checkout-logik finns i den native coden. Dart-lagret vidarebefordrar varje anrop via en typad Pigeon-kanal. Paketet innehåller ingen API-nyckel och anropar aldrig Dodo Payments API. Krav: Flutter 3.44 eller senare med Dart 3.12 eller senare, iOS 16 eller senare samt Android minSdk 23.

Installation

1

Add the Dependency

Lägg till paketet i pubspec.yaml:
pubspec.yaml
Appearance customization kräver version 1.1.0 eller senare.Android-pluginet kompilerar som standard mot Android SDK 35. Om ett annat plugin kräver en högre compileSdk anger du dodoCompileSdk i appens gradle.properties.
2

Register a Callback URL Scheme

Registrera ett URL-schema så att operativsystemet dirigerar checkoutens return URL tillbaka till din app. Använd detta schema i returnUrl som du skickar till SDK:t och ange samma URL som checkout-sessionens return_url när din backend skapar sessionen. URL:en behöver inte läsa in en riktig sida.
Lägg till en URL-typ för ditt schema i ios/Runner/Info.plist:
ios/Runner/Info.plist
SFSafariViewController kan inte fånga sin egen return URL, så iOS öppnar URL:en i din app i stället. Vidarebefordra varje inkommande URL till SDK:t, till exempel från app_links:
Du kan vidarebefordra varje URL. handleOpenURL agerar endast på en URL som matchar returnUrl för den pågående checkouten och löser true för den. För alla andra URL:er löser den false. På Android löser den alltid false.

Användning

Anropa DodoCheckout.instance.start med checkout_url från din backend:
onEvent tar emot händelser vars type är CheckoutEventType.opened, returnReceived eller closed. Använd dem endast för loggning, aldrig för att avgöra resultatet.

Vad resultatet betyder

SDK:t bygger CheckoutResult från query-parametrarna i return URL:en.
result.status är en UI-hint, inte ett bevis på betalning. Bekräfta varje betalning från din backend med payment.succeeded eller subscription.active webhook.
CheckoutStatus
obligatorisk
Ett av fem värden:
  • succeeded: return URL:en innehåller status=succeeded (engångsbetalning) eller status=active (prenumeration).
  • failed: betalningen avvisades (status=failed).
  • cancelled: kunden stängde webbläsarvyn innan return URL:en anlände. SDK:t känner inte till resultatet och betalningen kan ha lyckats, så visa inte en felsida. Stäm i stället av den övergivna sessionen.
  • pending: betalningen slutförs senare (status=processing eller valfritt requires_*-värde), eller så saknades parametern status eller kunde inte identifieras. Stäm av den på samma sätt som cancelled.
  • expired: checkout-sessionen löpte ut (status=expired).
String?
Query-parametern payment_id, när return URL:en innehåller en sådan. Visa den i ditt UI, men använd den inte för att ge åtkomst. Se Verify the Payment.
String?
Query-parametern subscription_id. Anges för subscription-checkouter.
List<String>?
Query-parametern license_key. Anges när checkouten innehåller license key-produkter.
String?
Query-parametern email. Anges när checkouten samlar in en e-postadress.
Map<String, String>
Varje query-parameter från return URL:en, ordagrant.

Verifiera betalningen

Webhooks

Dodo Payments anropar din backend när en betalning lyckas eller en prenumeration aktiveras.

Get Payment Detail

Slå upp paymentId med din secret key för att kontrollera dess status.
Ge åtkomst först när en av dessa bekräftar betalningen. Förlita dig inte enbart på result.status.

Anpassa utseendet

Om du vill ändra checkout-webbläsarens verktygsfält, knappar och färgschema skickar du en BrowserCustomization som customization till CheckoutParams. Android Custom Tabs och iOS SFSafariViewController har olika native-kontroller, så alternativen är uppdelade i AndroidBrowserOptions och IosBrowserOptions. Varje plattform ignorerar den andras alternativ. Alla fält är valfria och har som standard värdet null. För ett null-fält anger SDK:t inte det alternativet och plattformen använder sitt eget standardvärde.
Color?
Bakgrundsfärg för verktygsfältet.
Color?
Färg på navigeringsfältet.
Color?
Färg på avdelaren ovanför navigeringsfältet.
CloseButtonStyle?
standard visar systemets “X”-ikon. back visar en bakåtpil som SDK:t ritar.
CloseButtonPosition?
Sidan av verktygsfältet där stängningsknappen visas: start eller end.
bool?
Visar verktygsfältets delningsikon. false döljer den.
bool?
Visar sidans titel under URL:en i verktygsfältet.
bool?
Döljer verktygsfältet automatiskt när sidan rullas.
bool?
Visar “Bookmark this page” i overflow-menyn.
bool?
Visar “Download page” i overflow-menyn.
BrowserColorScheme?
light eller dark tvingar fram det utseendet oavsett enhetens systeminställning. system följer systeminställningen.
DismissButtonStyle?
Stil för stängningsknappen: done, close eller cancel. iOS avgör om den visas som en etikett eller ikon.
PresentationStyle?
pageSheet (används när du lämnar detta null) visar ett kort som kunden kan svepa nedåt för att stänga. fullScreen täcker hela skärmen.
bool?
Låter verktygsfältet fällas ihop när sidan rullas. Det har endast synlig effekt när presentationStyle är fullScreen. Med pageSheet förblir fälten fixerade oavsett denna inställning.
BrowserColorScheme?
light eller dark tvingar fram det utseendet oavsett enhetens systeminställning. system följer systeminställningen.
iOS har inget alternativ för verktygsfältets färg, eftersom de underliggande tint-egenskaperna för SFSafariViewController är föråldrade från och med iOS 26.

Fel

start kastar CheckoutException endast vid felaktig användning eller ett plattformsfel. Läs orsaken från code, en CheckoutErrorCode. Den native code-strängen finns i nativeCode. En kund som avbryter eller en avvisad betalning är alltid ett resultat, aldrig ett undantag.
  • invalidCheckoutUrl (INVALID_CHECKOUT_URL): checkoutUrl är inte en checkout-session-URL för https (sökväg som börjar med /session/) på checkout.dodopayments.com eller test.checkout.dodopayments.com.
  • invalidReturnUrl (INVALID_RETURN_URL): returnUrl är inte en absolut URL med ett schema och en host.
  • alreadyInProgress (ALREADY_IN_PROGRESS): en annan checkout körs. Endast en checkout kan köras åt gången.
  • platformError (PLATFORM_ERROR): ett oväntat plattformsfel. Okända native-fel mappas också till denna kod.

Övergivna sessioner

Det native SDK:t registrerar checkout-sessionen när checkouten startar och rensar posten endast när checkouten avslutas med succeeded, failed eller expired. Posten finns kvar om appen avslutas under checkouten samt efter ett cancelled- eller pending-resultat. Kontrollera om den finns vid nästa start och efter varje cancelled- eller pending-resultat.
abandoned.sessionId är checkout-sessionens ID, som börjar med cks_. abandoned.createdAt är tiden då DateTime checkouten startade. Din backend kan slå upp sessionen med Get Checkout Session, som returnerar dess payment_id och payment_status. Tills betalningen når en slutlig status ska du behandla den som väntande, inte som misslyckad.

Relaterat

Mobile Integration Guide

Samma kontrakt för Android, iOS och React Native.

Community Projects

Det finns även ett separat community-byggt Flutter-paket.
Senast ändrad 26 september 2026