@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にTanStack Startは
.env fileを作成します。API keyは Developer → API Keys で作成します。Developer → Webhooks でwebhook endpointを追加し、その Signing secret をDODO_PAYMENTS_WEBHOOK_KEYにコピーします:.env filesを読み込み、server routesはprocess.envから値を読み取ります。DODO_PAYMENTS_RETURN_URLはcheckout後にcustomerが移動する場所です。environmentを渡さない場合、handlersはlive_modeを使用します。test mode API keyはtest_modeでのみ動作します。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を渡してください。- Checkout Handler
- Customer Portal Handler
- Webhook Handler
この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を作成します。
Static Checkout (GET)
Static Checkout (GET)
Supported Query Parameters
請求額をmajor currency unitsで固定します。例: $12.50の場合は
12.5。Pay What You Want productsでのみ機能し、productのminimum price未満の場合は無視されます。disableEmail=trueとともにemailを使用します。handlerはconfigのreturnUrlをredirect_urlとしてlinkに追加します。Response Format
Static checkoutはcheckout URLを含むJSON responseを返します。test modeでは、URLにtest.checkout.dodopayments.comを使用します:Dynamic Checkout (POST)
Dynamic Checkout (POST)
- parametersをPOST requestのJSON bodyとして送信します。
- one-time paymentsとrecurring paymentsの両方をサポートします。handlerはproductを取得し、productがrecurringの場合はsubscriptionを、それ以外の場合はone-time paymentを作成します。
- サポートされるすべてのbody fieldsについては、以下を参照してください:
Response Format
Dynamic checkoutはpayment linkをcheckout URLとして含むJSON responseを返します:Checkout Sessions (POST)
Checkout Sessions (POST)
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を受け取ります。
Query Parameters
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-signatureheadersを検証します。検証に失敗すると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を返します。