安装
将 gem 添加到您的 Gemfile:Gemfile
复制
gem "dodopayments", "~> 1.61.5"
始终使用最新的 SDK 版本以访问最新的 Dodo Payments 功能。定期运行
bundle update dodopayments 以保持更新。复制
bundle install
该 SDK 支持 Ruby 3.2.0 及更高版本,具有全面的类型、错误处理和重试机制。
快速开始
初始化客户端并创建结账会话:复制
require "bundler/setup"
require "dodopayments"
dodo_payments = Dodopayments::Client.new(
bearer_token: ENV["DODO_PAYMENTS_API_KEY"], # This is the default and can be omitted
environment: "test_mode" # defaults to "live_mode"
)
checkout_session_response = dodo_payments.checkout_sessions.create(
product_cart: [{product_id: "product_id", quantity: 1}]
)
puts(checkout_session_response.session_id)
使用环境变量安全存储您的 API 密钥。切勿将其提交到版本控制或在代码中暴露。
核心功能
Ruby 约定
遵循 Ruby 命名约定和习惯用法
优雅的语法
干净、可读的 API,符合 Ruby 开发者的习惯
自动分页
内置自动分页迭代器,用于列表响应
类型安全
可选的 Sorbet 类型以增强类型安全
配置
超时配置
配置请求超时:复制
# Configure default for all requests (default is 60 seconds)
dodo_payments = Dodopayments::Client.new(
timeout: nil # disable timeout
)
# Or, configure per-request
dodo_payments.checkout_sessions.create(
product_cart: [{product_id: "product_id", quantity: 0}],
request_options: {timeout: 5}
)
重试配置
配置自动重试行为:复制
# Configure default for all requests (default is 2)
dodo_payments = Dodopayments::Client.new(
max_retries: 0 # disable retries
)
# Or, configure per-request
dodo_payments.checkout_sessions.create(
product_cart: [{product_id: "product_id", quantity: 0}],
request_options: {max_retries: 5}
)
常见操作
创建结账会话
生成结账会话:复制
session = dodo_payments.checkout_sessions.create(
product_cart: [
{
product_id: "prod_123",
quantity: 1
}
],
return_url: "https://yourdomain.com/return"
)
# Redirect to checkout
redirect_to session.url
管理客户
创建和检索客户信息:复制
# Create a customer
customer = dodo_payments.customers.create(
email: "[email protected]",
name: "John Doe",
metadata: {
user_id: "12345"
}
)
# Retrieve customer
customer = dodo_payments.customers.retrieve("cus_123")
puts "Customer: #{customer.name} (#{customer.email})"
处理订阅
创建和管理定期订阅:复制
# Create a subscription
subscription = dodo_payments.subscriptions.create(
customer_id: "cus_123",
product_id: "prod_456",
price_id: "price_789"
)
# Update subscription
updated = dodo_payments.subscriptions.update(
subscription.id,
metadata: { plan_type: "premium" }
)
# Cancel subscription
dodo_payments.subscriptions.cancel(subscription.id)
分页
自动分页
自动遍历所有页面:复制
page = dodo_payments.payments.list
# Fetch single item from page
payment = page.items[0]
puts(payment.brand_id)
# Automatically fetches more pages as needed
page.auto_paging_each do |payment|
puts(payment.brand_id)
end
手动分页
获取更多分页控制:复制
page = dodo_payments.payments.list
if page.next_page?
new_page = page.next_page
puts(new_page.items[0].brand_id)
end
错误处理
处理各种 Dodo Payments API 错误:复制
begin
checkout_session = dodo_payments.checkout_sessions.create(
product_cart: [{product_id: "product_id", quantity: 0}]
)
rescue Dodopayments::Errors::APIConnectionError => e
puts("The server could not be reached")
puts(e.cause) # an underlying Exception, likely raised within `net/http`
rescue Dodopayments::Errors::RateLimitError => e
puts("A 429 status code was received; we should back off a bit.")
rescue Dodopayments::Errors::APIStatusError => e
puts("Another non-200-range status code was received")
puts(e.status)
end
实现带有指数退避的重试逻辑,以处理速率限制错误,确保您的应用程序能够优雅地处理高流量场景。
使用 Sorbet 的类型安全
使用 Sorbet 进行类型安全的请求参数:复制
# Type-safe using Sorbet RBI definitions
dodo_payments.checkout_sessions.create(
product_cart: [
Dodopayments::CheckoutSessionRequest::ProductCart.new(
product_id: "product_id",
quantity: 0
)
]
)
# Hashes work, but are not typesafe
dodo_payments.checkout_sessions.create(
product_cart: [{product_id: "product_id", quantity: 0}]
)
# You can also splat a full Params class
params = Dodopayments::CheckoutSessionCreateParams.new(
product_cart: [
Dodopayments::CheckoutSessionRequest::ProductCart.new(
product_id: "product_id",
quantity: 0
)
]
)
dodo_payments.checkout_sessions.create(**params)
高级用法
未记录的端点
向未记录的端点发出请求:复制
response = dodo_payments.request(
method: :post,
path: '/undocumented/endpoint',
query: {"dog": "woof"},
headers: {"useful-header": "interesting-value"},
body: {"hello": "world"}
)
未记录的参数
发送未记录的参数:复制
checkout_session_response = dodo_payments.checkout_sessions.create(
product_cart: [{product_id: "product_id", quantity: 0}],
request_options: {
extra_query: {my_query_parameter: value},
extra_body: {my_body_parameter: value},
extra_headers: {"my-header": value}
}
)
# Access undocumented response properties
puts(checkout_session_response[:my_undocumented_property])
Rails 集成
创建初始化器
创建config/initializers/dodo_payments.rb:
复制
require "dodopayments"
DODO_CLIENT = Dodopayments::Client.new(
bearer_token: Rails.application.credentials.dodo_api_key,
environment: Rails.env.production? ? "live_mode" : "test_mode"
)
服务对象模式
创建支付服务:复制
# app/services/payment_service.rb
class PaymentService
def initialize
@client = DODO_CLIENT
end
def create_checkout(items)
@client.checkout_sessions.create(
product_cart: items,
return_url: Rails.application.routes.url_helpers.checkout_return_url
)
end
def process_payment(amount:, currency:, customer_id:)
@client.payments.create(
amount: amount,
currency: currency,
customer_id: customer_id
)
end
end
控制器集成
在您的 Rails 控制器中使用:复制
# app/controllers/checkouts_controller.rb
class CheckoutsController < ApplicationController
def create
service = PaymentService.new
session = service.create_checkout(checkout_params[:items])
redirect_to session.url, allow_other_host: true
rescue Dodopayments::Errors::APIError => e
flash[:error] = "Payment error: #{e.message}"
redirect_to cart_path
end
private
def checkout_params
params.require(:checkout).permit(items: [:product_id, :quantity])
end
end
Sinatra 集成
在 Sinatra 应用程序中使用:复制
require "sinatra"
require "dodopayments"
configure do
set :dodo_client, Dodopayments::Client.new(
bearer_token: ENV["DODO_API_KEY"]
)
end
post "/create-checkout" do
content_type :json
begin
session = settings.dodo_client.checkout_sessions.create(
product_cart: JSON.parse(request.body.read)["items"],
return_url: "#{request.base_url}/return"
)
{ checkout_url: session.url }.to_json
rescue Dodopayments::Errors::APIError => e
status 400
{ error: e.message }.to_json
end
end
资源
支持
需要 Ruby SDK 的帮助吗?- Discord:加入我们的 社区服务器 获取实时支持
- 电子邮件:通过 [email protected] 联系我们
- GitHub:在 仓库 上打开问题