Quick Start
Platform Examples
Checkout Customization
Mobile Recipes
start(...)
bertipe tunggal, dengan pemulihan sesi yang ditinggalkan bawaan. Gunakan WebView manual hanya
jika tidak ada yang sesuai dengan stack Anda.Prasyarat
Sebelum mengintegrasikan Dodo Payments ke aplikasi seluler Anda, pastikan Anda memiliki:- Akun Dodo Payments: Akun merchant aktif dengan akses API
- Kredensial API: API key dan webhook secret key dari dashboard Anda
- Proyek Aplikasi Seluler: Aplikasi Android, iOS, React Native, atau Flutter
- Server Backend: Untuk menangani pembuatan sesi checkout secara aman
Alur Integrasi
Integrasi seluler mengikuti proses aman 4 langkah, dengan backend menangani pemanggilan API dan aplikasi seluler mengelola pengalaman pengguna.status hanya petunjuk UI tentang apa yang harus ditampilkan kepada pengguna. Selalu berikan akses berdasarkan payment.succeeded / subscription.active webhook di backend Anda - jangan pernah hanya berdasarkan hasil dari aplikasi seluler.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
Pilih SDK Anda
Setiap SDK seluler menyediakan kontrak yang sama: satu pemanggilanstart(...) membuka
checkout ter-host Dodo di permukaan browser native platform dan mengembalikan CheckoutResult
bertipe dengan status berupa succeeded, failed, cancelled,
pending, atau expired. Tidak ada yang menyimpan API key atau memanggil Dodo
Payments API, dan keempatnya mendukung pemulihan sesi yang ditinggalkan.
Android
com.dodopayments.api:checkout-android membuka Chrome Custom Tab. Memerlukan minSdk 23.iOS
dodopayments-mobile-sdk-ios membuka SFSafariViewController. Memerlukan iOS 16+.React Native
@dodopayments/react-native-checkout, Turbo Module pada kedua core native. Memerlukan React Native 0.76+.Flutter
dodopayments_checkout, channel Pigeon pada kedua core native. Memerlukan Flutter 3.44+.Mendaftarkan URL Scheme Callback
Keempat SDK mengembalikan kontrol ke aplikasi Anda melalui custom URL scheme yang Anda pilih, misalnyamyapp://checkout/return. Daftarkan sekali untuk setiap
platform:
- Android
- iOS
- Expo
checkout_url di browser sistem
platform (Android Custom Tabs / iOS SFSafariViewController), lalu cegat
navigasi ke return_url dan baca parameter query status serta payment_id. SDK di atas melakukan semua ini untuk Anda.Kustomisasi Tampilan
Setiap SDK menerima parameter opsionalcustomization pada start(...) /
CheckoutParams yang mengontrol tampilan dan perilaku permukaan browser
native - toolbar, tombol, dan presentasi. Ini terpisah dari tema halaman
checkout itu sendiri, yang Anda konfigurasikan di server melalui
customization.theme_config pada
checkout session.
Opsi dikelompokkan berdasarkan platform karena Android Custom Tab dan iOS
SFSafariViewController menyediakan kontrol native yang berbeda. Semua field bersifat
opsional; jika customization tidak disertakan sama sekali, tampilan default
platform akan digunakan.
Android - Custom Tab
Android - Custom Tab
default menampilkan ikon sistem “X”; back menggambar panah kembali.iOS - SFSafariViewController
iOS - SFSafariViewController
pageSheet ditampilkan sebagai kartu dengan swipe-to-dismiss; fullScreen menutupi seluruh layar.presentationStyle adalah fullScreen - pageSheet menjaga bar tetap tertambat terlepas dari pengaturan ini.- React Native
- Flutter
- Android (Kotlin)
- iOS (Swift)
Kustomisasi Halaman Checkout
Bagian Kustomisasi Tampilan di atas mengontrol permukaan browser native - toolbar, tombol, dan skema warna. Halaman checkout itu sendiri - field yang ditampilkan, tema, dan metode pembayaran yang muncul - dikonfigurasi di server saat Anda membuat sesi checkout. Parameter ini memberikan dampak terbesar pada konversi seluler. Parameter di bawah berada di tiga tempat berbeda dalam permintaan sesi checkout - kolom Lokasinya memberi tahu Anda objek tempat setiap parameter berada. Kesalahan ini adalah kekeliruan yang paling umum: parameter yang ditempatkan di objek yang salah akan diabaikan secara diam-diam.
show_order_details: false moves the contact and payment fields above the fold, instead of behind the order summary.
minimal_address: true untuk hanya mengumpulkan kode pos, bukan field jalan, kota, dan provinsi lengkap:

