Skip to main content
@dodopayments/tanstack packageは、TanStack Start projectに3つの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

customerがsubscriptionsとdetailsを管理できるようにします。

Webhooks

Dodo Payments webhook eventsを受信して処理します。

Installation

1

Install the Package

このコマンドをproject rootで実行します:
packageにはpeer dependencyとしてzod 3.25以降も必要です。
2

Set Up Environment Variables

project rootに.env fileを作成します。API keyは Developer → API Keys で作成します。Developer → Webhooks でwebhook endpointを追加し、その Signing secret をDODO_PAYMENTS_WEBHOOK_KEYにコピーします:
TanStack Startは.env filesを読み込み、server routesはprocess.envから値を読み取ります。DODO_PAYMENTS_RETURN_URLはcheckout後にcustomerが移動する場所です。environmentを渡さない場合、handlersはlive_modeを使用します。test mode API keyはtest_modeでのみ動作します。
.env fileやsecretsをversion controlにcommitしないでください。

Route Handler Examples

このexamplesはsrc/routes/api/にあるTanStack Start server routesです。それぞれcreateFileRouteのserver.handlersでhandlersを定義します。1.129などの古いTanStack Start releasesでは、@tanstack/react-start/serverのcreateServerFileRouteと.methods() callを使用してserver routesを定義します。Dodo Payments handlersは両方のAPIで同じように動作します。requestを渡してください。
このhandlerを使用して、Dodo Payments checkoutをappに追加します。GET handlerはstatic checkoutを提供します。POST handlerはcheckout sessionsを提供します。また、type: "dynamic"を設定した場合はdynamic checkoutを提供します。dynamic checkout exampleではtype: "dynamic"を設定していることを前提としています。

Checkout Route Handler

checkout handlerは、Dodo Paymentsでpaymentsを受け付ける3つの方法すべてをサポートします:
  • Static Payment Links: コードなしでpaymentsを受け付ける共有可能なURLs。
  • Dynamic Payment Links: custom detailsを指定して生成するpayment links。deprecated endpointsを使用します。
  • Checkout Sessions: product cart、customer details、customization optionsを備えたhosted checkout。推奨されるflowです。
Checkoutは次のoptionsを受け取ります: handlerはGET requestsに対してstatic checkoutを提供します。POST requestsでは、typeがdynamicの場合はdynamic payment linkを作成し、それ以外の場合はcheckout sessionを作成します。

Supported Query Parameters

string
必須
Product identifier。例: ?productId=pdt_nZuwz45WAs64n3l07zpQR。
integer
デフォルト:"1"
Productの数量。
string
Customerのfull name。firstNameまたはlastNameが指定されている場合は無視されます。
string
Customerのfirst name。
string
Customerのlast name。
string
Customerのemail address。
string
Customerのcountry。ISO 3166-1 alpha-2 codeで指定します。
string
Customerのstreet address。
string
Customerのcity。
string
Customerのstateまたはprovince。
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。
disable flagは、対応するfieldに値がある場合にのみ有効になります。例: disableEmail=trueとともにemailを使用します。handlerはconfigのreturnUrlをredirect_urlとしてlinkに追加します。
productIdがない場合、handlerは400 responseを返します。Invalid query parameters、またはaccountに存在しないproductの場合も400を返します。

Response Format

Static checkoutはcheckout URLを含むJSON responseを返します。test modeでは、URLにtest.checkout.dodopayments.comを使用します:
  • parametersをPOST requestのJSON bodyとして送信します。
  • one-time paymentsとrecurring paymentsの両方をサポートします。handlerはproductを取得し、productがrecurringの場合はsubscriptionを、それ以外の場合はone-time paymentを作成します。
  • サポートされるすべてのbody fieldsについては、以下を参照してください:
Dynamic checkoutはdeprecatedのPOST /paymentsおよびPOST /subscriptions endpointsをproxyします。既存のintegrationsでは引き続き動作しますが、新しいintegrationsではcheckout sessionsを使用してください。

Response Format

Dynamic checkoutはpayment linkをcheckout URLとして含むJSON responseを返します:
Checkout sessionsは、customizationを完全に制御できるhosted checkoutを、one-time purchasesとsubscriptions向けに作成します。product_cartが唯一のrequired fieldで、少なくとも1つのproductが必要です。bodyにreturn_urlがない場合、handlerはconfigのreturnUrlを使用します。各checkout_urlは1回のみ使用でき、24時間後にexpiresします。confirm: trueを渡した場合は15分後にexpiresします。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にredirectします。CustomerPortalは、Checkoutと同じbearerTokenおよびenvironment optionsを受け取ります。
handlerは誰が呼び出しているかを確認しません。customer IDを指定してrequestした人は誰でも、そのcustomerのportalを取得できます。独自のauthenticationでrouteを保護し、signed-in userのcustomer IDだけを渡してください。

Query Parameters

string
必須
portal sessionのcustomer ID。例: ?customer_id=cus_123。
boolean
trueに設定すると、Dodo Paymentsはportal linkをcustomerにもemailで送信します。
customer_idがない場合、handlerは400を返し、portal sessionを作成できない場合は500を返します。

Webhook Route Handler

webhook route handlerは、コードを実行する前に、webhookKeyとして渡されたwebhook secretを使用して各requestを検証します:
  • Method: POST requestsのみサポートされます。その他のmethodsは405を返します。
  • Signature Verification: Standard Webhooks specificationに従い、webhookKeyを使用してwebhook-id、webhook-timestamp、webhook-signature headersを検証します。検証に失敗すると401を返します。
  • Payload Validation: payloadをZodで検証します。invalid payloadの場合は400を返します。
  • Error Handling:
    • 401: Invalid signature
    • 400: Invalid payload
    • 500: 検証中のInternal error
  • Event Routing: すべてのeventに対してonPayloadを呼び出し、その後eventのtypeに対応するhandlerを呼び出して200を返します。
adaptorはhandlersでthrowされたerrorsをcatchしません。errorsはTanStack Startにpropagateされ、requestは失敗します。

Supported Webhook Event Handlers

すべてのhandlersはoptionalかつasyncで、event typeに対応するverified payloadを受け取ります:
各eventの意味については、Webhook Event Guideを参照してください。

Prompt for LLM

このpromptをAI coding assistantにコピーすると、projectにadaptorを追加できます。agentにDodo Payments docsとskillsも提供するには、Agent Pluginをinstallしてください。
最終更新日 2026年9月26日