Skip to main content
Ruby SDK 让 Ruby 应用可以访问 Dodo Payments REST API。它使用标准库的 net/http 和连接池发送请求,重试失败的请求,为你遍历分页列表,并提供 RBI 和 RBS 类型定义。

安装

将 gem 添加到您的 Gemfile:
Gemfile
SDK 版本会增加对 API 变更的支持。定期运行 bundle update dodopayments 以保持最新。
然后安装它:
SDK 要求 Ruby 3.2.0 或更高版本。

快速开始

创建一个 client,然后创建一个 checkout session:
如果省略 bearer_token,client 会读取 DODO_PAYMENTS_API_KEY 环境变量。如果省略 environment,client 会连接到 live mode。test mode API key 只能与 environment: "test_mode" 配合使用。
请将 API keys 保存在环境变量或 secrets manager 中。切勿将它们提交到版本控制系统,或在代码中公开它们。

核心功能

Ruby Conventions

使用 snake_case 方法和关键字参数,嵌套参数也接受普通 hash。

Elegant Syntax

Responses 是带有 attribute readers 的对象,obj[:prop] 还可以读取 SDK 未定义的字段。

Auto-Pagination

auto_paging_each 会遍历每个 item,并在需要时获取下一页。

Type Safety

用于 Sorbet 的 RBI 定义,不依赖 sorbet-runtime。

配置

Dodopayments::Client.new 接受 bearer_token、webhook_key、environment、base_url、max_retries、timeout、initial_retry_delay 和 max_retry_delay。省略这些参数时,它会从环境中读取 DODO_PAYMENTS_API_KEY、DODO_PAYMENTS_WEBHOOK_KEY(你的 webhook signing secret)和 DODO_PAYMENTS_BASE_URL。client 是 thread-safe 的,并维护自己的连接池,因此请为应用创建一个 client 并重复使用它。 要验证 webhook,请将原始请求 body 和 headers 传递给 dodo_payments.webhooks.unwrap(payload, headers: headers)。它会使用你的 webhook key 检查 signature,并返回解析后的 event。dodo_payments.webhooks.unsafe_unwrap(payload) 会在不验证的情况下解析 body,因此只能用于测试。请参阅 Webhooks。

Timeout 配置

Requests 默认在 60 秒后超时。在 client 或单个 request 上以秒为单位设置 timeout:
当 request 超时时,SDK 会抛出 Dodopayments::Errors::APITimeoutError。超时的 requests 默认会重试。

Retry 配置

SDK 会重试 connection errors、timeouts,以及 status 为 408、409、429 或 500 及以上的 responses。默认重试两次,并采用短暂的 exponential backoff。在 client 或单个 request 上设置 max_retries:

常见操作

本节中的示例使用 Quick Start 中的 dodo_payments client。

创建 Checkout Session

创建一个 checkout session,然后将 customer 重定向到返回的 checkout_url:
每个 checkout URL 只能使用一次,并在 24 小时后过期。有关每个 session option 的信息,请参阅 Checkout Sessions。

管理 Customers

使用 email address 和 name 创建一个 customer,然后通过 ID 获取它:

处理 Subscriptions

创建 subscription、为 on-demand subscription 收费,以及更新 subscription 的 metadata。
POST /subscriptions(SDK 的 subscriptions.create method)已被 deprecated。它仍适用于现有 integrations,但新的 integrations 应通过 Checkout Session 创建 subscriptions。
billing 只需要 country,即两位字母的 ISO country code。customer 接受 { customer_id: "..." } 以关联现有 customer,或接受 { email: "...", name: "..." } 以创建 customer。charge 用于 on-demand subscriptions,而 product_price 使用最小货币单位表示。

分页

自动分页

List methods 会返回一页数据。读取 items 获取当前页,或调用 auto_paging_each 遍历每个 item。它会在需要时获取下一页:

手动分页

如需逐页移动,请调用 next_page? 和 next_page:

错误处理

当 SDK 无法连接到 API,或 API 返回 4xx 或 5xx status 时,SDK 会抛出 Dodopayments::Errors::APIError 的子类:
错误类取决于具体原因。每个 error 都有 status、headers 和 body attributes:
SDK 已经使用 exponential backoff 重试 429 responses。RateLimitError 表示这些重试也失败了,因此请等待更长时间后再重新发送 request。

使用 Sorbet 确保类型安全

SDK 提供 RBI 定义,并不依赖 sorbet-runtime。要对 request parameters 进行类型检查,请传递 model classes,而不是 hashes:

高级用法

未文档化的 Endpoints

要调用没有 SDK method 的 endpoint,请使用 request。它会应用与 SDK methods 相同的 authentication 和 retries:

未文档化的 Parameters

要发送 SDK 未定义的 parameters,请将它们传入 request_options。名称与已文档化 parameter 相同的 extra_* parameter 会覆盖该 parameter:

Rails 集成

创建 Initializer

在 Rails 启动时,于 config/initializers/dodo_payments.rb 中创建一个 client:

Service Object 模式

将 client 封装在 service object 中:

Controller 集成

从 controller 调用 service,并重定向到 checkout page:

Sinatra 集成

在 configure block 中创建一次 client,并在 routes 中使用它:

资源

GitHub Repository

源代码、releases 和完整的 method 列表。

API Reference

每个 endpoint、parameter 和 response。

Discord Community

提问并与其他开发者交流。

Report Issues

报告 bugs 或请求 features。

支持

如需 Ruby SDK 帮助:

贡献

如需贡献,请阅读 contributing guidelines。
最后修改于 2026年9月26日