Skip to main content
@dodopayments/tanstack package 为你的 TanStack Start project 提供三个 request handlers。Checkout 返回 checkout URLs,CustomerPortal 将 customer 导向 Customer Portal,而 Webhooks 会验证 webhook events 并将其路由到你的代码。每个 handler 都接收标准的 Request 并返回 Response,因此你可以从 server route handler 中调用它。

Checkout Handler

使用 static、dynamic 和 checkout session flows 创建 checkout URLs。

Customer Portal

让 customers 管理其 subscriptions 和 details。

Webhooks

接收并处理 Dodo Payments webhook events。

安装

1

Install the Package

在 project root 中运行此命令:
该 package 还需要 zod 3.25 或更高版本,并将其列为 peer dependency。
2

Set Up Environment Variables

在 project root 中创建一个 .env file。在 Developer → API Keys 下创建 API key。在 Developer → Webhooks 下添加 webhook endpoint,并将其 Signing secret 复制到 DODO_PAYMENTS_WEBHOOK_KEY:
TanStack Start 会加载 .env files,而 server routes 会从 process.env 中读取这些值。DODO_PAYMENTS_RETURN_URL 是 customers 在 checkout 后到达的页面。如果你不传入 environment,handlers 会使用 live_mode。test mode API key 只能与 test_mode 配合使用。
切勿将 .env file 或 secrets 提交到 version control。

Route Handler 示例

这些示例是位于 src/routes/api/ 中的 TanStack Start server routes。每个示例都会在 createFileRoute 的 server.handlers 下定义其 handlers。较旧的 TanStack Start releases(例如 1.129)会从 @tanstack/react-start/server 使用 createServerFileRoute 定义 server routes,并改用 .methods() call。Dodo Payments handlers 在两种 APIs 中的工作方式相同:将 request 传给它们。
使用此 handler 将 Dodo Payments checkout 添加到你的 app。GET handler 提供 static checkout。POST handler 提供 checkout sessions;当你设置 type: "dynamic" 时,它也提供 dynamic checkout。dynamic checkout 示例假设你已设置 type: "dynamic"。

Checkout Route Handler

checkout handler 支持使用 Dodo Payments 收款的三种方式:
  • **Static Payment Links:**可分享的 URLs,无需代码即可收款。
  • **Dynamic Payment Links:**使用自定义 details 生成的 payment links。它们使用 deprecated endpoints。
  • **Checkout Sessions:**支持 product cart、customer details 和 customization options 的 hosted checkout。这是推荐的 flow。
Checkout 接收以下 options: 对于 GET requests,handler 提供 static checkout。对于 POST requests,当 type 为 dynamic 时,它会创建 dynamic payment link;否则会创建 checkout session。

支持的 Query Parameters

string
必填
Product identifier,例如 ?productId=pdt_nZuwz45WAs64n3l07zpQR。
integer
默认值:"1"
Product 的数量。
string
Customer 的全名。如果提供了 firstName 或 lastName,则会忽略此值。
string
Customer 的名字。
string
Customer 的姓氏。
string
Customer 的 email address。
string
Customer 的国家,使用 ISO 3166-1 alpha-2 code。
string
Customer 的街道地址。
string
Customer 所在的城市。
string
Customer 所在的州或省。
string
Customer 的 ZIP 或 postal code。
boolean
设置为 true 可禁用 full name field。
boolean
设置为 true 可禁用 first name field。
boolean
设置为 true 可禁用 last name field。
boolean
设置为 true 可禁用 email field。
boolean
设置为 true 可禁用 country field。
boolean
设置为 true 可禁用 address line field。
boolean
设置为 true 可禁用 city field。
boolean
设置为 true 可禁用 state field。
boolean
设置为 true 可禁用 ZIP code field。
string
Payment currency,例如 USD。
boolean
默认值:"true"
显示或隐藏 currency selector。
number
固定收取的金额(以 major currency units 表示),例如对于 $12.50,使用 12.5。仅适用于 Pay What You Want products;如果低于 product 的 minimum price,则会忽略该值。
boolean
默认值:"true"
显示或隐藏 discounts section。
string
任何以 metadata_ 开头的 query parameter 都会作为 metadata 传递给 checkout,例如 metadata_orderId=123。
仅当匹配的 field 有值时,disable flag 才会生效,例如 email 与 disableEmail=true 同时存在时。handler 会将其 config 中的 returnUrl 以 redirect_url 的形式添加到 link。
如果缺少 productId,handler 会返回 400 response。无效的 query parameters,或 account 中不存在的 product,也会返回 400。

