Skip to main content

GitHub Repository

完整源代码与设置指南
查看 Dodo Payments Supabase Subscription Starter — 一个完整的 Next.js、Supabase 和 Dodo Payments boilerplate,包含身份验证、支付和 webhooks。

快速设置

1. 前置条件

你需要:
  • 一个已创建项目的 Supabase 账户
  • 在 dashboard 中通过 Developer → API Keys 获取的 Dodo Payments API key

2. 身份验证与关联

在 Supabase dashboard 的 Project Settings 中找到你的 project ref。

3. 数据库设置

  1. 前往 Supabase dashboard。
  2. 打开 SQL Editor。
  3. 复制 schema.sql 的全部内容并运行。

4. 设置初始密钥

Supabase 会在运行时自动提供 SUPABASE_URL 和 SUPABASE_SERVICE_ROLE_KEY。
部署完成后,获取 webhook URL 后,再设置 DODO_PAYMENTS_WEBHOOK_KEY。

5. 部署

该 function 已在 functions/webhook/index.ts 中设置完成。

6. 获取你的 Webhook URL

你的 webhook URL 是:

7. 在 DodoPayments Dashboard 中注册 Webhook

  1. 在 Dodo Payments dashboard 中前往 Developer → Webhooks。
  2. 点击 Add endpoint。
  3. 输入你的 webhook URL。
  4. 选择以下事件:subscription.active、subscription.cancelled、subscription.renewed。
  5. 点击 Create endpoint 并复制 signing secret。

8. 设置 Webhook Key 并重新部署

功能说明

webhook handler 会处理订阅事件,并将其存储在 Supabase PostgreSQL 中:
  • subscription.active — 创建或更新客户和订阅记录
  • subscription.cancelled — 将订阅标记为已取消
  • subscription.renewed — 更新下次计费日期

主要功能

  • Signature verification — 使用 Dodo Payments SDK 验证 webhook 的真实性
  • Idempotency — 使用 webhook-id header 防止重复处理
  • Event logging — 将所有事件存储在 webhook_events table 中,以便进行审计
  • Error handling — 记录失败并将事件标记为待重试
此示例使用最少的字段处理三个核心订阅事件。你可以根据需求扩展它,以支持其他事件类型和字段。

配置文件

数据库架构

已创建的表:
  • customers — 电子邮箱、姓名和 Dodo Payments customer ID
  • subscriptions — 状态、金额、下次计费日期,以及关联的客户
  • webhook_events — 包含 webhook ID 的事件日志,用于幂等性处理

实现代码

工作原理

基于 Deno 的 Edge Function 会:
  1. 验证签名 — 使用 Dodo Payments SDK 进行 HMAC-SHA256 验证
  2. 检查重复事件 — 使用 webhook-id header 防止重复处理
  3. 记录事件 — 将原始 webhook 数据存储在 webhook_events table 中
  4. 处理更新 — 通过 Supabase client 创建或更新客户和订阅
  5. 处理错误 — 记录失败并将事件标记为待重试

测试

本地开发:
由于 webhooks 不包含 JWT tokens,因此必须使用 --no-verify-jwt flag。安全性由 webhook 签名验证提供。
查看日志:
或者在 Supabase dashboard 中前往 Edge Functions → webhook → Logs。 在 Dodo Payments dashboard 中配置:
  1. 前往 Developer → Webhooks。
  2. 使用你的 Supabase URL 添加 endpoint。
  3. 选择 subscription.active、subscription.cancelled 和 subscription.renewed。

常见问题

资源

最后修改于 2026年9月26日