GitHub Repository
FastAPI 和 Dodo Payments boilerplate 的源代码。
概述
FastAPI boilerplate 是一个已经连接 Dodo Payments 的 Python 后端。它包含用于创建 checkout sessions 和 Customer Portal sessions 的 endpoints、用于验证 signatures 的 webhook endpoint,以及使用 Jinja2 templates 渲染的 pricing page。此 boilerplate 使用 FastAPI 和
async route handlers、Pydantic 进行 validation 和 settings 管理,以及 dodopayments Python SDK。Handlers 调用同步的 DodoPayments client。为避免阻塞 event loop,请切换到 AsyncDodoPayments,并对其调用使用 await。特性
此 boilerplate 包含:- 快速设置:从克隆到运行服务器大约只需五分钟。
- Async Handlers:Route handlers 是 FastAPI
async deffunctions。 - Checkout Sessions:预配置的 checkout endpoint,使用 Python SDK。
- Webhook Handling:使用 SDK 的
unwrapmethod 验证每个 signature 的 webhook endpoint。 - Customer Portal:用于创建 Customer Portal sessions 的 endpoint。
- Type Safety:Pydantic models 验证 request bodies,代码使用 type hints。
- Environment Configuration:
pydantic-settings从.env加载并验证 configuration。
前置条件
开始之前,你需要:- Python 3.9 或更高版本,
dodopaymentsSDK 需要此版本。建议使用 Python 3.11 或更高版本。 - 用于 package management 的 pip 或 uv。
- Dodo Payments 账户,用于在 dashboard 中创建 API key 和 webhook signing secret。
快速开始
1
Clone the Repository
2
Create Virtual Environment
设置隔离的 Python environment:或者使用 uv,以更快地管理 dependencies:
3
Install Dependencies
4
Get API Credentials
在 Dodo Payments 注册,然后从 dashboard 获取 credentials:
- API Key: 在 Dashboard → Developer → API Keys 下创建 key。
- Webhook Key: 在 Dashboard → Developer → Webhooks 下添加 endpoint,然后复制其 signing secret。Endpoint URL 必须公开且使用 HTTPS。若要在本机接收 events,请参阅在本地测试 Webhooks。
5
Configure Environment Variables
复制示例文件,在根目录中创建 将值设置为你的 Dodo Payments credentials:四个 variables 都是必需的。
.env 文件:.env
app/core/config.py 使用 pydantic-settings 加载它们;如果其中一项缺失或为空,app 将无法启动。DODO_PAYMENTS_RETURN_URL 是 checkout 在付款后将 customer 发送到的位置。6
Add Your Products
将
app/lib/products.py 中的示例 products 替换为你自己的 products。将每个 product_id 设置为 dashboard 中 Products 下某个 product 的 ID。Pricing page 会显示这些 products。7
Run the Development Server
Swagger UI 会列出
/api/checkout/、/api/webhook/ 和 /api/customer-portal/ endpoints,可直接进行测试。http://localhost:8000 提供定价页面。项目结构
API 端点
app/main.py 会将每个路由器挂载到 /api 前缀下:
每个路径都以斜杠结尾。FastAPI 会使用
307 重定向来响应不带斜杠的路径请求,因此请使用准确的路径,尤其是在 webhook URL 中。
代码示例
这些示例整理自app/api/ 中的文件。
创建结账会话
app/api/checkout.py 会创建结账会话并返回其 checkout_url。请求正文接受一个 product_id、一个可选的 quantity,以及一个可选的 customer 对象,其中包含 name 和 email:
处理 Webhooks
app/api/webhook.py 使用 SDK 的 unwrap 方法验证签名,然后根据事件类型进行分支处理:
Customer Portal 集成
app/api/portal.py 为客户 ID 创建 Customer Portal 会话,并将门户链接作为 url 返回:
app/templates/index.html 中的定价页面会向此端点发送硬编码的客户 ID(cus_001),并向结账端点发送硬编码的姓名和电子邮件。请将其替换为已登录用户的信息。
Webhook 事件
app/api/webhook.py 中的处理程序会根据以下事件进行分支处理:
要处理其他事件,请为其类型添加分支,例如为处理成功的退款添加
refund.succeeded。有关所有事件类型,请参阅 Webhook 事件指南。
在 webhook 处理程序中添加业务逻辑,以执行以下操作:
- 更新数据库中的用户权限
- 发送确认电子邮件
- 为数字产品配置访问权限
- 跟踪分析数据和指标
在本地测试 Webhooks
Dodo Payments 无法访问localhost。进行本地开发时,请使用 ngrok 等工具公开本地服务器:
/api/webhook/,作为端点添加到 Dodo Payments Dashboard 中:
.env 中的 DODO_PAYMENTS_WEBHOOK_KEY,然后重新启动服务器。应用仅在启动时读取 .env。
部署
Docker
代码仓库中不包含Dockerfile。要在容器中运行应用,请将此 Dockerfile 添加到代码仓库根目录:
COPY . . 会复制构建上下文中的每个文件,包括 .env。要避免将密钥放入镜像中,请添加一个 .dockerignore 文件,其中列出 .env。然后构建镜像,并使用环境文件运行它:
生产环境注意事项
故障排除
Import errors or missing modules
Import errors or missing modules
确保虚拟环境已激活,并且依赖项已安装:
Server fails to start with Directory 'app/static' does not exist
Server fails to start with Directory 'app/static' does not exist
app/main.py 从 app/static 提供静态文件,但代码仓库中不包含该目录。使用 mkdir app/static 创建该目录,然后再次启动服务器。Checkout session creation fails
Checkout session creation fails
检查以下常见原因:
- 产品 ID 不存在于你的 Dodo Payments Dashboard 中。
.env中的 API key 或DODO_PAYMENTS_ENVIRONMENT不正确。测试模式密钥只能与test_mode一起使用。
400 响应中返回 SDK 错误。请检查 FastAPI 日志以获取详细的错误消息。Webhooks not receiving events
Webhooks not receiving events
进行本地测试时,请使用 ngrok 公开服务器:在你的 Dodo dashboard 中,添加一个端点,使用 ngrok URL 后接
/api/webhook/,并包含末尾斜杠。将该端点的签名密钥复制到你的 .env 文件中的 DODO_PAYMENTS_WEBHOOK_KEY。Webhook signature verification fails
Webhook signature verification fails
- 确保
.env中的DODO_PAYMENTS_WEBHOOK_KEY与端点的签名密钥一致。 - 在将请求解析为 JSON 之前,针对原始请求正文验证签名。
- 将全部三个
webhook-id、webhook-timestamp和webhook-signatureheaders 传递给client.webhooks.unwrap()。Standard Webhooks 签名涵盖id.timestamp.body,而不仅仅是正文。
了解更多
Python SDK
完整的 Python SDK 文档,支持异步
Webhooks Documentation
了解所有 webhook 事件和最佳实践
Checkout Sessions
深入了解结账会话配置
API Reference
完整的 Dodo Payments API 文档
支持
有关样板项目的帮助:- 在 Discord 社区 中提问。
- 在 GitHub 代码仓库 中报告问题并关注更新。
- 发送电子邮件至 支持团队。