Response Format

Static checkout 返回包含 checkout URL 的 JSON response。在 test mode 中,URL 使用 test.checkout.dodopayments.com:
  • 在 POST request 中将 parameters 作为 JSON body 发送。
  • 支持 one-time 和 recurring payments。handler 会获取 product;如果 product 是 recurring,则创建 subscription,否则创建 one-time payment。
  • body 需要 billing(包括 street、city、state、country 和 zipcode)以及 customer,此外还需要 product_id 或 product_cart。Subscriptions 需要 product_id。
  • 关于所有支持的 body fields,请参阅:
Dynamic checkout 代理已 deprecated 的 POST /payments 和 POST /subscriptions endpoints。它会继续为现有 integrations 提供支持,但新的 integrations 应使用 checkout sessions。

Response Format

Dynamic checkout 返回包含 payment link(作为 checkout URL)的 JSON response:
Checkout sessions 会为 one-time purchases 和 subscriptions 创建 hosted checkout,并提供完整的 customization 控制。product_cart 是唯一必需的 field,并且至少需要一个 product。如果 body 没有 return_url,handler 会使用其 config 中的 returnUrl。每个 checkout_url 只能使用一次,并会在 24 小时后过期;如果传入 confirm: true,则会在 15 分钟后过期。使用 payment_method_id 创建的 session 不会返回 checkout_url,因此 handler 会响应 400。如需了解更多详情及所有支持的 fields,请参阅 Checkout Sessions Integration Guide。

Response Format

Checkout sessions 返回包含 checkout URL 的 JSON response:

Customer Portal Route Handler

Customer Portal route handler 会为你传入的 customer 创建 Customer Portal session,并将 browser 重定向到该 session。CustomerPortal 接收与 Checkout 相同的 bearerToken 和 environment options。
handler 不会检查调用者的身份。任何使用 customer ID 请求它的人都可以获取该 customer 的 portal。使用你自己的 authentication 保护该 route,并且只传入已登录用户的 customer ID。

Query Parameters

string
必填
portal session 的 customer ID,例如 ?customer_id=cus_123。
boolean
如果设置为 true,Dodo Payments 还会将 portal link 通过 email 发送给 customer。
如果缺少 customer_id,handler 会返回 400;如果无法创建 portal session,则返回 500。

Webhook Route Handler

webhook route handler 会使用你的 webhook secret 验证每个 request;该 secret 作为 webhookKey 传入,然后才运行你的代码:
  • **Method:**仅支持 POST requests。其他 methods 返回 405。
  • **Signature Verification:**使用 webhookKey,按照 Standard Webhooks specification 验证 webhook-id、webhook-timestamp 和 webhook-signature headers。验证失败时返回 401。
  • **Payload Validation:**使用 Zod 验证 payload。payload 无效时返回 400。
  • Error Handling:
    • 401:Invalid signature
    • 400:Invalid payload
    • 500:验证期间发生 Internal error
  • **Event Routing:**对每个 event 调用 onPayload,然后调用对应 event type 的 handler,并返回 200。
adaptor 不会捕获 handlers 中抛出的 errors。这些 errors 会传播到 TanStack Start,并导致 request 失败。

支持的 Webhook Event Handlers

每个 handler 都是可选的 async handler,并接收其 event type 对应的已验证 payload:
关于每个 event 的含义,请参阅 Webhook Event Guide。

给 LLM 的 Prompt

将此 prompt 复制到你的 AI coding assistant 中,让它将 adaptor 添加到你的 project。若还希望向 agent 提供 Dodo Payments docs 和 skills,请安装 Agent Plugin。
最后修改于 2026年9月26日