연동 가이드
API 연동
구독킷 RESTful API 연동 가이드
개요
구독킷 API는 구독 결제 시스템을 쉽게 연동할 수 있도록 설계된 RESTful API입니다.
인증
모든 API 요청에는 X-Subscription-Key
헤더가 필요합니다.
기본 URL
API 엔드포인트
1. 사전 주문 계산
구독 상품의 최종 결제 금액을 계산합니다.
요청 본문
필드 | 타입 | 필수 | 설명 |
---|---|---|---|
productId | string (UUID) | O | 구독 상품 ID |
discountCodes | array of string | X | 적용할 할인 코드 목록 |
quantity | number | O | 구매 수량 (기본값: 1) |
응답
필드 | 타입 | 설명 |
---|---|---|
success | boolean | 요청 성공 여부 |
data.product.id | string | 상품 ID |
data.product.name | string | 상품명 |
data.product.description | string | 상품 설명 |
data.product.unitAmount | number | 단위 가격 |
data.product.currency | string | 통화 (KRW, USD) |
data.pricing.originalPrice | number | 할인 전 원래 가격 |
data.pricing.finalPrice | number | 최종 결제 금액 |
data.pricing.quantity | number | 구매 수량 |
data.pricing.discounts[].code | string | 할인 코드 |
data.pricing.discounts[].type | string | 할인 유형 (PERCENTAGE: 비율, FIXED_AMOUNT: 정액) |
data.pricing.discounts[].value | number | 할인값 (비율 또는 금액) |
data.pricing.discounts[].description | string | 할인 설명 |
data.pricing.discounts[].appliedAmount | number | 실제 적용된 할인 금액 |
data.pricing.discounts[].originalAmount | number | 할인 적용 전 금액 |
data.pricing.invalidDiscounts[].code | string | 유효하지 않은 할인 코드 |
data.pricing.invalidDiscounts[].reason | string | 유효하지 않은 이유 |
data.pricing.breakdown.subtotal | number | 소계 |
data.pricing.breakdown.discountAmount | number | 총 할인 금액 |
data.pricing.breakdown.total | number | 최종 결제 금액 |
요청 예시
응답 예시
2. 카드 등록
신규 구독을 위한 카드 등록을 처리합니다.
요청 본문
필드 | 타입 | 필수 | 설명 |
---|---|---|---|
customerKey | string | O | 고객 식별자 |
productId | string (UUID) | O | 구독 상품 ID |
cardNumber | string | O | 카드번호 (XXXX XXXX XXXX XXXX 형식) |
expirationYear | string | O | 유효기간 연도 (YY 형식) |
expirationMonth | string | O | 유효기간 월 (MM 형식) |
cardPassword | string | O | 카드 비밀번호 앞 2자리 |
isCorporate | boolean | O | 법인카드 여부 |
personalId | string | △ | 생년월일 6자리 (개인카드 시 필수) |
corporateId | string | △ | 사업자등록번호 10자리 (법인카드 시 필수) |
quantity | number | X | 구매 수량 (기본값: 1) |
withTrial | boolean | X | 무료체험 시작 여부 (기본값: false) |
withPayment | boolean | X | 즉시 결제 여부 (기본값: false) |
discountCodes | array of string | X | 적용할 할인 코드 목록 |
응답
필드 | 타입 | 설명 |
---|---|---|
success | boolean | 요청 성공 여부 |
data.cardEndNumber | string | 카드 끝 4자리 |
요청 예시
응답 예시
3. 카드 정보 업데이트
기존 구독의 카드 정보를 업데이트합니다.
Path 파라미터
파라미터 | 타입 | 설명 |
---|---|---|
subscriptionId | string (UUID) | 구독 ID |
요청 본문
필드 | 타입 | 필수 | 설명 |
---|---|---|---|
cardNumber | string | O | 카드번호 (XXXX XXXX XXXX XXXX 형식) |
expirationYear | string | O | 유효기간 연도 (YY 형식) |
expirationMonth | string | O | 유효기간 월 (MM 형식) |
cardPassword | string | O | 카드 비밀번호 앞 2자리 |
isCorporate | boolean | O | 법인카드 여부 |
personalId | string | △ | 생년월일 6자리 (개인카드 시 필수) |
corporateId | string | △ | 사업자등록번호 10자리 (법인카드 시 필수) |
응답
필드 | 타입 | 설명 |
---|---|---|
success | boolean | 요청 성공 여부 |
data.cardEndNumber | string | 카드 끝 4자리 |
요청 예시
응답 예시
4. 구독 정보 조회
구독 상세 정보를 조회합니다.
Path 파라미터
파라미터 | 타입 | 설명 |
---|---|---|
customerKey | string | 고객 식별자 |
Query 파라미터
파라미터 | 타입 | 필수 | 설명 |
---|---|---|---|
productId | string (UUID) | O | 구독 상품 ID |
응답
필드 | 타입 | 설명 |
---|---|---|
success | boolean | 요청 성공 여부 |
data.subscription.id | string | 구독 ID |
data.subscription.status | string | 구독 상태 |
data.subscription.currentPeriodStart | string | 현재 구독 기간 시작일 |
data.subscription.currentPeriodEnd | string | 현재 구독 기간 종료일 |
data.subscription.cardEndNumber | string | 카드 끝 4자리 |
data.paymentTransactions[].id | string | 결제 트랜잭션 ID |
data.paymentTransactions[].amount | number | 결제 금액 |
data.paymentTransactions[].currency | string | 통화 |
data.paymentTransactions[].status | string | 결제 상태 |
data.paymentTransactions[].createdAt | string | 결제 일시 |
data.product.id | string | 상품 ID |
data.product.name | string | 상품명 |
data.product.description | string | 상품 설명 |
data.product.unitAmount | number | 단위 가격 |
data.product.currency | string | 통화 |
요청 예시
응답 예시
5. 구독 취소
구독을 취소합니다.
Path 파라미터
파라미터 | 타입 | 설명 |
---|---|---|
subscriptionId | string (UUID) | 구독 ID |
응답
필드 | 타입 | 설명 |
---|---|---|
success | boolean | 요청 성공 여부 |
data.subscription.id | string | 구독 ID |
data.subscription.status | string | 구독 상태 (CANCELED) |
data.subscription.canceledAt | string | 취소 일시 |
요청 예시
응답 예시
6. 구독 수량 업데이트
구독의 수량을 변경합니다.
Path 파라미터
파라미터 | 타입 | 설명 |
---|---|---|
subscriptionId | string (UUID) | 구독 ID |
요청 본문
필드 | 타입 | 필수 | 설명 |
---|---|---|---|
quantity | number | O | 변경할 수량 (1 이상) |
effectiveDate | string | O | 적용 시점 ('immediate': 즉시, 'next_billing': 다음 결제일) |
응답
필드 | 타입 | 설명 |
---|---|---|
success | boolean | 요청 성공 여부 |
data.quantity | number | 변경된 수량 |
data.effectiveDate | string | 적용 시점 |
요청 예시
응답 예시
비즈니스 로직
- 즉시 적용('immediate')을 선택한 경우:
- 수량이 증가하면 남은 기간에 대한 추가 금액이 즉시 청구됨
- 수량이 감소하면 다음 결제부터 새로운 금액이 적용됨
- 다음 결제일 적용('next_billing')을 선택한 경우:
- 현재 구독 기간은 기존 수량 유지
- 다음 결제일부터 새로운 수량과 금액이 적용됨
7. 카드 정보 업데이트
기존 구독의 카드 정보를 포함한 모든 결제 정보를 업데이트합니다.
Path 파라미터
파라미터 | 타입 | 설명 |
---|---|---|
subscriptionId | string (UUID) | 구독 ID |
요청 본문
필드 | 타입 | 필수 | 설명 |
---|---|---|---|
cardNumber | string | O | 카드번호 (XXXX XXXX XXXX XXXX 형식) |
expirationYear | string | O | 유효기간 연도 (YY 형식) |
expirationMonth | string | O | 유효기간 월 (MM 형식) |
cardPassword | string | O | 카드 비밀번호 앞 2자리 |
isCorporate | boolean | O | 법인카드 여부 |
personalId | string | △ | 생년월일 6자리 (개인카드 시 필수) |
corporateId | string | △ | 사업자등록번호 10자리 (법인카드 시 필수) |
updateBilling | boolean | X | 청구 정보 업데이트 여부 (기본값: false) |
응답
필드 | 타입 | 설명 |
---|---|---|
success | boolean | 요청 성공 여부 |
data | object | 업데이트된 결제 수단 정보 |
data.cardEndNumber | string | 카드 끝 4자리 |
data.cardIssuer | string | 카드 발급사 |
data.updatedAt | string | 업데이트 일시 |
요청 예시
응답 예시
비즈니스 로직
- 기존 카드는 자동으로 만료 처리됨
- updateBilling이 true인 경우:
- 다음 결제부터 새로운 카드로 청구됨
- 현재 미납된 청구서가 있다면 즉시 새로운 카드로 재시도
- 카드 정보 변경 시 고객에게 이메일 알림 발송
오류 처리
성공 응답
실패 응답
HTTP 상태 코드
코드 | 설명 |
---|---|
200 | 성공 |
400 | 잘못된 요청 (요청 본문 검증 실패) |
401 | 인증 실패 (API 키 오류) |
403 | 권한 없음 |
404 | 리소스를 찾을 수 없음 |
500 | 서버 오류 |
구독 상태 (RecurringStatus)
상태 | 설명 |
---|---|
TRIALING | 체험 중 (무료 체험 기간) |
ACTIVE | 활성 (정상 이용 중) |
PAST_DUE | 연체 (결제 실패 후 재시도 중) |
UNPAID | 미납 (결제 재시도 모두 실패) |
CANCELED | 취소됨 (해지) |
INCOMPLETE | 진행중 (결제 정보 등록 중) |
INCOMPLETE_EXPIRED | 진행중 만료 (결제 정보 등록 시간 초과) |