Checkout Handler
将 Dodo Payments 结账集成到您的 Fastify 应用中。
Customer Portal
允许客户管理订阅和详细信息。
Webhooks
接收和处理 Dodo Payments webhook 事件。
安装
1
Install the package
在项目根目录中运行以下命令:
npm install @dodopayments/fastify
2
Set up environment variables
在项目根目录中创建一个
.env 文件:DODO_PAYMENTS_API_KEY=your-api-key
DODO_PAYMENTS_RETURN_URL=https://yourapp.com/success
DODO_PAYMENTS_WEBHOOK_KEY=your-webhook-secret
DODO_PAYMENTS_ENVIRONMENT="test_mode" or "live_mode""
切勿提交您的
.env 文件或机密信息到版本控制。路由处理程序示例
所有示例假定您使用 Fastify App Router。
- Checkout Handler
- Customer Portal Handler
- Webhook Handler
使用此处理程序将 Dodo Payments 结账集成到您的 Fastify 应用中。支持静态 (GET)、动态 (POST) 和会话 (POST) 支付流程。
// route.ts
import { Checkout } from '@dodopayments/fastify';
import Fastify from 'fastify'
const fastify = Fastify({})
const checkoutGet = Checkout({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
type: 'static'
});
const checkoutPost = Checkout({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
type: 'dynamic'
});
const checkoutSession = Checkout({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
type: 'session'
});
fastify.get('/api/checkout', checkoutGet.getHandler);
fastify.post('/api/checkout', checkoutPost.postHandler);
fastify.post('/api/checkout-session', checkoutSession.postHandler);
curl --request GET \
--url 'https://example.com/api/checkout?productId=pdt_fqJhl7pxKWiLhwQR042rh' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test
curl --request POST \
--url https://example.com/api/checkout \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test \
--data '{
"billing": {
"city": "Texas",
"country": "US",
"state": "Texas",
"street": "56, hhh",
"zipcode": "560000"
},
"customer": {
"email": "test@example.com",
"name": "test"
},
"metadata": {},
"payment_link": true,
"product_id": "pdt_QMDuvLkbVzCRWRQjLNcs",
"quantity": 1,
"billing_currency": "USD",
"discount_codes": ["IKHZ23M9GQ"],
"return_url": "https://example.com",
"trial_period_days": 10
}'
curl --request POST \
--url https://example.com/api/checkout-session \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test \
--data '{
"product_cart": [
{
"product_id": "pdt_QMDuvLkbVzCRWRQjLNcs",
"quantity": 1
}
],
"customer": {
"email": "test@example.com",
"name": "test"
},
"return_url": "https://example.com/success"
}'
使用此处理程序允许客户通过 Dodo Payments 客户门户管理其订阅和详细信息。
// route.ts
import { CustomerPortal } from "@dodopayments/fastify";
import Fastify from 'fastify'
const fastify = Fastify({})
const customerPortalHandler = CustomerPortal({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT
});
fastify.get('/api/customer-portal', customerPortalHandler);
curl --request GET \
--url 'https://example.com/api/customer-portal?customer_id=cus_9VuW4K7O3GHwasENg31m&send_email=true' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test
使用此处理程序在您的 Fastify 应用中安全地接收和处理 Dodo Payments webhook 事件。
// route.ts
import Fastify from 'fastify'
import { Webhooks } from '@dodopayments/fastify'
const fastify = Fastify({})
fastify.addContentTypeParser('application/json', { parseAs: 'string' }, function (req, body, done) {
done(null, body)
})
fastify.post('/api/webhooks', Webhooks({
webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_KEY,
onPayload: async (payload) => {
// Handle Payload Here
console.log(payload)
}
}));
结账路由处理程序
Dodo Payments 支持三种类型的支付流程,此适配器支持所有类型的支付流程。
- 静态支付链接: 可即时分享的 URL,用于快速、无需代码的支付收集。
- 动态支付链接: 通过 API 或 SDK 编程生成带有自定义详细信息的支付链接。
- 结账会话: 创建安全、可定制的结账体验,具有预配置的产品购物车和客户详细信息。
Static Checkout (GET)
Static Checkout (GET)
支持的查询参数
string
必填
产品标识符(例如,
?productId=pdt_nZuwz45WAs64n3l07zpQR)。integer
产品数量。
string
客户全名。
string
客户名。
string
客户姓。
string
客户电子邮件地址。
string
客户国家。
string
客户地址行。
string
客户城市。
string
客户州/省。
string
客户邮政编码。
boolean
禁用全名字段。
boolean
禁用名字段。
boolean
禁用姓字段。
boolean
禁用电子邮件字段。
boolean
禁用国家字段。
boolean
禁用地址行字段。
boolean
禁用城市字段。
boolean
禁用州字段。
boolean
禁用邮政编码字段。
string
指定支付货币 (例如,
USD)。boolean
显示货币选择器。
integer
指定支付金额 (例如,
1000 对应 $10.00)。boolean
显示折扣字段。
string
任何以
metadata_ 开头的查询参数都将作为元数据传递。如果缺少
productId,处理程序将返回 400 响应。无效的查询参数也会导致 400 响应。响应格式
静态结账返回包含结账 URL 的 JSON 响应:{
"checkout_url": "https://checkout.dodopayments.com/..."
}
Dynamic Checkout (POST)
Dynamic Checkout (POST)
- 参数作为 JSON body 在 POST 请求中发送。
- 支持一次性付款和定期付款。
- 有关支持的 POST body 字段的完整列表,请参阅:
响应格式
动态结账返回包含结账 URL 的 JSON 响应:{
"checkout_url": "https://checkout.dodopayments.com/..."
}
客户门户路由处理程序
客户门户路由处理程序使您能够将 Dodo Payments 客户门户无缝集成到您的 Fastify 应用中。查询参数
string
必填
门户会话的客户 ID(例如,
?customer_id=cus_123)。boolean
如果设置为
true,则会向客户发送带有门户链接的电子邮件。如果缺少
customer_id,则返回 400。Webhook 路由处理程序
- 方法: 仅支持 POST 请求。其他方法返回 405。
- 签名验证: 使用
webhookKey验证 webhook 签名。如果验证失败则返回 401。 - 有效负载验证: 使用 Zod 验证。无效的负载返回 400。
- 错误处理:
- 401:无效签名
- 400:无效负载
- 500:验证期间的内部错误
- 事件路由: 根据负载类型调用相应的事件处理程序。
支持的 Webhook 事件处理程序
onPayload?: (payload: WebhookPayload) => Promise<void>;
onPaymentSucceeded?: (payload: WebhookPayload) => Promise<void>;
onPaymentFailed?: (payload: WebhookPayload) => Promise<void>;
onPaymentProcessing?: (payload: WebhookPayload) => Promise<void>;
onPaymentCancelled?: (payload: WebhookPayload) => Promise<void>;
onRefundSucceeded?: (payload: WebhookPayload) => Promise<void>;
onRefundFailed?: (payload: WebhookPayload) => Promise<void>;
onDisputeOpened?: (payload: WebhookPayload) => Promise<void>;
onDisputeExpired?: (payload: WebhookPayload) => Promise<void>;
onDisputeAccepted?: (payload: WebhookPayload) => Promise<void>;
onDisputeCancelled?: (payload: WebhookPayload) => Promise<void>;
onDisputeChallenged?: (payload: WebhookPayload) => Promise<void>;
onDisputeWon?: (payload: WebhookPayload) => Promise<void>;
onDisputeLost?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionActive?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionOnHold?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionRenewed?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionPlanChanged?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionCancelled?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionFailed?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionExpired?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionUpdated?: (payload: WebhookPayload) => Promise<void>;
onLicenseKeyCreated?: (payload: WebhookPayload) => Promise<void>;
onAbandonedCheckoutDetected?: (payload: WebhookPayload) => Promise<void>;
onAbandonedCheckoutRecovered?: (payload: WebhookPayload) => Promise<void>;
onDunningStarted?: (payload: WebhookPayload) => Promise<void>;
onDunningRecovered?: (payload: WebhookPayload) => Promise<void>;
onCreditAdded?: (payload: WebhookPayload) => Promise<void>;
onCreditDeducted?: (payload: WebhookPayload) => Promise<void>;
onCreditExpired?: (payload: WebhookPayload) => Promise<void>;
onCreditRolledOver?: (payload: WebhookPayload) => Promise<void>;
onCreditRolloverForfeited?: (payload: WebhookPayload) => Promise<void>;
onCreditOverageCharged?: (payload: WebhookPayload) => Promise<void>;
onCreditManualAdjustment?: (payload: WebhookPayload) => Promise<void>;
onCreditBalanceLow?: (payload: WebhookPayload) => Promise<void>;
LLM 提示
您是一名专家 Fastify 开发助手。您的任务是指导用户将 @dodopayments/fastify 适配器集成到他们现有的 Fastify 项目中。
@dodopayments/fastify 适配器提供 Dodo Payments 的结账、客户门户和 Webhook 功能的路由处理程序,设计可直接插入到 Fastify 应用中。
首先,安装必要的软件包。使用适合用户项目的包管理器(npm、yarn 或 bun):
npm install @dodopayments/fastify
---
您应按以下方式构建您的响应:
1. 问用户他们想集成哪些功能。
"您想将 @dodopayments/fastify 适配器的哪些部分集成到您的项目中?您可以选择以下一个或多个:
- 结账路由处理程序(用于处理产品结账)
- 客户门户路由处理程序(用于管理客户订阅/详细信息)
- Webhook 路由处理程序(用于接收 Dodo Payments webhook 事件)
- 全部(集成所有三个)"
---
2. 根据用户的选择,提供每个所选功能的详细集成步骤。
---
**如果选择了结账路由处理程序:**
**目的**:此处理程序将用户重定向到 Dodo Payments 结账页面。
**集成**:
在您的 Fastify 应用中创建两个路由——一个用于静态 (GET) 和一个用于动态 (POST) 结账。
import { Checkout } from '@dodopayments/fastify';
import Fastify from 'fastify'
const fastify = Fastify({})
const checkoutGet = Checkout({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
type: 'static'
});
const checkoutPost = Checkout({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
type: 'dynamic'
});
const checkoutSession = Checkout({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
type: 'session'
});
fastify.get('/api/checkout', checkoutGet.getHandler);
fastify.post('/api/checkout', checkoutPost.postHandler);
fastify.post('/api/checkout-session', checkoutSession.postHandler);
配置选项:
bearerToken:您的 Dodo Payments API 密钥(建议存储在 DODO_PAYMENTS_API_KEY 环境变量中)。
returnUrl(可选):成功结账后重定向用户的 URL。
environment:"test_mode" 或 "live_mode"
type:"static" (GET), "dynamic" (POST), 或 "session" (POST)
GET(静态结账)需要查询参数:
productId(必需)
数量、客户字段(全名、电子邮件等)和元数据(metadata_*)是可选的。
返回:{"checkout_url": "https://checkout.dodopayments.com/..."}
POST(动态结账)需要一个包含支付详细信息的 JSON body(一次性或订阅)。返回:{"checkout_url": "https://checkout.dodopayments.com/..."}。参考文档获取完整的 POST 模式:
一次性支付:https://docs.dodopayments.com/api-reference/payments/post-payments
订阅:https://docs.dodopayments.com/api-reference/subscriptions/post-subscriptions
POST(结账会话)-(推荐)提供更可定制的结账体验。返回包含 checkout_url 的 JSON:参数作为 JSON body 发送。支持一次性和定期付款。返回:{"checkout_url": "https://checkout.dodopayments.com/session/..."}。有关支持字段的完整列表,请参阅:
结账会话集成指南:https://docs.dodopayments.com/developer-resources/checkout-session
如果选择了客户门户路由处理程序:
目的:此路由允许客户通过 Dodo Payments 门户管理他们的订阅。
集成:
import { CustomerPortal } from "@dodopayments/fastify";
import Fastify from 'fastify'
const fastify = Fastify({})
const customerPortalHandler = CustomerPortal({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT
});
fastify.get('/api/customer-portal', customerPortalHandler);
查询参数:
customer_id(必需):例如,?customer_id=cus_123
send_email(可选):如果为 true,则通过电子邮件向客户发送门户链接
如果缺少 customer_id,则返回 400。
如果选择了 Webhook 路由处理程序:
目的:处理来自 Dodo Payments 的传入 webhook 事件以触发应用程序中的事件。
集成:
import Fastify from 'fastify'
import { Webhooks } from '@dodopayments/fastify'
const fastify = Fastify({})
fastify.addContentTypeParser('application/json', { parseAs: 'string' }, function (req, body, done) {
done(null, body)
})
fastify.post('/api/webhooks', Webhooks({
webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_KEY,
onPayload: async (payload) => {
// 在此处处理负载
console.log(payload)
}
}));
特点:
仅允许 POST 方法——其他返回 405
使用 webhookKey 进行签名验证。如果无效,则返回 401。
基于 Zod 的负载验证。如果无效模式,则返回 400。
所有处理程序都是异步函数。
支持的 Webhook 事件处理程序:
您可以传入以下任意处理程序:
onPayload
onPaymentSucceeded
onPaymentFailed
onPaymentProcessing
onPaymentCancelled
onRefundSucceeded
onRefundFailed
onDisputeOpened, onDisputeExpired, onDisputeAccepted, onDisputeCancelled, onDisputeChallenged, onDisputeWon, onDisputeLost
onSubscriptionActive, onSubscriptionOnHold, onSubscriptionRenewed, onSubscriptionPlanChanged, onSubscriptionCancelled, onSubscriptionFailed, onSubscriptionExpired, onSubscriptionUpdated
onLicenseKeyCreated
onAbandonedCheckoutDetected, onAbandonedCheckoutRecovered
onDunningStarted, onDunningRecovered
onCreditAdded, onCreditDeducted, onCreditExpired, onCreditRolledOver, onCreditRolloverForfeited, onCreditOverageCharged, onCreditManualAdjustment, onCreditBalanceLow
环境变量设置:
确保在项目中定义这些环境变量:
DODO_PAYMENTS_API_KEY=your-api-key
DODO_PAYMENTS_RETURN_URL=https://yourapp.com/success
DODO_PAYMENTS_WEBHOOK_KEY=your-webhook-secret
DODO_PAYMENTS_ENVIRONMENT="test_mode" 或 "live_mode""
在代码中使用这些:
process.env.DODO_PAYMENTS_API_KEY
process.env.DODO_PAYMENTS_WEBHOOK_KEY
安全提示:不要将密钥提交到版本控制。在本地使用 .env 文件,在部署环境中使用密钥管理器(例如,AWS、Vercel、Heroku 等)。