@dodopayments/bun 패키지는 Bun 서버에 세 가지 요청 핸들러를 제공합니다. Checkout는 checkout URL을 반환하고, CustomerPortal는 고객을 Customer Portal로 보내며, Webhooks는 webhook 이벤트를 검증하고 코드로 전달합니다. 각 핸들러는 표준 Request를 받고 Response를 반환하므로, Bun.serve()의 fetch 핸들러에서 호출하면 됩니다.
Checkout Handler
정적, 동적 및 checkout session 흐름으로 checkout URL을 생성합니다.
Customer Portal
고객이 구독과 세부 정보를 관리할 수 있습니다.
Webhooks
Dodo Payments webhook 이벤트를 수신하고 처리합니다.
설치
1
Install the Package
프로젝트 루트에서 다음 명령을 실행합니다:이 패키지에는 peer dependency로 지정된
zod 3.25 이상도 필요합니다.2
Set Up Environment Variables
프로젝트 루트에 Bun은
.env 파일을 만듭니다. Developer → API Keys에서 API key를 생성합니다. Developer → Webhooks에서 webhook endpoint를 추가하고, Signing secret을 DODO_PAYMENTS_WEBHOOK_KEY에 복사합니다:.env 파일을 자동으로 읽으므로, 예제에서는 process.env에서 이 값을 읽습니다. DODO_PAYMENTS_RETURN_URL은 checkout 후 고객이 이동하는 위치입니다. environment를 전달하지 않으면 핸들러는 live_mode을 사용합니다. test mode API key는 test_mode에서만 작동합니다.Route Handler 예제
모든 예제는 Bun의 네이티브 서버인
Bun.serve()를 사용하며, fetch 핸들러에서 path와 method로 요청을 라우팅합니다.- Checkout Handler
- Customer Portal Handler
- Webhook Handler
이 핸들러를 사용하여 Bun 서버에 Dodo Payments checkout을 추가합니다. 정적 핸들러는
GET 요청을 처리합니다. session 및 dynamic 핸들러는 POST 요청을 처리합니다. 동적 checkout 예제에서는 서버가 POST 요청에 대해 dynamicCheckoutHandler(request)를 반환한다고 가정합니다.Checkout Route Handler
checkout 핸들러는 Dodo Payments로 결제를 수집하는 다음 세 가지 방식을 모두 지원합니다:- Static Payment Links: 코드 없이 결제를 수집할 수 있는 공유 가능한 URL입니다.
- Dynamic Payment Links: 사용자 지정 세부 정보로 생성하는 payment link입니다. deprecated endpoint를 사용합니다.
- Checkout Sessions: product cart, 고객 세부 정보 및 customization options를 제공하는 hosted checkout입니다. 권장되는 흐름입니다.
Checkout는 다음 options를 사용합니다:
핸들러는
GET 요청에 대해 static checkout을 제공합니다. POST 요청의 경우 type가 dynamic이면 dynamic payment link를 생성하고, 그렇지 않으면 checkout session을 생성합니다.
Static Checkout (GET)
Static Checkout (GET)
지원되는 Query Parameters
string
필수
예를 들어
?productId=pdt_xxx과 같은 product identifier입니다.integer
기본값:"1"
제품의 수량입니다.
string
고객의 전체 이름입니다.
firstName 또는 lastName가 제공되면 무시됩니다.string
고객의 이름입니다.
string
고객의 성입니다.
string
고객의 email address입니다.
string
ISO 3166-1 alpha-2 code 형식의 고객 국가입니다.
string
고객의 street address입니다.
string
고객의 city입니다.
string
고객의 state 또는 province입니다.
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
예를 들어
USD와 같은 payment currency입니다.boolean
기본값:"true"
currency selector를 표시하거나 숨깁니다.
number
청구 금액을 major currency unit으로 고정합니다. 예를 들어 $12.50의 경우
12.5입니다. Pay What You Want 제품에서만 작동하며, 제품의 minimum price보다 낮으면 무시됩니다.boolean
기본값:"true"
discounts section을 표시하거나 숨깁니다.
string
metadata_로 시작하는 모든 query parameter는 metadata로 checkout에 전달됩니다. 예를 들어 metadata_orderId=123와 같습니다.disableEmail=true와 함께 email를 사용하는 경우입니다. 핸들러는 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)
- 매개변수를 POST request의 JSON body로 전송합니다.
- 일회성 결제와 recurring payment를 모두 지원합니다. 핸들러는 product를 가져온 다음, product가 recurring이면 subscription을 생성하고 그렇지 않으면 일회성 payment를 생성합니다.
- 지원되는 모든 body field는 다음을 참조하세요:
Response Format
Dynamic checkout은 payment link가 checkout URL로 포함된 JSON response를 반환합니다:Checkout Sessions (POST)
Checkout Sessions (POST)
Checkout session은 customization을 완전히 제어하면서 일회성 purchase와 subscription을 위한 hosted checkout을 생성합니다.
product_cart만 필수 field이며, 하나 이상의 product가 필요합니다. body에 return_url가 없으면 핸들러는 config의 returnUrl를 사용합니다.각 checkout_url는 한 번만 작동하며 24시간 후 만료됩니다. 단, confirm: true를 전달하면 15분 후 만료됩니다. payment_method_id로 생성한 session은 checkout_url를 반환하지 않으므로 핸들러는 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으로 redirect합니다.CustomerPortal는 Checkout와 동일한 bearerToken 및 environment options를 사용합니다.
Query Parameters
string
필수
portal session의 customer ID입니다. 예를 들어
?customer_id=cus_123와 같습니다.boolean
true로 설정하면 Dodo Payments가 고객에게 portal link도 email로 보냅니다.customer_id가 없으면 핸들러는 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: body를 JSON으로 parsing하고 Zod로 검증합니다. 잘못된 JSON 또는 잘못된 payload에는 400을 반환합니다.
- Error Handling:
- 401: 잘못된 signature
- 400: 잘못된 payload
- 500: 검증 중 internal error
- Event Routing: 모든 event에 대해
onPayload를 호출한 다음 event type에 해당하는 handler를 호출하고 200을 반환합니다.
Bun.serve()로 전파되고 request가 실패합니다.