@dodopayments/tanstack 패키지는 TanStack Start 프로젝트에 세 가지 request handler를 제공합니다. Checkout는 checkout URL을 반환하고, CustomerPortal는 고객을 Customer Portal로 보내며, Webhooks는 webhook event를 검증하고 사용자의 코드로 라우팅합니다. 각 handler는 표준 Request를 받고 Response를 반환하므로, server route handler에서 호출할 수 있습니다.
Checkout Handler
정적, 동적 및 checkout session flow로 checkout URL을 생성합니다.
Customer Portal
고객이 구독과 세부 정보를 관리할 수 있도록 합니다.
Webhooks
Dodo Payments webhook event를 수신하고 처리합니다.
설치
1
Install the Package
프로젝트 루트에서 이 명령을 실행합니다:이 패키지에는 peer dependency로 지정된
zod 3.25 이상도 필요합니다.2
Set Up Environment Variables
프로젝트 루트에 TanStack Start는
.env 파일을 만듭니다. Developer → API Keys에서 API key를 생성합니다. Developer → Webhooks에서 webhook endpoint를 추가하고, Signing secret을 복사하여 DODO_PAYMENTS_WEBHOOK_KEY에 입력합니다:.env 파일을 로드하고, server route는 process.env에서 값을 읽습니다. DODO_PAYMENTS_RETURN_URL는 checkout 후 고객이 도착하는 위치입니다. environment를 전달하지 않으면 handler는 live_mode를 사용합니다. test mode API key는 test_mode에서만 작동합니다.Route Handler 예시
예시는
src/routes/api/에 있는 TanStack Start server route입니다. 각 예시는 createFileRoute의 server.handlers 아래에 handler를 정의합니다. 1.129와 같은 이전 TanStack Start release에서는 @tanstack/react-start/server의 createServerFileRoute와 .methods() 호출을 사용하여 server route를 정의합니다. Dodo Payments handler는 두 API에서 동일한 방식으로 작동합니다. request를 전달하면 됩니다.- Checkout Handler
- Customer Portal Handler
- Webhook Handler
이 handler를 사용하여 앱에 Dodo Payments checkout을 추가합니다.
GET handler는 정적 checkout을 제공합니다. POST handler는 checkout session을 제공하거나, type: "dynamic"를 설정하면 동적 checkout을 제공합니다. 동적 checkout 예시는 type: "dynamic"를 설정한다고 가정합니다.Checkout Route Handler
checkout handler는 Dodo Payments로 결제를 받는 세 가지 방식을 모두 지원합니다:- Static Payment Links: 코드 없이 결제를 수집할 수 있는 공유 가능한 URL입니다.
- Dynamic Payment Links: 사용자 지정 세부 정보로 생성하는 payment link입니다. deprecated endpoint를 사용합니다.
- Checkout Sessions: product cart, 고객 세부 정보 및 사용자 지정 옵션을 제공하는 호스팅 checkout입니다. 권장되는 flow입니다.
Checkout는 다음 옵션을 받습니다:
handler는
GET request에 대해 정적 checkout을 제공합니다. POST request의 경우 type가 dynamic이면 dynamic payment link를 생성하고, 그 외에는 checkout session을 생성합니다.
Static Checkout (GET)
Static Checkout (GET)
지원되는 Query Parameters
청구 금액을 major currency unit으로 고정합니다(예: $12.50의 경우
12.5). Pay What You Want product에서만 작동하며 product의 minimum price보다 낮으면 무시됩니다.disableEmail=true와 함께 사용하는 email). handler는 config의 returnUrl를 redirect_url로 link에 추가합니다.Response Format
정적 checkout은 checkout URL이 포함된 JSON response를 반환합니다. test mode에서는 URL에test.checkout.dodopayments.com를 사용합니다:Dynamic Checkout (POST)
Dynamic Checkout (POST)
- POST request의 JSON body로 parameter를 전송합니다.
- 일회성 및 recurring payment를 모두 지원합니다. handler는 product를 조회한 다음, product가 recurring이면 subscription을 생성하고 그렇지 않으면 일회성 payment를 생성합니다.
- body에는
billing(street,city,state,country및zipcode포함)와customer, 그리고product_id또는product_cart가 필요합니다. subscription에는product_id가 필요합니다. - 지원되는 모든 body field는 다음을 참조하세요:
Response Format
Dynamic checkout은 payment link가 checkout URL로 포함된 JSON response를 반환합니다:Checkout Sessions (POST)
Checkout Sessions (POST)
Checkout session은 사용자 지정 항목을 완전히 제어하면서 일회성 구매 및 subscription을 위한 호스팅 checkout을 생성합니다.
product_cart가 유일한 필수 field이며, 하나 이상의 product가 필요합니다. body에 return_url가 없으면 handler는 config의 returnUrl를 사용합니다.각 checkout_url는 한 번만 작동하며 24시간 후 만료됩니다. confirm: true를 전달하면 15분 후 만료됩니다. payment_method_id로 생성된 session은 checkout_url를 반환하지 않으므로 handler는 400을 반환합니다.자세한 내용과 지원되는 모든 field는 Checkout Sessions Integration Guide를 참조하세요.Response Format
Checkout session은 checkout URL이 포함된 JSON response를 반환합니다:Customer Portal Route Handler
Customer Portal route handler는 전달된 고객을 위한 Customer Portal session을 생성하고 browser를 해당 session으로 리디렉션합니다.CustomerPortal는 Checkout와 동일한 bearerToken 및 environment 옵션을 받습니다.
Query Parameters
customer_id가 없으면 handler는 400을 반환하고, portal session을 생성할 수 없으면 500을 반환합니다.
Webhook Route Handler
webhook route handler는 코드를 실행하기 전에webhookKey로 전달된 webhook secret을 사용하여 각 request를 검증합니다:
- Method: POST request만 지원됩니다. 다른 method는 405를 반환합니다.
- Signature Verification: Standard Webhooks specification에 따라
webhookKey를 사용하여webhook-id,webhook-timestamp및webhook-signatureheader를 검증합니다. 검증에 실패하면 401을 반환합니다. - Payload Validation: Zod로 payload를 검증합니다. payload가 잘못되면 400을 반환합니다.
- Error Handling:
- 401: 잘못된 signature
- 400: 잘못된 payload
- 500: 검증 중 internal error
- Event Routing: 모든 event에 대해
onPayload를 호출한 다음 event type에 해당하는 handler를 호출하고 200을 반환합니다.