Skip to main content
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 pubspec.yaml:
pubspec.yaml
Kustomisasi tampilan memerlukan versi 1.1.0 atau lebih baru.Plugin Android dikompilasi menggunakan Android SDK 35 secara default. Jika plugin lain memerlukan 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.
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

Panggil DodoCheckout.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 membuat CheckoutResult dari parameter query pada URL pengembalian.
result.status adalah petunjuk UI, bukan bukti pembayaran. Konfirmasikan setiap pembayaran dari backend Anda, menggunakan webhook payment.succeeded atau subscription.active.
CheckoutStatus
wajib
Salah satu dari lima nilai:
  • succeeded: URL pengembalian memiliki status=succeeded (pembayaran satu kali) atau status=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=processing atau nilai requires_* apa pun), atau parameter status tidak ada atau tidak dikenali. Rekonsiliasikan seperti cancelled.
  • 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.
Berikan akses hanya setelah salah satu hal berikut mengonfirmasi pembayaran. Jangan hanya mengandalkan result.status.

Kustomisasi Tampilan

Untuk mengubah toolbar, tombol, dan skema warna browser checkout, teruskan BrowserCustomization 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.
Color?
Warna latar toolbar.
Color?
Warna navigation bar.
Color?
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.
bool?
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.
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.
iOS tidak memiliki opsi warna toolbar karena properti tint 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): checkoutUrl bukan URL checkout session https (path yang dimulai dengan /session/) di checkout.dodopayments.com atau test.checkout.dodopayments.com.
  • invalidReturnUrl (INVALID_RETURN_URL): returnUrl bukan 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.
Terakhir diubah pada 26 September 2026