安装包
在项目根目录中运行以下命令: npm install @dodopayments/express
设置环境变量
在项目根目录中创建一个 .env 文件: DODO_PAYMENTS_API_KEY=your-api-key
DODO_PAYMENTS_WEBHOOK_KEY=your-webhook-secret
DODO_PAYMENTS_ENVIRONMENT="test_mode" or "live_mode"
DODO_PAYMENTS_RETURN_URL=your-return-url
See all 5 lines
切勿将您的 .env 文件或机密信息提交到版本控制中。
路由处理器示例
结账处理器
客户门户处理器
Webhook 处理器
使用此处理器将 Dodo Payments 结账集成到您的 Express 应用中。支持静态(GET)、动态(POST)和会话(POST)支付流程。
import { checkoutHandler } from '@dodopayments/express' ;
app . get ( '/api/checkout' , checkoutHandler ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
returnUrl: process . env . DODO_PAYMENTS_RETURN_URL ,
environment: process . env . DODO_PAYMENTS_ENVIRONMENT ,
type: "static"
}))
app . post ( '/api/checkout' , checkoutHandler ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
returnUrl: process . env . DODO_PAYMENTS_RETURN_URL ,
environment: process . env . DODO_PAYMENTS_ENVIRONMENT ,
type: "dynamic"
}))
app . post ( '/api/checkout' , checkoutHandler ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
returnUrl: process . env . DODO_PAYMENTS_RETURN_URL ,
environment: process . env . DODO_PAYMENTS_ENVIRONMENT ,
type: "session"
}))
See all 22 lines
Static Checkout Curl example
curl --request GET \
--url 'https://example.com/api/checkout?productId=pdt_fqJhl7pxKWiLhwQR042rh' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test
See all 5 lines
Dynamic Checkout Curl example
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": "[email protected] ",
"name": "test"
},
"metadata": {},
"payment_link": true,
"product_id": "pdt_QMDuvLkbVzCRWRQjLNcs",
"quantity": 1,
"billing_currency": "USD",
"discount_code": "IKHZ23M9GQ",
"return_url": "https://example.com",
"trial_period_days": 10
}'
See all 27 lines
Checkout Session Curl example
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 '{
"product_cart": [
{
"product_id": "pdt_QMDuvLkbVzCRWRQjLNcs",
"quantity": 1
}
],
"customer": {
"email": "[email protected] ",
"name": "test"
},
"return_url": "https://example.com/success"
}'
See all 19 lines
使用此处理器允许客户通过 Dodo Payments 客户门户管理他们的订阅和详细信息。
import { CustomerPortal } from "@dodopayments/express" ;
app . get ( '/api/customer-portal' , CustomerPortal ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
environment: process . env . DODO_PAYMENTS_ENVIRONMENT ,
}))
See all 6 lines
Customer Portal Curl example
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
See all 5 lines
使用此处理器在您的 Express 应用中安全地接收和处理 Dodo Payments Webhook 事件。
import { Webhooks } from "@dodopayments/express" ;
app . post ( '/api/webhook' , Webhooks ({
webhookKey: process . env . DODO_PAYMENTS_WEBHOOK_KEY ,
onPayload : async ( payload ) => {
// handle the payload
},
// ... other event handlers for granular control
}))
See all 9 lines
结账路由处理器
Dodo Payments 支持三种类型的支付流程以将支付集成到您的网站中,此适配器支持所有类型的支付流程。
静态支付链接: 可即时分享的 URL,用于快速、无代码的支付收集。
动态支付链接: 使用 API 或 SDK 程序化生成带有自定义详细信息的支付链接。
结账会话: 创建安全、可自定义的结账体验,预配置产品购物车和客户详细信息。
支持的查询参数 产品标识符(例如,?productId=pdt_nZuwz45WAs64n3l07zpQR)。
指定支付金额(例如,1000 表示 $10.00)。
任何以 metadata_ 开头的查询参数将作为元数据传递。
如果缺少 productId,处理器将返回 400 响应。无效的查询参数也会导致 400 响应。
响应格式 静态结账返回一个包含结账 URL 的 JSON 响应: {
"checkout_url" : "https://checkout.dodopayments.com/..."
}
以 JSON 体的形式在 POST 请求中发送参数。
支持一次性和定期支付。
有关支持的 POST 体字段的完整列表,请参阅:
响应格式 动态结账返回一个包含结账 URL 的 JSON 响应: {
"checkout_url" : "https://checkout.dodopayments.com/..."
}
结账会话提供更安全的托管结账体验,处理一次性购买和订阅的完整支付流程,具有完全的自定义控制。 有关更多详细信息和支持字段的完整列表,请参阅 结账会话集成指南 。 响应格式 结账会话返回一个包含结账 URL 的 JSON 响应: {
"checkout_url" : "https://checkout.dodopayments.com/session/..."
}
客户门户路由处理器
客户门户路由处理器使您能够将 Dodo Payments 客户门户无缝集成到您的 Express 应用中。
查询参数
门户会话的客户 ID(例如,?customer_id=cus_123)。
如果设置为 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 > ;
onLicenseKeyCreated ?: ( payload : WebhookPayload ) => Promise < void > ;
See all 22 lines
LLM 提示
您是一个专家级的 Express.js 开发助手。您的任务是指导用户将 @dodopayments/express 适配器集成到他们现有的 Express.js 项目中。
@dodopayments/express 适配器提供 Dodo Payments 的结账、客户门户和 Webhook 功能的路由处理器,旨在直接插入到 Express 应用中。
首先,安装必要的包。使用适合用户项目的包管理器(npm、yarn 或 bun):
npm install @dodopayments/express
---
以下是您应如何构建响应:
1. 询问用户他们想要集成哪些功能。
"您想将 @dodopayments/express 适配器的哪些部分集成到您的项目中?您可以选择以下一个或多个:
- 结账路由处理器(用于处理产品结账)
- 客户门户路由处理器(用于管理客户订阅/详细信息)
- Webhook 路由处理器(用于接收 Dodo Payments Webhook 事件)
- 全部(集成所有三者)"
---
2. 根据用户的选择,为每个选定的功能提供详细的集成步骤。
---
**如果选择了结账路由处理器:**
**目的**:此处理器管理不同类型的结账流程。所有结账类型(静态、动态和会话)返回包含结账 URL 的 JSON 响应,以便进行编程处理。
**集成**:
在您的 Express 应用中为静态(GET)、动态(POST)和结账会话(POST)创建路由。
import { checkoutHandler } from '@dodopayments/express';
app.get('/api/checkout', checkoutHandler({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
type: "static"
}));
app.post('/api/checkout', checkoutHandler({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
type: "dynamic"
}));
// 对于结账会话
app.post('/api/checkout', checkoutHandler({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
type: "session"
}));
配置选项:
bearerToken:您的 Dodo Payments API 密钥(建议存储在 DODO_PAYMENTS_API_KEY 环境变量中)。
returnUrl(可选):成功结账后重定向用户的 URL。
environment:"test_mode" 或 "live_mode"
type:"static"(GET)、"dynamic"(POST)或 "session"(POST)
GET(静态结账)期望查询参数:
productId(必需)
quantity、客户字段(fullName、email 等)和元数据(metadata_*)是可选的。
返回:{"checkout_url": "https://checkout.dodopayments.com/..."}
POST(动态结账)期望一个包含支付详细信息(一次性或订阅)的 JSON 体。有关完整的 POST 架构,请参考文档:
一次性支付:https://docs.dodopayments.com/api-reference/payments/post-payments
订阅:https://docs.dodopayments.com/api-reference/subscriptions/post-subscriptions
返回:{"checkout_url": "https://checkout.dodopayments.com/..."}
POST(结账会话) - (推荐)更可自定义的结账体验。返回 JSON,包含 checkout_url:参数作为 JSON 体发送。支持一次性和定期支付。返回:{"checkout_url": "https://checkout.dodopayments.com/session/..."}。有关支持字段的完整列表,请参阅:
结账会话集成指南:https://docs.dodopayments.com/developer-resources/checkout-session
如果选择了客户门户路由处理器:
目的:此路由允许客户通过 Dodo Payments 门户管理他们的订阅。
集成:
import { CustomerPortal } from "@dodopayments/express";
app.get('/api/customer-portal', CustomerPortal({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
}));
查询参数:
customer_id(必需):例如,?customer_id=cus_123
send_email(可选):如果为 true,客户将收到包含门户链接的电子邮件
如果缺少 customer_id,将返回 400。
如果选择了 Webhook 路由处理器:
目的:处理来自 Dodo Payments 的传入 Webhook 事件,以触发您应用中的事件。
集成:
import { Webhooks } from "@dodopayments/express";
app.post('/api/webhook', Webhooks({
webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_KEY,
onPayload: async (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
onLicenseKeyCreated
环境变量设置:
确保在您的项目中定义这些环境变量:
DODO_PAYMENTS_API_KEY=your-api-key
DODO_PAYMENTS_WEBHOOK_KEY=your-webhook-secret
DODO_PAYMENTS_ENVIRONMENT="test_mode" 或 "live_mode"
DODO_PAYMENTS_RETURN_URL=your-return-url
在您的代码中使用这些:
process.env.DODO_PAYMENTS_API_KEY
process.env.DODO_PAYMENTS_WEBHOOK_SECRET
安全提示:切勿将机密信息提交到版本控制中。在本地使用 .env 文件,在部署环境中使用机密管理器(例如,AWS、Vercel、Heroku 等)。