@dodopayments/hono 适配器为您的 Hono 应用提供三个路由处理程序:Checkout 返回 checkout URL,CustomerPortal 将客户引导至 Customer Portal,Webhooks 验证 webhook 请求并调用您的事件处理程序。
Checkout Handler
在 Hono 应用中创建支付链接和 checkout session。
Customer Portal
让客户管理其订阅和详细信息。
Webhooks
验证并处理 Dodo Payments webhook 事件。
安装
1
Install the Package
在项目根目录中运行以下命令:此软件包要求 Hono 4.8.9 或更高版本。
2
Set Up Environment Variables
在项目根目录中创建一个 在 Developer → API Keys 下创建 API key。在 Developer → Webhooks 下添加 webhook endpoint,并将其 signing secret 复制到
.env 文件:DODO_PAYMENTS_WEBHOOK_KEY 中。构建期间,请将 test mode API key 与 DODO_PAYMENTS_ENVIRONMENT=test_mode 配合使用,因为 test mode key 只能用于 test mode。DODO_PAYMENTS_RETURN_URL 是可选的。路由处理程序示例
这些示例会在使用
new Hono() 创建的 Hono 应用上注册路由。处理程序会自行读取请求正文,因此不需要 body-parsing middleware。- Checkout Handler
- Customer Portal Handler
- Webhook Handler
使用此处理程序将 Dodo Payments checkout 集成到 Hono 应用中。支持 static (GET)、dynamic (POST) 和 session (POST) 流程。请为每个 POST 流程注册独立路径,因为 Hono 会在请求执行第一个处理程序后停止继续匹配。
Checkout 路由处理程序
该适配器支持全部三种 Dodo Payments checkout 流程。在处理程序配置中设置
type,以选择路由提供的流程。每种流程都会返回包含 checkout_url 的 JSON,供客户打开。- Static Payment Links:
type: "static",GET。根据 query parameters 为一个产品创建 payment link,并先检查该产品是否存在。 - Dynamic Payment Links:
type: "dynamic",POST。根据产品是否为 recurring,使用 payment link 创建一次性支付或订阅。 - Checkout Sessions:
type: "session",POST。根据产品购物车和客户详细信息创建 checkout session。新集成请使用此流程。
Checkout 接受以下选项:
当
type 为 static 时,为 GET 注册处理程序;当 type 为 dynamic 或 session 时,为 POST 注册处理程序。对于不是 POST 的所有请求,处理程序都会将其视为 static checkout 请求。
Static Checkout (GET)
Static Checkout (GET)
支持的 Query Parameters
只有当 disable flag 为true 且对应字段有值时,该标志才会生效,例如 email 与 disableEmail。处理程序会将这些参数传递给 static payment link。响应格式
Static checkout 返回包含 checkout URL 的 JSON 响应:Dynamic Checkout (POST)
Dynamic Checkout (POST)
- 在 POST 请求中将参数作为 JSON body 发送。
- 支持一次性支付和 recurring 支付。处理程序会获取产品,然后在产品为 recurring 时创建订阅,否则创建一次性支付。
- body 需要
billing(包含street、city、state、country和zipcode)以及customer,此外还需要product_id(可选quantity)或product_cart。订阅需要product_id。 - 处理程序还会转发
metadata、allowed_payment_method_types、billing_currency、discount_codes(或已弃用的discount_code)、return_url、show_saved_payment_methods和tax_id。对于订阅,还会转发addons、on_demand和trial_period_days。其他字段会被忽略。 - 有关字段详情,请参阅:
响应格式
Dynamic checkout 返回包含 payment link(作为 checkout URL)的 JSON 响应:Checkout Sessions (POST)
Checkout Sessions (POST)
将 checkout session payload 作为 JSON body 发送。处理程序会创建 checkout session,该 session 负责处理一次性购买和订阅的完整支付流程,并返回其
checkout_url。product_cart 为必需项,且必须至少包含一个产品。每个 checkout_url 只能使用一次,并会在 24 小时后过期;如果传入 confirm: true,则会在 15 分钟后过期。使用 payment_method_id 创建的 session 不会返回 checkout_url,因此处理程序会响应 400。有关更多详情以及完整的支持字段列表,请参阅 Checkout Sessions Integration Guide。响应格式
Checkout sessions 返回包含 checkout URL 的 JSON 响应:Customer Portal 路由处理程序
Customer Portal 路由处理程序会为customer_id 中的客户创建 Customer Portal session,并将请求重定向到 portal link。CustomerPortal 接受 bearerToken 和 environment 选项,与 Checkout 相同。如果 Dodo Payments 无法创建 session,处理程序会返回 500。
Query Parameters
Webhook 路由处理程序
Webhook 处理程序使用作为webhookKey 传入的 webhook secret 验证每个请求,然后调用您的事件处理程序。它会自行读取原始请求 body,因此该路由不需要 body-parsing middleware。
- Method: 仅支持 POST 请求。其他 method 返回 405。
- Signature Verification: 根据 Standard Webhooks 规范,使用
webhookKey验证webhook-id、webhook-timestamp和webhook-signatureheaders。验证失败时返回 401。 - Payload Validation: 使用 Zod 进行验证。payload 无效时返回 400。
- Error Handling:
- 401:Signature 无效
- 400:Payload 无效
- 500:验证期间发生内部错误
- Event Routing: 对每个事件调用
onPayload,然后调用与事件 type 对应的处理程序,并在它们完成后返回 200。处理程序不会捕获您的事件处理程序抛出的错误。