1.개요와 용어
이 서버는 사내 여러 서비스가 공용으로 쓰는 구독·결제 처리 서버입니다.
각 서비스는 자기 요금제를 만들고, 자기 사용자의 구독과 결제를 이 서버에 위임합니다.
실제 카드 결제는 토스페이먼츠를 통해 처리됩니다.
| 용어 | 의미 |
| 서비스 | 이 서버를 이용하는 사내 서비스 한 개. 서비스마다 API 키와 토스 결제 키를 따로 가진다. |
| 사용자 | 각 서비스의 최종 고객. 이 서버에서는 이메일 주소만으로 식별한다(소문자로 정규화해 저장). |
| 요금제 | 서비스가 만든 구독 상품(가격·결제주기·할인 규칙). |
| 구독 | 사용자 한 명이 요금제 하나를 이용 중인 상태. 만료일마다 자동으로 결제·연장된다. |
| 카드 보관함 | 사용자별로 등록해 두는 결제 카드. 구독·결제는 항상 이 카드로 청구된다. |
| 단건(일반) 결제 | 구독과 무관한 1회성 결제. |
2.서비스 등록과 인증
- 서비스는 서비스명 · 서버 IP · 담당자 이메일로 등록하고, 발급된 서비스 키를 전달받아 사용합니다.
- 모든 API 호출은 3중 인증(서비스 키 + 시각 + 서명)을 통과해야 하며, 등록된 IP에서만 호출할 수 있습니다.
- 결제가 발생하는 서비스는 서비스별 토스 시크릿 키가 등록되어 있어야 합니다. 키가 없으면 결제·요금제 변경이 거부됩니다.
- 구독이 남아 있는 서비스는 삭제할 수 없습니다.
3.요금제 정책
결제 주기
- 년 · 월 · 주 · 일 — 일 단위는 원하는 일수를 지정합니다(예: 15일마다). 월·년은 말일 보정(1/31 가입 → 2/28 결제).
- 분 단위 주기는 자동연장 테스트 전용이며 운영 환경에서는 만들 수 없습니다.
- 자동결제 안함 옵션: 첫 결제 후 자동연장 없이 주기 종료 시 만료됩니다.
가격과 할인
- 모든 청구 금액은 항상 서버가 계산합니다. 외부에서 금액을 지정할 수 없습니다.
- 첫 구독 혜택(1회차): 없음 / 무료 / 정액 할인 / 정률 할인 — 정가 기준으로 적용됩니다.
- 상시 할인(2회차~): 없음 / 정액 / 정률 — 매 갱신 결제의 실제 청구액이 됩니다.
- 두 할인은 중첩되지 않습니다. 첫 회차는 첫구독 혜택만, 이후는 상시 할인만.
- 첫 구독 혜택은 사용자당 평생 1회입니다. 혜택을 이미 쓴 사용자가 재구독하면 상시 할인가로 시작합니다.
- 요금제 정가 상한: 기본 9억 원(전체 설정에서 조정).
⚠️
구독이 남아 있는 요금제는 삭제할 수 없습니다. 신규 가입만 막으려면 보관(ARCHIVED) 처리하세요 — 기존 구독은 그대로 유지·갱신됩니다.
4.구독 생명주기 정책
기본 규칙
- 서비스+사용자당 구독은 1개입니다(완전히 만료된 구독 제외 — 재구독 가능).
- 구독 전에 카드가 먼저 등록되어 있어야 합니다. 같은 사용자가 카드를 다시 등록하면 기존 카드가 교체되며(이것이 곧 카드 변경), 이용 중 구독이 있는 카드는 삭제할 수 없습니다.
- 예외 — 체험(trial)은 카드 없이 시작할 수 있습니다. 체험 만료 시점에 카드가 등록되어 있으면 첫 자동결제로 이용중(ACTIVE) 전환, 카드가 없으면 결제 시도 없이 즉시 만료(EXPIRED)됩니다.
- 구독은 만료일에 상시 할인가로 자동 결제·연장됩니다.
상태 흐름
| 상태 | 서비스 이용 | 설명 |
| 체험 TRIAL | 허용 | 결제 없이 시작 — 카드 등록도 필수가 아닙니다. 만료일에 카드가 있으면 첫 자동결제, 없으면 즉시 만료. 체험 중 취소하면 즉시 종료됩니다. |
| 이용중 ACTIVE | 허용 | 정상 상태. 만료일에 자동연장. |
| 연체 PAST_DUE | 허용 | 자동결제 실패 후 재시도 중. 이용은 유지됩니다. |
| 정지 SUSPENDED | 차단 | 재시도 소진. 자동결제 중지 — 수동 결제로만 복구. |
| 취소예약 CANCELED | 허용 | 취소했지만 만료일까지 이용 가능. 만료 전이면 재개할 수 있습니다. |
| 연장처리 EXTENDED | 허용 | 운영자가 만료일을 수동 연장한 상태. 새 만료일에 자동결제로 갱신. |
| 만료 EXPIRED | 차단 | 완전 종료(최종 상태). 보관 중이던 카드·빌링키도 제거됩니다. 다시 쓰려면 재구독. |
💡
취소는 즉시 종료가 아닙니다. 이미 결제한 기간(만료일)까지는 그대로 이용하고, 만료일에 자동으로 종료됩니다. 별도 환불은 없습니다.
5.요금제 변경 정책 r02 신규
구독 중에도 다른 요금제로 갈아탈 수 있습니다. 이용중(ACTIVE) 구독만 변경할 수 있으며,
방향 판정 기준은 상시 할인 적용가(실제 정기 결제액)입니다.
| 구분 | 조건 | 처리 |
업그레이드 즉시 전환 |
새 요금제 금액 ≥ 현재 금액 (같은 금액도 업그레이드) |
① 새 요금제 금액을 즉시 결제 → ② 요금제 전환 + 이용기간을 지금부터 새로 시작 → ③ 기존 결제의 미사용분 환불 |
다운그레이드 예약 전환 |
새 요금제 금액 < 현재 금액 |
즉시 결제·환불 없음. 다음 결제일까지 현재 요금제를 그대로 이용하고, 결제일에 새(낮은) 요금제 금액이 자동 결제되며 전환 |
업그레이드 환불액 산정
- 서비스가 환불 금액을 직접 지정할 수 있습니다 — 허용 범위는 0원 ~ 해당 결제의 잔여 환불가능액(이미 환불된 금액 제외).
- 지정하지 않으면 서버가 미사용 기간을 초 단위로 일할계산합니다: 환불액 = 실결제액 × 남은시간 ÷ 전체기간 (원 단위 내림).
- 환불 대상 결제가 없으면(무료 첫구독 등) 환불 없이 전환만 진행됩니다.
안전 규칙
- 결제가 먼저, 환불은 나중. 새 결제가 실패하면 아무것도 바뀌지 않습니다(기존 요금제 그대로).
- 환불만 실패한 드문 경우 전환은 유지되고, 감사 로그에 수동 환불 검토로 표시되어 운영자가 처리합니다.
- 갱신 결제가 진행 중인 시점(결제일 도래, 미확정 결제 존재)에는 변경이 잠시 거부됩니다 — 잠시 후 다시 시도하면 됩니다.
다운그레이드 예약 관리
- 예약 후 다시 변경을 신청하면 예약이 덮어써집니다(더 높은 요금제를 고르면 즉시 전환 규칙 적용).
- 예약은 언제든 취소할 수 있습니다.
- 구독을 취소해도 예약은 남아 있으며 — 갱신이 없으므로 자연히 실행되지 않고 — 구독을 재개하면 예약도 다시 유효해집니다.
🔍
어드민에서 확인: 구독 상세 화면에 요금제 변경 이력(전→후 요금제·결제액·환불액)과 결제 이력의 환불액이 표시되고, 예약 중이면 "요금제 변경 예약" 항목이 보입니다. 감사 로그에는 이름·금액·기간 변화·환불 결과까지 전부 기록됩니다.
6.결제·환불 정책
자동결제 실패 처리
- 재시도 횟수·간격·정지 유예일은 전체 설정에서 조정할 수 있습니다(위는 기본값).
- 실패·정지 시 담당자에게 이메일이 발송됩니다. 사용자가 카드를 바꾸고 수동 결제하면 즉시 이용중으로 복귀합니다(결제 기준일은 그 시점부터 다시 시작).
🛡️
타임아웃은 실패가 아닙니다. 결제 결과를 알 수 없을 때는 실패 처리하지 않고 보류했다가, 10분 유예 후 정산 절차가 토스에 실제 결과를 확인해 확정합니다 — 이중결제를 막기 위한 규칙입니다.
단건(일반) 결제와 취소
- 1회 결제 상한: 기본 1억 원(전체 설정에서 조정).
- 사용자 측 취소(환불)는 서비스별 정책을 따릅니다 — 취소 허용 여부 + 취소 수수료율(%). 환불액 = 결제액 − 수수료.
- 관리자 취소는 수수료 없이, 부분 취소를 여러 번 누적할 수 있습니다.
- 구독 자동결제·요금제 변경 환불에는 취소 수수료가 없습니다.
7.운영자 개입과 기록
| 운영 기능 | 정책 |
| 수동 재결제 | 연체·정지 구독을 어드민에서 즉시 재청구. 성공 시 이용중 복귀 + 기준일 리셋. |
| 만료일 연장 | 운영자가 만료일을 지정 연장(상태: 연장처리). 새 만료일에 자동결제로 갱신. 만료된 구독은 연장 불가(재구독으로). |
| 사용일 추가 | 이용 중 구독의 만료일·결제일을 지정 일수만큼 미룸(1~3,650일, 상태 불변, 결제 없음). |
| 강제 취소 | 운영자가 구독을 취소예약 상태로 전환(사용자 취소와 동일하게 만료일까지 이용). |
기록과 알림
- 감사 로그: 구독·결제·요금제·설정의 모든 변경이 "누가·무엇을·어떻게"까지 기록됩니다.
요금제 변경은 전→후 요금제 이름, 결제액, 환불 산정 방식과 환불액, 잔여 환불가능액, 이용기간 변화, 환불 실행 결과까지 남습니다.
- 서비스 알림(웹훅): 구독 생성·상태 변화·자동결제·요금제 변경·만료 등을 각 서비스가 등록한 URL로 서명과 함께 전송합니다.
- 이메일: 결제 실패/정지, 신규 구독·요금제·계정 생성 등을 담당자/시스템 관리자에게 발송합니다.
8.부록
전체 설정 기본값
| 항목 | 기본값 | 비고 |
| 자동결제 재시도 횟수 | 4회 | 어드민 → 전체 설정에서 조정, 다음 배치부터 적용 |
| 재시도 간격 | 12시간 |
| 정지 후 만료 유예 | 30일 |
| 단건 결제 1회 상한 | 100,000,000원 | |
| 요금제 정가 상한 | 900,000,000원 | |
| 사용일 추가 상한 | 3,650일 | |
| 어드민 로그인 잠금 | 연속 실패 5회 | 일정 시간 후 자동 해제 |
정책 요약 한 줄씩
- 사용자 식별은 이메일만 · 서비스+사용자당 구독 1개 · 금액은 항상 서버 계산.
- 취소는 만료일까지 이용 · 첫구독 혜택은 평생 1회 · 구독 있는 요금제/서비스는 삭제 불가.
- 체험은 카드 없이 시작 가능 — 만료 시 카드가 있으면 첫 자동결제, 없으면 즉시 만료.
- 요금제 변경: 높거나 같으면 즉시(결제→전환→환불), 낮으면 다음 결제일 전환 예약.
- 결제 실패는 재시도→정지→만료 단계로, 타임아웃은 실패로 취급하지 않는다.
문서 이력
| 버전 | 일자 | 내용 |
| v0.1.0 | 2026-07-14 | 최초 발행 — 서버 v0.1.3 기준(요금제 변경 r02, 감사로그 완전 기록 포함). 같은 날 보강: 다이어그램 5종, 체험(trial) 카드 선택화 정책(카드 없이 시작 · 만료 시 무카드면 즉시 만료) |