Sequence 遍历结果,并使用 suspend 函数执行异步调用。
安装
Gradle (Kotlin DSL)
在你的build.gradle.kts 中添加依赖:
build.gradle.kts
Maven
在你的pom.xml 中添加依赖:
pom.xml
SDK 要求 Java 8 或更高版本。它可以在 JVM 和 Android 上运行,并附带 ProGuard 和 R8 keep 规则。
快速开始
创建客户端,然后创建结账会话:fromEnv() 默认连接到 live mode,除非 DODO_PAYMENTS_BASE_URL 或 dodopayments.baseUrl 另有说明。要使用 test mode,请参阅 Test Mode。test mode API key 只能在 test mode 中使用。
核心功能
Coroutines
异步客户端的方法是
suspend 函数,应从协程中调用。Null Safety
可能缺失的字段是可空类型,而不是
Optional。Sequences
在同步客户端上,
autoPager() 返回一个 Sequence,你可以遍历它来获取更多页面。在异步客户端上,它返回一个 Flow。Immutable Models
模型类是不可变的,
toBuilder() 会返回一个用于创建修改后副本的构建器。配置
从环境变量配置
fromEnv() 从环境变量或系统属性读取设置。系统属性优先:
DODO_PAYMENTS_API_KEY 或 dodopayments.apiKey。Webhook signing secret 来自 DODO_PAYMENTS_WEBHOOK_KEY 或 dodopayments.webhookKey,base URL 来自 DODO_PAYMENTS_BASE_URL 或 dodopayments.baseUrl。请创建一个客户端并重复使用,因为每个客户端都有自己的连接池和线程池。
要验证 webhook,请将原始请求正文和请求头传递给 client.webhooks().unwrap(UnwrapWebhookParams.builder().body(rawBody).headers(headers).build()),其中 headers 是一个 com.dodopayments.api.core.http.Headers。它会使用你的 webhook key 检查签名,并返回解析后的事件;验证失败时会抛出 DodoPaymentsWebhookException。如果不提供请求头,unwrap 不会验证签名。client.webhooks().unsafeUnwrap(rawBody) 会在不验证签名的情况下解析正文,因此只能用于测试。请参阅 Webhooks。
手动配置
在构建器上设置每个选项:Test Mode
要使用 test mode(https://test.dodopayments.com),请在构建器上调用 testMode():
超时和重试
默认情况下,客户端会重试两次,并在 1 分钟后超时。对于连接错误以及状态为 408、409、429 或 500 及以上的响应,客户端会使用指数退避进行重试。在客户端上设置默认值,或将RequestOptions 传递给单次调用:
常见操作
本节中的示例使用 Quick Start 中的client。
创建结账会话
创建结账会话,然后将客户重定向到返回的结账 URL:checkoutUrl() 返回一个可空的 String?。每个结账 URL 只能使用一次,并会在 24 小时后过期。有关每个会话选项,请参阅 Checkout Sessions。
创建产品
创建一个价格为 $29.99 的月度订阅产品:price 以货币的最小单位表示。discountBps 以基点设置折扣,并替代已弃用的 discount 字段。
激活 License Key
为设备或安装激活 License Key。如果该密钥已达到激活次数限制,API 会返回422,SDK 会抛出 UnprocessableEntityException。未激活的密钥会返回 403(PermissionDeniedException),未知密钥会返回 404(NotFoundException):
处理订阅
创建订阅;如果是按需订阅,则对其收费。billing 只需要 country,即两个字母的 ISO 国家代码。使用 AttachExistingCustomer 关联现有客户,或使用 NewCustomer 创建客户。charge 用于按需订阅,productPrice 以货币的最小单位表示。基于用量的计费
记录用量事件
向客户发送用量事件。跟踪该事件的eventName 会对其进行聚合:
eventId 是幂等键,因此请为每个事件提供唯一值。每个请求最多接受 1,000 个事件。
异步操作
异步客户端
异步客户端与同步客户端具有相同的方法,但其中大多数是suspend 函数。请从协程中调用它们:
client.async(),以获取其异步版本。
错误处理
对于错误状态,SDK 会抛出DodoPaymentsServiceException 的子类,该类包含 statusCode()、headers() 和 body()。其子类包括 BadRequestException(400)、UnauthorizedException(401)、PermissionDeniedException(403)、NotFoundException(404)、UnprocessableEntityException(422)、RateLimitException(429)、InternalServerException(5xx),以及用于其他状态(例如 409)的 UnexpectedStatusCodeException:
DodoPaymentsIoException,SDK 无法解析的响应会抛出 DodoPaymentsInvalidDataException。所有 SDK 异常都继承自 DodoPaymentsException。
函数式错误处理
使用Result 进行函数式错误处理:
Android 集成
Kotlin SDK 是一个服务器端 SDK。它使用你的 secret API key 进行身份验证,任何拥有你的 APK 的人都可以提取其中编译的密钥,因此绝不要在 Android 应用中使用它。 要在 Android 应用中收款:- 在你的服务器上,使用此 SDK 创建 checkout session(参见 Ktor 集成),并返回其
checkout_url。 - 在应用中,从你的服务器获取该
checkout_url,并使用不包含 API key 的 Android SDK 打开它。
响应验证
默认情况下,SDK 仅会在你读取类型异常的属性时抛出DodoPaymentsInvalidDataException。若要预先检查整个响应,请为请求启用验证,或在响应上调用 validate():
高级功能
代理配置
要通过代理发送请求,请将java.net.Proxy 传递给 builder:
临时配置
withOptions 会返回一个设置经过修改的客户端,该客户端与原始客户端共享连接池和线程池。原始客户端不会发生变化:
Ktor 集成
创建一次客户端,然后从路由中调用它:资源
GitHub Repository
源代码、发行版本和完整的方法列表。
API Reference
每个 endpoint、参数和响应。
Discord Community
提出问题并与其他开发者交流。
Report Issues
报告 bug 或请求新功能。
支持
如需 Kotlin SDK 方面的帮助:- Discord:加入社区服务器获取实时帮助。
- Email:联系 support@dodopayments.com。
- GitHub:在代码仓库中提交 issue。