安装包
在项目根目录中运行以下命令: npm install @dodopayments/hono
设置环境变量
在项目根目录中创建一个 .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""
See all 5 lines
切勿将您的 .env 文件或机密信息提交到版本控制中。
路由处理器示例
所有示例假设您正在使用 Hono App Router。
结账处理器
客户门户处理器
Webhook 处理器
使用此处理器将 Dodo Payments 结账集成到您的 Hono 应用中。支持静态(GET)、动态(POST)和会话(POST)流程。
// route.ts
import { Checkout } from '@dodopayments/hono' ;
import Hono from 'hono'
const app = new Hono ()
app . get (
"/api/checkout" ,
Checkout ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
environment: process . env . DODO_PAYMENTS_ENVIRONMENT ,
returnUrl: process . env . DODO_PAYMENTS_RETURN_URL ,
type: 'static'
})
);
app . post (
"/api/checkout" ,
Checkout ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
environment: process . env . DODO_PAYMENTS_ENVIRONMENT ,
returnUrl: process . env . DODO_PAYMENTS_RETURN_URL ,
type: 'dynamic'
})
);
app . post (
"/api/checkout" ,
Checkout ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
environment: process . env . DODO_PAYMENTS_ENVIRONMENT ,
returnUrl: process . env . DODO_PAYMENTS_RETURN_URL ,
type: 'session'
})
);
See all 35 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 客户门户管理他们的订阅和详细信息。
// route.ts
import { Checkout } from '@dodopayments/hono' ;
import Hono from 'hono'
const app = new Hono ()
app . get (
"/api/customer-portal" ,
CustomerPortal ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
environment: process . env . DODO_PAYMENTS_ENVIRONMENT
})
);
See all 12 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
使用此处理器在您的 Hono 应用中安全地接收和处理 Dodo Payments Webhook 事件。
// route.ts
import Hono from 'hono'
import { Webhooks } from '@dodopayments/hono'
const app = new Hono ()
app . post (
"/api/webhooks" ,
Webhooks ({
webhookKey: process . env . DODO_PAYMENTS_WEBHOOK_KEY ,
onPayload : async ( payload ) => {
// Handle Payload Here
console . log ( payload )
}
})
);
See all 16 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 客户门户无缝集成到您的 Hono 应用中。
查询参数
门户会话的客户 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 提示
您是 Hono 开发者助手专家。您的任务是指导用户将 @dodopayments/hono 适配器集成到他们现有的 Hono 项目中。
@dodopayments/hono 适配器提供 Dodo Payments 的结账、客户门户和 Webhook 功能的路由处理器,旨在直接插入 Hono 应用中。
首先,安装必要的包。使用适合用户项目的包管理器(npm、yarn 或 bun):
npm install @dodopayments/hono
---
以下是您应如何构建响应:
1. 询问用户他们想要集成哪些功能。
"您想将 @dodopayments/hono 适配器的哪些部分集成到您的项目中?您可以选择以下一个或多个:
- 结账路由处理器(用于处理产品结账)
- 客户门户路由处理器(用于管理客户订阅/详细信息)
- Webhook 路由处理器(用于接收 Dodo Payments Webhook 事件)
- 全部(集成所有三者)"
---
2. 根据用户的选择,为每个选定的功能提供详细的集成步骤。
---
**如果选择了结账路由处理器:**
**目的**:此处理器将用户重定向到 Dodo Payments 结账页面。
**集成**:
在您的 Hono 应用中创建两个路由——一个用于静态(GET)结账,一个用于动态(POST)结账。
import { Checkout } from '@dodopayments/hono';
import Hono from 'hono'
const app = new Hono()
app.get(
"/api/checkout",
Checkout({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
type: 'static'
})
);
app.post(
"/api/checkout",
Checkout({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
type: 'session' // 或 'dynamic' 用于动态链接
})
);
配置选项:
bearerToken:您的 Dodo Payments API 密钥(建议存储在 DODO_PAYMENTS_API_KEY 环境变量中)。
returnUrl(可选):成功结账后重定向用户的 URL。
environment:"test_mode" 或 "live_mode"
type:"static"(GET)或 "dynamic"(POST)或 "session"(POST)
GET(静态结账)期望查询参数:
productId(必需)
数量、客户字段(fullName、email 等)和元数据(metadata_*)是可选的。
POST(动态结账)期望以 JSON 体形式提供支付详细信息(一次性或订阅)。有关完整的 POST 架构,请参考文档:
一次性支付:https://docs.dodopayments.com/api-reference/payments/post-payments
订阅:https://docs.dodopayments.com/api-reference/subscriptions/post-subscriptions
POST(结账会话) - (推荐)更可自定义的结账体验。返回 JSON,包含 checkout_url:参数以 JSON 体形式发送。支持一次性和定期支付。返回:{"checkout_url": "https://checkout.dodopayments.com/session/..."}。有关支持字段的完整列表,请参阅:
结账会话集成指南:https://docs.dodopayments.com/developer-resources/checkout-session
如果选择了客户门户路由处理器:
目的:此路由允许客户通过 Dodo Payments 门户管理他们的订阅。
集成:
import { Checkout } from '@dodopayments/hono';
import Hono from 'hono'
const app = new Hono()
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 Hono from 'hono'
import { Webhooks } from '@dodopayments/hono'
const app = new Hono()
app.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, onSubscriptionPaused, onSubscriptionPlanChanged, onSubscriptionCancelled, onSubscriptionFailed, onSubscriptionExpired
onLicenseKeyCreated
环境变量设置:
确保在您的项目中定义这些环境变量:
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 等)。