minimal_address: true reduces the billing address to a single postcode field.
theme: "system" agar checkout mengikuti preferensi mode terang atau gelap perangkat:

With theme: system, the checkout follows the device's light or dark appearance automatically.
Full checkout session parameter reference
Resep yang Dioptimalkan untuk Seluler
Setiap resep di bawah merupakan body permintaan sesi checkout lengkap. Salin yang sesuai dengan skenario Anda, ganti dengan ID produk Anda, lalu teruskan ke endpoint pembuatan sesi di backend.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 untuk melewati formulir checkout sepenuhnya.- Node.js SDK
- Python SDK
status dalam pengembalian deep link hanya merupakan petunjuk UI. Konfirmasikan akses dengan mendengarkan webhook payment.succeeded di backend Anda.Subscription with Free Trial - trial before first charge
Subscription with Free Trial - trial before first charge
- Node.js SDK
- Python SDK
subscription.active - bukan saat SDK seluler mengembalikan hasil. Lihat Subscription Integration Guide untuk alur webhook lengkap.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
Alur Subscription dari Seluler
Subscription dibuat melalui alur sesi checkout yang sama seperti pembayaran satu kali - SDK seluler membuka checkout ter-host, pelanggan berlangganan, dan aplikasi Anda menangani pengembalian deep link. Siklus hidup subscription kemudian dikelola sepenuhnya di backend.Subscription Berulang Reguler
Untuk penagihan dengan interval tetap (bulanan, tahunan), buat sesi checkout dengan produk subscription dan deep linkreturn_url. Backend Anda menerima subscription.active saat subscription dikonfirmasi.
Subscription On-Demand
Subscription on-demand memungkinkan Anda mengotorisasi metode pembayaran pelanggan sekali lalu menagih jumlah variabel di kemudian hari - ideal untuk isi ulang dompet, pay-as-you-go, dan skenario apa pun ketika jumlah tagihan belum diketahui sebelumnya. Lihat resep On-Demand Mandate di atas untuk body permintaan lengkap. Pertimbangan seluler utama:- Atur
show_on_demand_tag: falseagar halaman checkout tidak menampilkan bahasa “subscription” atau “on-demand”. Untuk kasus tokenisasi kartu, pelanggan tidak mengharapkan istilah subscription. - Setelah mandate diotorisasi, backend Anda menerima
subscription.active. Simpansubscription_id- Anda akan menggunakannya untuk semua tagihan berikutnya.
Subscription dengan Free Trial
Teruskansubscription_data.trial_period_days dalam sesi checkout untuk menawarkan trial sebelum siklus penagihan pertama. Pelanggan mengotorisasi metode pembayaran mereka saat mendaftar trial; tagihan pertama terjadi otomatis saat trial berakhir. Lihat resep Subscription with Free Trial di atas untuk body permintaan lengkap.
Upgrade dan Downgrade
Perubahan paket dilakukan melalui API di backend Anda, bukan melalui sesi checkout baru. Dodo Payments menghitung prorata secara otomatis. Untuk menyediakan opsi layanan mandiri, sematkan atau tautkan ke Customer Portal.Subscription Integration Guide
On-Demand Subscriptions
Upgrade / Downgrade
Customer Portal
Mengurangi Drop-Off Checkout
Checkout seluler mengalami abandonment yang lebih tinggi daripada web - layar yang lebih kecil, lebih banyak gangguan, dan formulir yang lebih panjang semuanya berkontribusi. Perbaikan tercepat berasal dari konfigurasi sesi checkout itu sendiri.Optimalkan Formulir
Isi Awal Data Pelanggan
Setiap field yang tidak perlu diketik pelanggan adalah alasan untuk tidak membatalkan:- Pelanggan baru - atur
customer.emaildancustomer.namedari sesi autentikasi Anda. - Pelanggan yang kembali - atur
customer.customer_iduntuk mengisi otomatis semua detail yang tersimpan. - Mata uang - selalu teruskan
billing_currencydanbilling_address.countrysecara bersamaan.
Alat Pemulihan
Abandoned Cart Recovery
Payment Retries
Subscription Dunning
Recovery Overview
Praktik Terbaik
- Keamanan: Jangan pernah menyertakan API key dalam aplikasi Anda. Buat sesi checkout di backend dan teruskan hanya
checkout_urlyang dihasilkan ke client. - Otoritas: Perlakukan
CheckoutResult.statussebagai petunjuk UI. Berikan akses hanya setelah backend mengonfirmasi pembayaran. - Pengalaman Pengguna: Tampilkan status loading saat backend membuat sesi, dan tangani
cancelledsebagai hasil normal, bukan error. - Pengujian: Gunakan test mode dan kartu pengujian, lalu verifikasi round trip return-URL pada perangkat nyata maupun simulator.
- Konversi: Atur
show_order_details: falsedanminimal_address: trueuntuk tingkat penyelesaian checkout seluler terbaik. Memindahkan metode pembayaran ke bagian atas layar dan mengurangi field formulir adalah dua perubahan yang paling berdampak. - Mata Uang: Selalu teruskan
billing_currencydanbilling_address.countrysecara eksplisit - jika salah satunya tidak ada, Adaptive Currency dapat mengubah mata uang penagihan berdasarkan alamat IP pelanggan. - Penagihan on-demand: Atur
show_on_demand_tag: falsesaat menggunakan subscription on-demand untuk tokenisasi kartu. Pelanggan dalam alur isi ulang dompet tidak mengharapkan bahasa “subscription”. - Pemulihan: Aktifkan pemulihan cart yang ditinggalkan di dashboard Dodo Payments untuk otomatis menghubungi kembali pelanggan yang tidak menyelesaikan checkout.
Pemecahan Masalah
Masalah Umum
- Callback tidak pernah tiba: Scheme di
returnUrlharus cocok dengan yang Anda daftarkan. Di Android, itu adalah placeholder manifestdodoCallbackScheme; di iOS dan React Native, itu adalah jenis URLInfo.plist. - Checkout kembali ke browser, bukan ke aplikasi Anda (iOS): Anda belum meneruskan URL masuk. Panggil
DodoCheckout.handleOpenURL(url)dari.onOpenURL,scene(_:openURLContexts:), atau listener React NativeLinking. PLATFORM_ERRORdi Android: Biasanya disebabkan ketidakcocokan scheme. Hal ini juga dapat terjadi jikaMainActivitymenetapkanandroid:taskAffinity=""(default bawaanflutter create), yang dapat membuat beberapa build OEM kehilangan checkout yang sedang berlangsung.ALREADY_IN_PROGRESS: Checkout masih terbuka. Tunggu atau tutup checkout sebelumnya sebelum memulai yang baru.- Build gagal karena placeholder tidak teratasi: Anda menambahkan Android SDK tetapi belum menetapkan
manifestPlaceholders["dodoCallbackScheme"]. - Pembayaran berhasil tetapi akses tidak diberikan: Ini wajar jika Anda mengandalkan hasil dari perangkat seluler. Berikan akses dari webhook
payment.succeeded/subscription.active. - Apple Pay / Google Pay tidak muncul di seluler: Checkout dimuat di dalam embedded WebView (
WKWebView/ AndroidWebView), yang menonaktifkan wallet dan dapat mengganggu 3-D Secure. Buka menggunakan SDK atau browser sistem (Custom Tabs /SFSafariViewController).
Sumber Daya Tambahan
- Panduan Integrasi Pembayaran
- Dokumentasi Webhook
- Proses Pengujian
- FAQ Teknis
- Kustomisasi Checkout Session
- On-Demand Subscriptions
- Upgrade/Downgrade Subscription
- Pemulihan Cart yang Ditinggalkan
- Customer Portal
