跳转到主要内容

安装

1

Install the package

在项目根目录运行以下命令:
npm install @dodopayments/express
2

Set up environment variables

在项目根目录创建一个 .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
切勿将 .env 文件或密钥提交到版本控制。

路由处理器示例

使用此处理器将 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"
}))
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_code": "IKHZ23M9GQ",
  "return_url": "https://example.com",
  "trial_period_days": 10
}'
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": "test@example.com",
  "name": "test"
},
"return_url": "https://example.com/success"
}'

结账路由处理器

Dodo Payments 支持三种类型的支付流程用于将支付集成到你的网站,本适配器支持所有类型的支付流程。
  • 静态支付链接: 可即时分享的 URL,用于快速、无代码的支付收集。
  • 动态支付链接: 使用 API 或 SDK 程序化生成带有自定义详细信息的支付链接。
  • 结账会话: 创建安全、可自定义的结账体验,预配置产品购物车和客户详细信息。

支持的查询参数

productId
string
必填
产品标识符(例如 ?productId=pdt_nZuwz45WAs64n3l07zpQR)。
quantity
integer
商品数量。
fullName
string
客户全名。
firstName
string
客户名字。
lastName
string
客户姓氏。
email
string
客户电子邮件地址。
country
string
客户所在国家。
addressLine
string
客户地址行。
city
string
客户所在城市。
state
string
客户所在州/省。
zipCode
string
客户邮政编码。
disableFullName
boolean
禁用全名字段。
disableFirstName
boolean
禁用名字字段。
disableLastName
boolean
禁用姓氏字段。
disableEmail
boolean
禁用电子邮件字段。
disableCountry
boolean
禁用国家字段。
disableAddressLine
boolean
禁用地址行字段。
disableCity
boolean
禁用城市字段。
disableState
boolean
禁用州/省字段。
disableZipCode
boolean
禁用邮政编码字段。
paymentCurrency
string
指定支付货币(例如 USD)。
showCurrencySelector
boolean
显示货币选择器。
paymentAmount
integer
指定支付金额(例如 1000 表示 10.00 美元)。
showDiscounts
boolean
显示折扣字段。
metadata_*
string
任何以 metadata_ 开头的查询参数将作为元数据传递。
如果 productId 缺失,处理器将返回 400 响应。无效的查询参数也会导致 400 响应。

响应格式

静态结账返回一个包含结账 URL 的 JSON 响应:
{
  "checkout_url": "https://checkout.dodopayments.com/..."
}

响应格式

动态结账返回一个包含结账 URL 的 JSON 响应:
{
  "checkout_url": "https://checkout.dodopayments.com/..."
}
Checkout 会话提供更安全的托管结账体验,处理一次性购买和订阅的完整支付流程,并提供完全的自定义控制。有关更多详细信息和支持字段的完整列表,请参阅 结账会话集成指南

响应格式

结账会话返回一个包含结账 URL 的 JSON 响应:
{
  "checkout_url": "https://checkout.dodopayments.com/session/..."
}

客户门户路由处理器

客户门户路由处理器使您能够将 Dodo Payments 客户门户无缝集成到您的 Express 应用中。

查询参数

customer_id
string
必填
客户门户会话的客户 ID(例如 ?customer_id=cus_123)。
send_email
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>;
onLicenseKeyCreated?: (payload: WebhookPayload) => Promise<void>;

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 等)。