Skip to main content
@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

프로젝트 루트에 .env 파일을 만듭니다. Developer → API Keys에서 API key를 생성합니다. Developer → Webhooks에서 webhook endpoint를 추가하고, Signing secret을 복사하여 DODO_PAYMENTS_WEBHOOK_KEY에 입력합니다:
TanStack Start는 .env 파일을 로드하고, server route는 process.env에서 값을 읽습니다. DODO_PAYMENTS_RETURN_URL는 checkout 후 고객이 도착하는 위치입니다. environment를 전달하지 않으면 handler는 live_mode를 사용합니다. test mode API key는 test_mode에서만 작동합니다.
.env 파일이나 secret을 version control에 커밋하지 마세요.

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를 전달하면 됩니다.
이 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을 생성합니다.

지원되는 Query Parameters

string
필수
product identifier입니다(예: ?productId=pdt_nZuwz45WAs64n3l07zpQR).
integer
기본값:"1"
product의 수량입니다.
string
고객의 전체 이름입니다. firstName 또는 lastName가 제공되면 무시됩니다.
string
고객의 이름입니다.
string
고객의 성입니다.
string
고객의 email address입니다.
string
ISO 3166-1 alpha-2 code로 표시한 고객의 국가입니다.
string
고객의 street address입니다.
string
고객의 도시입니다.
string
고객의 주 또는 도입니다.
string
고객의 ZIP 또는 postal code입니다.
boolean
true로 설정하면 전체 이름 field를 비활성화합니다.
boolean
true로 설정하면 이름 field를 비활성화합니다.
boolean
true로 설정하면 성 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
결제 currency입니다(예: USD).
boolean
기본값:"true"
currency selector를 표시하거나 숨깁니다.
number
청구 금액을 major currency unit으로 고정합니다(예: $12.50의 경우 12.5). Pay What You Want product에서만 작동하며 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를 반환합니다. 잘못된 query parameter나 계정에 존재하지 않는 product도 400을 반환합니다.

Response Format

정적 checkout은 checkout URL이 포함된 JSON response를 반환합니다. test mode에서는 URL에 test.checkout.dodopayments.com를 사용합니다:
  • 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는 다음을 참조하세요:
Dynamic checkout은 deprecated POST /payments 및 POST /subscriptions endpoint를 proxy합니다. 기존 integration에서는 계속 작동하지만, 새 integration에서는 checkout session을 사용해야 합니다.

Response Format

Dynamic checkout은 payment link가 checkout URL로 포함된 JSON response를 반환합니다:
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 옵션을 받습니다.
handler는 누가 호출하는지 확인하지 않습니다. customer ID로 요청하는 사람은 누구나 해당 고객의 portal을 받습니다. 자체 authentication으로 route를 보호하고, 로그인한 사용자의 customer ID만 전달하세요.

Query Parameters

string
필수
portal session의 customer ID입니다(예: ?customer_id=cus_123).
boolean
true로 설정하면 Dodo Payments가 portal link를 고객에게 email로도 보냅니다.
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-signature header를 검증합니다. 검증에 실패하면 401을 반환합니다.
  • Payload Validation: Zod로 payload를 검증합니다. payload가 잘못되면 400을 반환합니다.
  • Error Handling:
    • 401: 잘못된 signature
    • 400: 잘못된 payload
    • 500: 검증 중 internal error
  • Event Routing: 모든 event에 대해 onPayload를 호출한 다음 event type에 해당하는 handler를 호출하고 200을 반환합니다.
adaptor는 사용자의 handler에서 발생한 error를 catch하지 않습니다. error는 TanStack Start로 전파되고 request가 실패합니다.

지원되는 Webhook Event Handler

모든 handler는 선택 사항이며 async이고, 해당 event type에 대해 검증된 payload를 받습니다:
각 event의 의미는 Webhook Event Guide를 참조하세요.

LLM용 Prompt

AI coding assistant에 이 prompt를 복사하여 adaptor를 프로젝트에 추가하도록 하세요. agent에 Dodo Payments docs와 skills도 제공하려면 Agent Plugin을 설치하세요.
마지막 수정일 2026년 9월 26일