Skip to main content

概述

Better Auth 适配器 @dodopayments/better-auth 是一个将用户连接到 Dodo Payments 的 Better Auth 插件。它提供:
  • 可选的客户创建功能,或在注册时根据电子邮件关联客户
  • Checkout 会话(首选的 Checkout 方式),支持产品 slug 映射
  • 自助式 Customer Portal
  • 用于基于用量计费的用量接收和报告端点
  • 带签名验证的 Webhook 事件处理
  • 每个端点对应的 TypeScript 类型
要使用此集成,您需要一个 Dodo Payments 帐户和 API 密钥。

先决条件

  • Node.js 16 或更高版本
  • 访问 Dodo Payments 控制面板
  • 一个使用 Better Auth 1.4 或更高 1.x 版本的现有项目

安装

1

Install Dependencies

在项目根目录运行此命令:
适配器、Dodo Payments SDK、Better Auth 和 Zod 已安装。

设置

1

Configure Environment Variables

将这些变量添加到 .env 文件中。在控制面板的 Developer → API Keys 下创建 API key。添加 Webhook 端点时即可获得 Webhook secret,具体说明请参阅本页面的 Webhooks 部分。BETTER_AUTH_SECRET 是一个至少包含 32 个字符的随机字符串。
切勿将 API 密钥或密钥提交到版本控制。
2

Set Up Server-Side Integration

创建或更新 src/lib/auth.ts:
该插件会向 Better Auth 的 user 表添加 dodoCustomerId 字段,用于存储每个用户的 Dodo Payments 客户 ID。添加插件后,使用 Better Auth CLI 更新数据库 schema。
生产环境请将 environment 设置为 live_mode。
3

Set Up Client-Side Integration

创建或更新 src/lib/auth-client.ts:

用量示例

对于新的集成,请使用 authClient.dodopayments.checkoutSession。旧版 checkout 方法已弃用,仅为向后兼容而保留。

创建 Checkout 会话(首选)

根据已配置的 slug 或产品购物车创建 Checkout 会话,然后将客户重定向到返回的 URL:
checkoutSession 会为你填充部分字段:
  • 账单地址: 无需预先提供,因为 Checkout 会从客户处收集该信息。如需预填,请传入 billing_address。
  • 客户: 对于已登录用户,插件使用其 Better Auth 会话中的电子邮件和姓名,并忽略你传入的任何 customer 对象。没有已登录用户时,插件使用 customer 对象。
  • 其他字段: 该参数接受与 Create Checkout Session 端点请求体相同的字段,另外还支持 slug 和 referenceId。
如果未配置 slug,或者既未传入 slug 也未传入 product_cart,请求将失败并返回 400 错误。
返回 URL 来自服务器插件中配置的 successUrl,并根据应用的 URL 解析。插件会忽略客户端 payload 中的 return_url。

旧版 Checkout(已弃用)

authClient.dodopayments.checkout 方法已弃用。对于新的实现,请改用 checkoutSession。
旧版方法需要 billing 和 customer,并通过已弃用的动态 Checkout 流程创建支付链接。你在 customer 中设置的字段会覆盖会话中的电子邮件和姓名。

访问 Customer Portal

Portal 端点要求用户已登录且拥有已验证的电子邮件地址。如果用户尚无 Dodo Payments 客户,插件会通过电子邮件查找客户,或创建一个客户。INLINE_CODE_PLACEHOLDER_baf0df18400b3e6_END 会返回 Portal URL:

列出客户数据

列出已登录客户的订阅和支付记录。page 从 1 开始,status 用于筛选结果:

跟踪计量用量

在服务器上启用 usage() 插件,以记录基于用量计费的用量事件,并让客户查看其用量。两种方法都要求用户已登录且拥有已验证的电子邮件地址。
  • authClient.dodopayments.usage.ingest 为已登录用户记录事件。
  • authClient.dodopayments.usage.meters.list 列出已登录客户的用量事件。它接受 page_number、page_size、event_name、meter_id、start 和 end 查询参数。
Dodo Payments 会拒绝时间戳早于当前时间一小时以上或晚于当前时间五分钟以上的事件。
如果省略 meter_id,列表会包含客户的所有用量事件。使用 meter_id 后,列表仅包含与该 meter 匹配的事件。

Webhooks

Webhooks 插件会验证每个 Dodo Payments 事件的签名,并调用你的处理程序。默认端点为 /api/auth/dodopayments/webhooks。
1

Generate and Set Webhook Secret

在控制面板中,前往 Developer → Webhooks 并添加端点 URL,例如 https://<your-domain>/api/auth/dodopayments/webhooks。将端点的 signing secret 复制到 .env 文件中:
2

Handle Webhook Events

为每个要处理的事件传入一个处理程序。onPayload 会对每个事件运行:
如果签名验证失败或处理程序抛出错误,端点会返回 400。处理程序执行完毕后,端点会返回 { received: true }。

支持的 Webhook 事件处理程序

每个处理程序都会接收其事件类型对应的已验证 payload:

配置参考

  • client(必需):DodoPayments client 实例
  • createCustomerOnSignUp(可选):用户注册时创建 Dodo Payments 客户,或关联具有相同电子邮件的现有客户。当用户详细信息发生变化时,插件也会更新客户信息。
  • use(必需):要启用的插件数组(checkout、portal、usage、webhooks)
  • getCustomerParams(可选):接收 Better Auth User 并返回额外字段的函数,用于在创建和更新时附加到 Dodo Payments 客户(例如 metadata、phone_number)。该函数可以是 async 函数。
  • products:{ productId, slug } 对象数组,或返回一个对象的 async 函数
  • successUrl:支付成功后用于重定向的 URL
  • authenticatedUsersOnly:要求用户进行身份验证(默认值:false)

故障排除与提示

  • API key 无效:检查 .env 中的 DODO_PAYMENTS_API_KEY,并确认 key 的模式与 environment 匹配。
  • Webhook 签名不匹配:确认 Webhook secret 与 Dodo Payments 控制面板中设置的 secret 匹配。
  • 未创建客户:确认 createCustomerOnSignUp 已设置为 true。
  • Portal 或 usage 请求返回 401:用户的电子邮件地址尚未验证。
  • 对所有 secret 和 key 使用环境变量。
  • 在切换到 live_mode 前,先在 test_mode 中进行测试。
  • 记录 Webhook 事件以便调试和审计。

面向 LLM 的提示词

将此提示词复制到 AI 编程助手中,让它将适配器添加到你的项目中。如需同时向代理提供 Dodo Payments 文档和技能,请安装 Agent Plugin。
最后修改于 2026年9月26日