本页面介绍官方 Dodo Payments iOS Swift 结账 SDK。它会在原生浏览器视图中打开 Dodo Payments 托管结账,并返回类型化结果。
Checkout Sessions API
从后端创建此 SDK 打开的
checkout_url。Mobile Integration Guide
了解此 SDK 如何融入完整的移动支付流程。
SFSafariViewController 中打开 Dodo Payments 托管结账,并在客户完成或离开结账时返回类型化的 CheckoutResult。它不保存 API key,也不包含网络代码,因此不会调用 Dodo Payments API。结账在浏览器视图中运行。SDK 负责呈现和关闭该视图,并从返回 URL 中读取结果。
**要求:**iOS 16 或更高版本,以及 Swift 6.2 或更高版本(该包声明 swift-tools-version: 6.2)。SDK 没有第三方依赖。
安装
1
Add the Package
在 Xcode 中,前往 File → Add Package Dependencies,然后输入包 URL:选择 1.1.0 或更高版本。外观自定义要求使用 1.1.0。若要改为在 库产品为
Package.swift 中添加该包,请添加以下依赖:Package.swift
DodoCheckout。2
Register a Callback URL Scheme
注册 URL scheme,使 iOS 将结账的返回 URL 路由回你的应用。在你的 你也可以在 Xcode 的 Info → URL Types 下添加 URL 类型。在传递给 SDK 的
Info.plist 中添加 URL 类型:Info.plist
returnUrl 中使用此 scheme,例如 myapp://checkout/return;同时,在后端创建会话时,将同一个 URL 设置为结账会话的 return_url。SDK 会根据 scheme、host 和 path 匹配返回 URL。该 URL 不需要加载真实页面。使用
DodoCheckout.start 是一个在主 actor 上运行的 async 函数。将后端返回的 checkout_url 构建为 URL,并将其作为 checkoutUrl 传入:
onEvent 接收 .opened、.returnReceived 和 .closed 事件。它们的 name 值分别为 checkout.opened、checkout.return_received 和 checkout.closed。事件仅用于日志记录,切勿用其决定结果。
转发返回 URL
SFSafariViewController 无法捕获自己的返回 URL,因此 iOS 会改为在你的应用中打开该 URL。将每个传入的 URL 转发给 DodoCheckout.handleOpenURL(_:)。在不使用 scenes 的应用中,请从应用 delegate 的 application(_:open:options:) 中调用它。
- SwiftUI
- SceneDelegate
你可以转发每个 URL。
handleOpenURL 只会处理与当前结账的 returnUrl 匹配的 URL,并为其返回 true。对于其他 URL,它会返回 false,因此请自行处理该 URL。结果含义
SDK 会根据返回 URL 中的查询参数构建CheckoutResult。
CheckoutStatus
必填
五个值之一:
succeeded:返回 URL 包含status=succeeded(一次性支付)或status=active(订阅)。failed:支付被拒绝(status=failed)。cancelled:返回 URL 到达前,客户关闭了面板。SDK 不知道结果,并且支付可能已经成功,因此不要显示失败页面。请改为对已放弃的会话进行对账。pending:支付稍后结算(status=processing或任何requires_*值),或者status参数缺失或无法识别。请按照cancelled的方式进行对账。expired:结账会话已过期(status=expired)。
String?
subscription_id 查询参数。用于订阅结账。[String]?
license_key 查询参数。结账包含 license key 产品时设置。String?
email 查询参数。结账捕获电子邮件地址时设置。[String: String]
返回 URL 中的每个查询参数,原样保留。
验证支付
Webhooks
支付成功或订阅激活时,Dodo Payments 会调用你的后端。
Get Payment Detail
使用你的 secret key 查询
paymentId,以检查其状态。result.status。
外观自定义
要更改面板的关闭按钮、呈现样式和配色方案,请将一个BrowserCustomization 作为 customization 传递给 start(...)。每个字段都是可选的。对于 nil 字段,SDK 不会设置该选项,而是由 iOS 应用自身的默认值。例外情况是 presentationStyle,此时 nil 表示 pageSheet。
DismissButtonStyle?
关闭按钮的样式:
done、close 或 cancel。iOS 会决定将其渲染为标签还是图标。PresentationStyle?
pageSheet(默认值)会呈现一个客户可以向下滑动关闭的卡片。fullScreen 会覆盖整个屏幕,且没有关闭手势。Bool?
允许工具栏在页面滚动时折叠。只有当
presentationStyle 为 fullScreen 时,该设置才会产生可见效果。使用 pageSheet 时,无论此设置如何,栏都会固定不动。ColorScheme?
light 或 dark 会强制使用对应外观,无论设备的系统设置如何。system 会遵循系统设置。此选项只会设置页面周围的原生控件主题。结账页面自身的浅色或深色模式来自结账会话中的 customization.theme,其颜色来自 customization.theme_config。SFSafariViewController 的 tint 属性自 iOS 26 起已弃用。
错误
start 仅会因误用或平台故障抛出 CheckoutError。请从 error.code 中读取原因。客户取消结账或支付被拒绝时,始终会返回结果,而不是抛出错误。
invalidCheckoutUrl(INVALID_CHECKOUT_URL):checkoutUrl不是 INLINE_CODE_PLACEHOLDER_4f449422f8a8b80ca_END 结账会话 URL(路径以/session/开头),且不在checkout.dodopayments.com或test.checkout.dodopayments.com上。invalidReturnUrl(INVALID_RETURN_URL):returnUrl不是包含 scheme 和 host 的绝对 URL。alreadyInProgress(ALREADY_IN_PROGRESS):另一个结账正在运行。一次只能运行一个结账。platformError(PLATFORM_ERROR):意外的平台故障,例如没有可用于呈现视图的 view controller。
alreadyInProgress:此时找到的记录属于仍在运行的结账。
已放弃的会话
SDK 会在呈现结账时记录结账会话,并且仅当结账以
succeeded、failed 或 expired 结束时清除该记录。如果应用在结账期间被终止,或者返回 cancelled 或 pending 结果,记录会保留。请在下次启动时,以及每次返回 cancelled 或 pending 结果后检查该记录。abandoned.sessionId 是结账会话 ID,以 cks_ 开头。abandoned.createdAt 是启动结账的 Date。你的后端可以使用 获取结账会话 查询该会话,该接口会返回其 payment_id 和 payment_status。在支付达到最终状态之前,请将其视为待处理,而不是失败。
相关内容
Mobile Integration Guide
Android、React Native 和 Flutter 使用相同的契约。
React Native SDK
在 iOS 上封装相同的 Swift 核心。