Halaman ini membahas package Flutter resmi Dodo Payments,
dodopayments_checkout di pub.dev. Package terpisah yang dibuat komunitas juga tersedia. Lihat
Proyek Komunitas.Checkout Sessions API
Buat
checkout_url yang dibuka SDK ini dari backend Anda.Mobile Integration Guide
Lihat cara SDK ini terintegrasi dengan alur pembayaran seluler secara menyeluruh.
dodopayments_checkout membuka checkout hosted Dodo Payments dalam SFSafariViewController di iOS dan dalam Custom Tab di Android, lalu mengembalikan CheckoutResult bertipe. Package ini menggunakan native code yang sama dengan SDK iOS dan
Android mandiri, dan seluruh logika checkout berada dalam native code tersebut. Lapisan Dart meneruskan setiap panggilan melalui channel
Pigeon bertipe. Package ini tidak menyimpan API key dan tidak pernah memanggil API Dodo Payments.
Persyaratan: Flutter 3.44 atau lebih baru dengan Dart 3.12 atau lebih baru, iOS 16 atau lebih baru, dan Android minSdk 23.
Instalasi
1
Add the Dependency
Tambahkan package ke Kustomisasi tampilan memerlukan versi 1.1.0 atau lebih baru.Plugin Android dikompilasi menggunakan Android SDK 35 secara default. Jika plugin lain memerlukan
pubspec.yaml:pubspec.yaml
compileSdk yang lebih tinggi, tetapkan dodoCompileSdk di gradle.properties aplikasi Anda.2
Register a Callback URL Scheme
Daftarkan skema URL agar sistem operasi mengarahkan URL pengembalian checkout kembali ke aplikasi Anda. Gunakan skema ini dalam
returnUrl yang Anda teruskan ke SDK, dan tetapkan URL yang sama sebagai return_url pada checkout session saat backend Anda membuat session tersebut. URL tersebut tidak perlu memuat halaman nyata.- iOS
- Android
Tambahkan tipe URL untuk skema Anda di
ios/Runner/Info.plist:ios/Runner/Info.plist
SFSafariViewController tidak dapat menangkap URL pengembaliannya sendiri, sehingga iOS membuka URL tersebut di aplikasi Anda. Teruskan setiap URL yang masuk ke SDK, misalnya dari
app_links:Anda dapat meneruskan setiap URL.
handleOpenURL hanya bertindak pada URL yang cocok dengan
returnUrl dari checkout yang sedang berlangsung, dan menyelesaikan true untuk URL tersebut. Untuk URL
lainnya, false akan diselesaikan. Di Android, false selalu diselesaikan.Penggunaan
PanggilDodoCheckout.instance.start dengan checkout_url dari backend Anda:
onEvent menerima event yang type-nya adalah CheckoutEventType.opened, returnReceived, atau closed. Gunakan event tersebut hanya untuk logging, jangan pernah untuk menentukan hasil.
Arti Hasil
SDK membuatCheckoutResult dari parameter query pada URL pengembalian.
CheckoutStatus
wajib
Salah satu dari lima nilai:
succeeded: URL pengembalian memilikistatus=succeeded(pembayaran satu kali) ataustatus=active(subscription).failed: pembayaran ditolak (status=failed).cancelled: customer menutup tampilan browser sebelum URL pengembalian tiba. SDK tidak mengetahui hasilnya, dan pembayaran mungkin berhasil, jadi jangan tampilkan layar kegagalan. Rekonsiliasikan session yang ditinggalkan sebagai gantinya.pending: pembayaran diselesaikan nanti (status=processingatau nilairequires_*apa pun), atau parameterstatustidak ada atau tidak dikenali. Rekonsiliasikan seperticancelled.expired: checkout session kedaluwarsa (status=expired).
String?
Parameter query
payment_id, jika URL pengembalian menyertakannya. Tampilkan di UI, tetapi jangan gunakan untuk memberikan akses. Lihat Verifikasi Pembayaran.String?
Parameter query
subscription_id. Ditetapkan untuk checkout subscription.List<String>?
Parameter query
license_key. Ditetapkan ketika checkout menyertakan produk license key.String?
Parameter query
email. Ditetapkan ketika checkout mengambil alamat email.Map<String, String>
Setiap parameter query dari URL pengembalian, secara verbatim.
Verifikasi Pembayaran
Webhooks
Dodo Payments memanggil backend Anda ketika pembayaran berhasil atau subscription aktif.
Get Payment Detail
Cari
paymentId menggunakan secret key Anda untuk memeriksa statusnya.result.status.
Kustomisasi Tampilan
Untuk mengubah toolbar, tombol, dan skema warna browser checkout, teruskanBrowserCustomization sebagai customization pada CheckoutParams. Android Custom Tabs dan SFSafariViewController iOS mengekspos kontrol native yang berbeda, sehingga opsinya dibagi menjadi AndroidBrowserOptions dan IosBrowserOptions. Setiap platform mengabaikan opsi milik platform lainnya. Semua field bersifat opsional dan secara default bernilai null. Untuk field null, SDK tidak menetapkan opsi tersebut dan platform menerapkan default-nya sendiri.
Android — Custom Tab
Android — Custom Tab
Color?
Warna latar toolbar.
Warna navigation bar.
Warna pemisah di atas navigation bar.
CloseButtonStyle?
standard menampilkan ikon “X” sistem. back menampilkan panah kembali yang digambar oleh SDK.CloseButtonPosition?
Sisi toolbar tempat tombol tutup muncul:
start atau end.Menampilkan ikon bagikan pada toolbar.
false menyembunyikannya.bool?
Menampilkan judul halaman di bawah URL pada toolbar.
bool?
Menyembunyikan toolbar secara otomatis saat halaman digulir.
bool?
Menampilkan “Bookmark this page” dalam menu overflow.
bool?
Menampilkan “Download page” dalam menu overflow.
BrowserColorScheme?
light atau dark memaksa tampilan tersebut terlepas dari pengaturan sistem perangkat. system mengikuti pengaturan sistem.iOS — SFSafariViewController
iOS — SFSafariViewController
DismissButtonStyle?
Gaya tombol tutup:
done, close, atau cancel. iOS menentukan apakah tombol tersebut ditampilkan sebagai label atau ikon.PresentationStyle?
pageSheet (digunakan ketika Anda membiarkan null) menampilkan kartu yang dapat di-swipe ke bawah oleh customer untuk ditutup. fullScreen mencakup seluruh layar.bool?
Memungkinkan toolbar diciutkan saat halaman digulir. Pengaturan ini hanya terlihat efeknya ketika
presentationStyle bernilai fullScreen. Dengan pageSheet, bar tetap tersemat terlepas dari pengaturan ini.BrowserColorScheme?
light atau dark memaksa tampilan tersebut terlepas dari pengaturan sistem perangkat. system mengikuti pengaturan sistem.SFSafariViewController yang mendasarinya tidak digunakan lagi sejak iOS 26.
Error
start hanya melempar CheckoutException jika terjadi penggunaan yang salah atau kegagalan platform. Baca alasannya dari code, sebuah CheckoutErrorCode. String native code berada di nativeCode.
Customer yang membatalkan, atau pembayaran yang ditolak, selalu merupakan hasil, bukan exception.
invalidCheckoutUrl(INVALID_CHECKOUT_URL):checkoutUrlbukan URL checkout sessionhttps(path yang dimulai dengan/session/) dicheckout.dodopayments.comatautest.checkout.dodopayments.com.invalidReturnUrl(INVALID_RETURN_URL):returnUrlbukan URL absolut dengan skema dan host.alreadyInProgress(ALREADY_IN_PROGRESS): checkout lain sedang berjalan. Hanya satu checkout yang dapat berjalan pada satu waktu.platformError(PLATFORM_ERROR): kegagalan platform yang tidak terduga. Native error yang tidak diketahui juga dipetakan ke kode ini.
Session yang Ditinggalkan
Native SDK mencatat checkout session saat checkout dimulai, dan menghapus catatan tersebut hanya ketika checkout berakhir dengan
succeeded, failed, atau expired. Catatan tersebut tetap ada ketika aplikasi dihentikan selama checkout, serta setelah hasil cancelled atau pending. Periksa catatan tersebut saat peluncuran berikutnya dan setelah setiap hasil cancelled atau pending.abandoned.sessionId adalah ID checkout session, yang dimulai dengan cks_. abandoned.createdAt adalah DateTime saat checkout dimulai. Backend Anda dapat mencari session tersebut menggunakan Get Checkout Session, yang mengembalikan payment_id dan payment_status. Hingga pembayaran mencapai status final, perlakukan pembayaran tersebut sebagai pending, bukan gagal.
Terkait
Mobile Integration Guide
Kontrak yang sama untuk Android, iOS, dan React Native.
Community Projects
Package Flutter terpisah yang dibuat komunitas juga tersedia.