Halaman ini membahas SDK checkout iOS resmi Dodo Payments untuk Swift. SDK ini membuka hosted checkout Dodo Payments dalam tampilan browser native dan mengembalikan hasil bertipe.
Checkout Sessions API
Buat
checkout_url yang dibuka SDK ini dari backend Anda.Mobile Integration Guide
Lihat bagaimana SDK ini sesuai dengan alur pembayaran mobile secara lengkap.
SFSafariViewController dan mengembalikan CheckoutResult bertipe ketika customer menyelesaikan atau meninggalkan checkout. SDK ini tidak menyimpan API key dan tidak berisi kode networking, sehingga tidak pernah memanggil API Dodo Payments. Checkout berjalan di browser view. SDK menampilkan dan menutup view tersebut serta membaca hasil dari return URL.
Persyaratan: iOS 16 atau lebih baru, dan Swift 6.2 atau lebih baru (package mendeklarasikan swift-tools-version: 6.2). SDK ini tidak memiliki dependency pihak ketiga.
Instalasi
1
Add the Package
Di Xcode, buka File → Add Package Dependencies dan masukkan URL package:Pilih versi 1.1.0 atau lebih baru. Kustomisasi tampilan memerlukan versi 1.1.0.Untuk menambahkan package di Produk library-nya adalah
Package.swift, tambahkan dependency ini:Package.swift
DodoCheckout.2
Register a Callback URL Scheme
Daftarkan URL scheme agar iOS mengarahkan return URL checkout kembali ke aplikasi Anda. Tambahkan URL type ke Anda juga dapat menambahkan URL type di Xcode melalui Info → URL Types.Gunakan scheme ini di
Info.plist Anda:Info.plist
returnUrl yang Anda teruskan ke SDK, misalnya myapp://checkout/return, dan tetapkan URL yang sama sebagai return_url pada checkout session ketika backend Anda membuat session tersebut. SDK mencocokkan return URL berdasarkan scheme, host, dan path. URL tersebut tidak perlu memuat halaman nyata.Penggunaan
DodoCheckout.start adalah fungsi async yang berjalan pada main actor. Teruskan checkoutUrl sebagai URL yang dibuat dari checkout_url yang dikembalikan backend Anda:
onEvent menerima event .opened, .returnReceived, dan .closed. Nilai name miliknya adalah checkout.opened, checkout.return_received, dan checkout.closed. Gunakan event hanya untuk logging, bukan untuk menentukan hasil.
Meneruskan Return URL
SFSafariViewController tidak dapat menangkap return URL-nya sendiri, sehingga iOS membuka URL tersebut di aplikasi Anda. Teruskan setiap URL masuk ke DodoCheckout.handleOpenURL(_:). Dalam aplikasi tanpa scene, panggil fungsi tersebut dari application(_:open:options:) milik app delegate Anda.
- SwiftUI
- SceneDelegate
Anda dapat meneruskan setiap URL.
handleOpenURL hanya bekerja pada URL yang cocok dengan returnUrl checkout yang sedang berlangsung, dan mengembalikan true untuk URL tersebut. Untuk URL lainnya, fungsi ini mengembalikan false, jadi tangani URL tersebut sendiri.Arti Hasil
SDK membuatCheckoutResult dari query parameter pada return URL.
CheckoutStatus
wajib
Salah satu dari lima nilai:
succeeded: return URL memilikistatus=succeeded(pembayaran satu kali) ataustatus=active(subscription).failed: pembayaran ditolak (status=failed).cancelled: customer menutup sheet sebelum return URL diterima. SDK tidak mengetahui hasilnya, dan pembayaran mungkin berhasil, jadi jangan tampilkan layar kegagalan. Rekonsiliasikan abandoned session sebagai gantinya.pending: pembayaran diselesaikan kemudian (status=processingatau nilairequires_*lainnya), atau parameterstatustidak ada atau tidak dikenali. Rekonsiliasikan seperticancelled.expired: checkout session kedaluwarsa (status=expired).
String?
Query parameter
payment_id, jika return URL menyertakannya. Tampilkan di UI Anda, tetapi jangan gunakan untuk memberikan akses. Lihat Verifikasi Pembayaran.String?
Query parameter
subscription_id. Ditetapkan untuk checkout subscription.[String]?
Query parameter
license_key. Ditetapkan ketika checkout mencakup produk license key.String?
Query parameter
email. Ditetapkan ketika checkout mengambil alamat email.[String: String]
Setiap query parameter dari return URL, apa adanya.
Verifikasi Pembayaran
Webhooks
Dodo Payments memanggil backend Anda ketika pembayaran berhasil atau subscription diaktifkan.
Get Payment Detail
Cari
paymentId menggunakan secret key Anda untuk memeriksa statusnya.result.status.
Kustomisasi Tampilan
Untuk mengubah tombol dismiss sheet, gaya presentasi, dan skema warna, teruskanBrowserCustomization sebagai customization ke start(...). Setiap field bersifat opsional. Untuk field nil, SDK tidak menetapkan opsi tersebut dan iOS menerapkan default-nya sendiri. Pengecualiannya adalah presentationStyle, yang mana nil berarti pageSheet.
DismissButtonStyle?
Gaya tombol dismiss:
done, close, atau cancel. iOS menentukan apakah tombol tersebut ditampilkan sebagai label atau ikon.PresentationStyle?
pageSheet (default) menampilkan card yang dapat di-swipe ke bawah oleh customer untuk ditutup. fullScreen menutupi seluruh layar dan tidak memiliki gesture dismiss.Bool?
Memungkinkan toolbar diciutkan saat halaman di-scroll. Opsi ini hanya terlihat efeknya ketika
presentationStyle bernilai fullScreen. Dengan pageSheet, bar tetap tertambat terlepas dari pengaturan ini.ColorScheme?
light atau dark memaksa tampilan tersebut terlepas dari pengaturan sistem perangkat. system mengikuti pengaturan sistem. Opsi ini hanya menerapkan tema pada kontrol native di sekitar halaman. Mode terang atau gelap halaman checkout ditentukan oleh customization.theme pada checkout session, sedangkan warnanya berasal dari customization.theme_config.SFSafariViewController yang mendasarinya tidak digunakan lagi sejak iOS 26.
Error
start hanya melempar CheckoutError jika terjadi kesalahan penggunaan atau kegagalan platform. Baca alasannya dari error.code. Customer yang membatalkan atau pembayaran yang ditolak selalu menjadi hasil, bukan error yang dilempar.
invalidCheckoutUrl(INVALID_CHECKOUT_URL):checkoutUrlbukan URL checkout sessionhttps(path yang diawali/session/) dicheckout.dodopayments.comatautest.checkout.dodopayments.com.invalidReturnUrl(INVALID_RETURN_URL):returnUrlbukan URL absolut dengan scheme 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, seperti tidak adanya view controller untuk melakukan present.
alreadyInProgress: record yang Anda temukan kemudian merupakan milik checkout yang masih berjalan.
Abandoned Session
SDK mencatat checkout session saat menampilkan checkout, dan menghapus record hanya ketika checkout berakhir dengan
succeeded, failed, atau expired. Record tetap tersimpan ketika aplikasi dihentikan selama checkout, serta setelah hasil cancelled atau pending. Periksa record tersebut saat peluncuran berikutnya dan setelah setiap hasil cancelled atau pending.abandoned.sessionId adalah ID checkout session, yang diawali dengan cks_. abandoned.createdAt adalah waktu checkout Date dimulai. Backend Anda dapat mencari session tersebut menggunakan Dapatkan Checkout Session, yang mengembalikan payment_id dan payment_status. Sampai pembayaran mencapai status final, perlakukan sebagai pending, bukan gagal.
Terkait
Mobile Integration Guide
Kontrak yang sama untuk Android, React Native, dan Flutter.
React Native SDK
Membungkus Swift core yang sama di iOS.