전제 조건
Dodo Payments API를 통합하려면 다음이 필요합니다:- Dodo Payments 상인 계정
- 대시보드에서 API 자격 증명 (API 키 및 웹훅 비밀 키)
API 통합
체크아웃 세션
Checkout Sessions를 사용하여 보안 호스팅된 체크아웃으로 구독 상품을 판매하세요. 구독 상품을product_cart에 전달하고 반환된 checkout_url로 고객을 리디렉션하세요.
- Node.js SDK
- Python SDK
- REST API
API 응답
다음은 응답의 예입니다:checkout_url로 리디렉션하세요.
웹훅
구독을 통합할 때 구독 생애 주기를 추적하기 위해 웹훅을 받게 됩니다. 이러한 웹훅은 구독 상태 및 결제 시나리오를 효과적으로 관리하는 데 도움을 줍니다. 웹훅 엔드포인트를 설정하려면 자세한 통합 가이드를 따르세요.구독 이벤트 유형
다음 웹훅 이벤트는 구독 상태 변경을 추적합니다:subscription.active- 구독이 성공적으로 활성화되었습니다.subscription.updated- 구독 개체가 업데이트되었습니다 (필드가 변경될 때마다 발생합니다).subscription.on_hold- 갱신 실패로 인해 구독이 보류 상태로 전환됩니다.subscription.failed- mandate 생성 실패로 인해 구독 생성에 실패했습니다.subscription.renewed- 다음 청구 기간을 위해 구독이 갱신되었습니다.
결제 시나리오
수신하는 웹훅과 해당 웹훅의 발생 시점은 상품에 trial이 있는지 여부에 따라 달라집니다. 즉시 청구(시험 기간 0일):subscription.active: mandate가 승인되고 subscription이 활성화됩니다.payment.succeeded: 첫 번째 청구를 확인합니다. checkout 후 2~10분 이내에 발생할 것으로 예상됩니다.
- 시험 시작 시(checkout): 결제 수단이 승인되면
subscription.active가 한 번 발생합니다. 아직 recurring charge는 청구되지 않습니다. 첫 번째 실제 청구는 시험 기간이 종료될 때까지 연기됩니다. - 시험 종료 시: recurring amount가 청구되며,
payment.succeeded를subscription.renewed와 함께 수신합니다.
subscription.renewed: 각 billing cycle에서 renewal payment가 차감될 때 발생하며, 항상payment.succeeded와 함께 전송됩니다. 또한 업데이트된next_billing_date도 포함합니다.
subscription product에 대해 실제로 금액이 차감될 때마다
subscription.renewed 및 payment.succeeded를 수신합니다. 다음 cycle에 대한 access를 연장할 신호로 payment.succeeded만 사용하는 대신 subscription.renewed를 사용하세요.- Subscription Failure
subscription.failed- mandate 생성 실패로 인해 subscription 생성에 실패했습니다.payment.failed- 결제 실패를 나타냅니다.
- Subscription On Hold
subscription.on_hold- renewal payment 또는 plan change charge 실패로 인해 subscription이 보류됩니다.- subscription이 보류되면 payment method가 업데이트될 때까지 자동으로 renewal되지 않습니다.
Best Practice: 구현을 간소화하려면 subscription lifecycle을 관리할 때 subscription event를 주로 추적하는 것을 권장합니다.
subscription.failed와 subscription.on_hold 비교
이 두 event는 혼동하기 쉽지만, 처리 방법은 매우 다릅니다:
보류된 Subscription 처리
subscription이on_hold 상태가 되면 다시 활성화하기 위해 payment method를 업데이트해야 합니다. 이 섹션에서는 subscription이 보류되는 시점과 처리 방법을 설명합니다.
Subscription이 보류되는 경우
다음과 같은 경우 subscription이 보류됩니다:- Renewal payment 실패: 잔액 부족, 만료된 카드 또는 은행 거절로 인해 자동 renewal charge가 실패함
- Plan change charge 실패: plan upgrade/downgrade 중 즉시 charge가 실패함
- Payment method authorization 실패: recurring charge에 대해 payment method를 승인할 수 없음
보류된 Subscription 다시 활성화
on_hold 상태의 subscription을 다시 활성화하려면 Update Payment Method API를 사용하세요. 이 API는 다음 작업을 자동으로 수행합니다:
- 미납 잔액에 대한 charge 생성
- 해당 charge에 대한 invoice 생성
- 새 payment method를 사용하여 payment 처리
- payment 성공 시 subscription을
active상태로 재활성화
1
Handle subscription.on_hold webhook
subscription.on_hold webhook을 수신하면 application state를 업데이트하고 고객에게 알리세요:2
Update payment method
고객이 payment method를 업데이트할 준비가 되면 Update Payment Method API를 호출하세요:
고객이 저장된 payment method를 보유하고 있다면 기존 payment method ID를 사용할 수도 있습니다:
3
Monitor webhook events
payment method를 업데이트한 후 다음 webhook event를 모니터링하세요:
payment.succeeded- 미납 잔액에 대한 charge가 성공했습니다.subscription.active- subscription이 다시 활성화되었습니다.
Subscription event payload 예시
Subscription Plan 변경
change plan API endpoint를 사용하여 subscription plan을 upgrade 또는 downgrade할 수 있습니다. 이를 통해 subscription의 product와 quantity를 수정하고 proration을 처리할 수 있습니다.Change Plan API Reference
subscription plan 변경에 대한 자세한 내용은 Change Plan API documentation을 참조하세요.
Proration 옵션
구독 플랜을 변경할 때 즉시 청구를 처리하는 방법은 네 가지입니다:1. prorated_immediately
- 현재 billing cycle의 남은 시간을 기준으로 prorated amount를 계산합니다.
- 기존 plan과 새 plan의 차액만 고객에게 청구합니다.
- trial 기간에는 사용자를 즉시 새 plan으로 전환하고 고객에게 바로 청구합니다.
2. full_immediately
- 새 plan의 전체 subscription amount를 고객에게 청구합니다.
- 이전 plan의 남은 시간이나 credit을 무시합니다.
- billing cycle을 reset하거나 proration과 관계없이 전체 금액을 청구하려는 경우에 유용합니다.
3. difference_immediately
- upgrade하는 경우 두 plan 금액의 차액이 고객에게 즉시 청구됩니다.
- 예를 들어 현재 plan이 30 Dollars이고 고객이 80 Dollars plan으로 upgrade하면 즉시 $50가 청구됩니다.
- downgrade하는 경우 현재 plan의 미사용 금액이 internal credit으로 추가되고 향후 subscription renewal에 자동으로 적용됩니다.
- 예를 들어 현재 plan이 50 Dollars이고 고객이 20 Dollars plan으로 전환하면 남은 $30가 credit으로 적립되어 다음 billing cycle에 사용됩니다.
4. do_not_bill
- plan 변경을 즉시 적용하지만 변경 시점에는 아무것도 청구하지 않습니다.
- 업데이트된 plan(및 quantity/add-ons)은 다음 예정된 renewal에 청구되며, 기존 billing date가 유지됩니다.
동작
- 이 API를 호출하면 Dodo Payments가 선택한 proration 옵션에 따라 즉시 charge를 시작합니다.
- plan 변경이 downgrade이고
prorated_immediately를 사용하는 경우 credit이 자동으로 계산되어 subscription의 credit balance에 추가됩니다. 이 credit은 해당 subscription에만 적용되며 동일한 subscription의 향후 recurring payment를 상쇄하는 데만 사용됩니다. full_immediately옵션은 credit 계산을 건너뛰고 새 plan의 전체 금액을 청구합니다.
Charge 처리
- plan 변경 시 시작된 즉시 charge는 일반적으로 2분 이내에 처리가 완료됩니다.
- 이 즉시 charge가 어떤 이유로든 실패하면 문제가 해결될 때까지 subscription이 자동으로 보류됩니다.
On-Demand Subscription
Create Subscription
구독 상품 생성 및 구독 라이프사이클 관리에 대한 API 참조
Change Subscription Plan
비율 옵션을 사용하여 구독 플랜 업그레이드, 다운그레이드 또는 변경에 대한 API 참조
Update Payment Method
결제 방법 업데이트 및 보류 중인 구독 재활성화에 대한 API 참조
Patch Subscription
구독 세부정보 및 구성 업데이트에 대한 API 참조
on_demand field를 포함하세요. 이를 통해 즉시 charge 없이 payment method를 승인하거나 custom initial price를 설정할 수 있습니다.
주문형 구독에 요금을 청구하려면:
후속 청구에는 POST /subscriptions//charge endpoint를 사용하고, 해당 거래에서 고객에게 청구할 금액을 지정하세요.
요청/응답 예시, 안전한 재시도 정책, webhook 처리 방법을 포함한 전체 단계별 가이드는 On-Demand Subscriptions Guide를 참조하세요.
구독 청구에 대해 알아야 할 주요 사항
Trial은 청구가 아니라 $0 authorization을 수행합니다. 구독에 trial이 포함된 경우 trial 시작 시 카드를 저장하기 위한 $0 mandate authorization이 생성되며, 실제 첫 청구는 trial이 종료될 때 발생합니다. payments list에서 trial 중인 구독은
amount: 0이 포함된 payment를 정확히 하나 표시합니다.구독 lifecycle:
on_hold = 갱신에 실패한 상태입니다(복구 가능: 고객에게 결제 수단을 업데이트하도록 안내하며 dunning 재시도가 적용됩니다). expired = 갱신 없이 기간이 종료된 상태이며 reactivate할 수 없습니다. 고객은 다시 구독해야 합니다. cancelled = 고객 또는 merchant가 종료한 상태입니다. 대부분의 갱신 실패는 Dodo의 오류가 아니라 issuer 측 decline(잔액 부족, 카드 거부)입니다.관련 API Reference
Create Subscription
구독 제품을 생성하고 구독 lifecycle을 관리하기 위한 API reference
Change Subscription Plan
proration 옵션을 사용하여 구독 플랜을 업그레이드, 다운그레이드 또는 변경하기 위한 API reference
Update Payment Method
결제 수단을 업데이트하고 보류 중인 구독을 reactivate하기 위한 API reference
Patch Subscription
구독 세부 정보 및 구성을 업데이트하기 위한 API reference