전제 조건
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 옵션
subscription plan을 변경할 때 즉시 charge를 처리하는 방법은 두 가지입니다: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를 설정할 수 있습니다.
on-demand subscription에 charge하려면:
이후 charge를 진행하려면 POST /subscriptions//charge endpoint를 사용하고 해당 transaction에서 고객에게 청구할 amount를 지정하세요.
request/response 예시, 안전한 retry policy 및 webhook 처리를 포함한 전체 단계별 안내는 On-Demand Subscriptions Guide를 참조하세요.
Subscription Billing에 대해 알아야 할 주요 사항
trial은 charge가 아닌 $0 authorization을 수행합니다. subscription에 trial이 있으면 trial 시작 시 카드를 저장하기 위해 $0 mandate authorization이 생성되며, 첫 번째 실제 charge는 trial이 종료될 때 발생합니다. payments list에서 trial 중인 subscription에는
amount: 0가 포함된 payment가 정확히 하나 표시됩니다.Subscription lifecycle:
on_hold = renewal 실패(복구 가능: 고객에게 payment method 업데이트를 요청하며 dunning retry가 적용됨). expired = renewal 없이 term이 종료되었으며 다시 활성화할 수 없음. 고객은 다시 subscribe해야 합니다. cancelled = 고객 또는 merchant가 종료함. 대부분의 renewal 실패는 Dodo 오류가 아니라 issuer 측 거절(잔액 부족, 카드 거절)입니다.관련 API Reference
Create Subscription
subscription product 생성 및 subscription lifecycle 관리에 대한 API reference
Change Subscription Plan
proration 옵션을 사용한 subscription plan upgrade, downgrade 또는 변경에 대한 API reference
Update Payment Method
payment method 업데이트 및 보류된 subscription 재활성화에 대한 API reference
Patch Subscription
subscription 세부 정보 및 configuration 업데이트에 대한 API reference