ADR-DS-062_PG 리다이렉트 결과 확인 정책
1. 기본 정보
Conforms to: ADR-DS-000 v1 Effective from: ADR-DS-060+ If conflict: ADR-DS-000 wins. Deprecated terms in this scope:
arrived,checkin/check_in.
ADR ID: ADR-DS-062
제목: PG 리다이렉트 기반 결제 결과 확인 구조
상태: Accepted
작성일: 2026-03-07
작성자: YSY
관련 ADR:
- ADR-DS-060 (선결제 기능 도입)
- ADR-DS-061 (결제 중 슬롯 임시 확보 정책)
2. 배경 (Context)
플랫폼은 발행자 직접 결제 구조를 채택한다.
결제 구조는 다음과 같다.
사용자
→ 발행자 PG 결제
→ 발행자 계좌 정산플랫폼은
결제 수령
정산
환불 처리를 수행하지 않는다.
대신 플랫폼은 결제 성공 여부만 확인하여 슬롯 상태를 변경한다.
따라서 결제 완료 이후 플랫폼이 결제 결과를 확인하는 방법이 필요하다.
PG에서 제공하는 가장 일반적인 방식은 **결제 완료 후 리다이렉트(return URL)**이다.
3. 결정 (Decision)
플랫폼은 PG 리다이렉트 기반 결제 결과 확인 방식을 채택한다.
3.1 결제 흐름
선결제 슬롯의 결제 흐름은 다음과 같다.
슬롯 선택
→ reservation 생성 (reserved)
→ PG 결제창 이동
→ 결제 진행
→ PG 결제 완료
→ PG → 플랫폼 redirect
→ 결제 결과 확인
→ reservation 상태 paid플랫폼은 리다이렉트 요청을 통해 결제 성공 여부를 확인한다.
3.2 결제 요청 시 전달 정보
결제 요청 시 플랫폼은 다음 정보를 PG에 전달한다.
reservation_id
slot_id
publisher_id
order_id
amount
return_urlorder_id 또는 reservation_id는 결제 결과를 식별하기 위한 값으로 사용된다.
3.3 리다이렉트 처리
결제 완료 후 PG는 다음 정보를 포함하여 플랫폼으로 리다이렉트한다.
order_id
payment_status
payment_key
amount플랫폼은 이 값을 기준으로 해당 예약을 식별한다.
식별 기본키는 order_id로 통일하고,
reservation_id는 내부 대조용 보조키로 사용한다.
3.4 결제 성공 처리
결제 성공 시 다음 상태 전이가 발생한다.
reserved → paid이 시점 이후 슬롯은 확정된다.
매장은 결제 완료 이후 준비를 시작할 수 있다.
3.5 결제 실패 처리
결제 실패 또는 취소 시 다음 상태로 전환된다.
reserved → payment_failed슬롯 수량은 복구된다.
4. 리다이렉트 기반 구조의 한계
리다이렉트 방식은 사용자 브라우저 이동에 의존한다.
다음 상황이 발생할 수 있다.
결제 완료 후 브라우저 종료
네트워크 문제
딥링크 실패
앱 복귀 실패이 경우 실제 결제는 성공했지만 플랫폼이 이를 확인하지 못할 수 있다.
5. 서버 검증 정책
리다이렉트 결과만으로 결제를 확정하지 않는다.
플랫폼은 다음 절차를 추가한다.
redirect 수신
→ order_id 확인
→ amount 확인
→ PG 서버 검증
→ 결제 성공 확인
→ paid 처리이 검증 과정은 다음 정보를 확인한다.
order_id
amount
payment_status
pg_mid이를 통해 결제 위변조 및 상태 오류를 방지한다.
모든 결제 결과 반영은 order_id 기준 idempotent 하게 처리한다.
6. 결제 확인 실패 처리
리다이렉트가 발생하지 않은 경우를 대비하여 다음 정책을 적용한다.
reserved 상태 예약은 일정 시간 동안 paid 상태로 전환되지 않으면 자동 만료된다.
예:
reserved TTL = 3분이후 상태
reserved → expired리다이렉트 누락 구간 보완을 위해 다음 보정 경로를 허용한다.
PG webhook 수신
또는
주문 조회(reconcile) 배치보정 경로 역시 order_id 기준으로 동일한 검증/상태 전이 규칙을 적용한다.
7. 결과 (Consequences)
긍정적 영향
- 플랫폼이 결제 금액을 처리하지 않음
- 결제 정산 구조가 필요 없음
- 발행자 직접 결제 구조 유지
- 선결제 슬롯 안정적 운영 가능
제한 사항
- 발행자가 PG를 보유해야 함
- PG별 리다이렉트 구조 차이 존재
- 서버 검증 로직 필요
8. 구조적 의미
본 정책은 플랫폼의 핵심 철학을 유지하기 위한 기술 결정이다.
플랫폼은 다음 역할만 수행한다.
슬롯 관리
예약 관리
결제 상태 반영
사용 처리플랫폼은 다음 역할을 수행하지 않는다.
결제 수령
정산 관리
거래 중개즉 플랫폼은
거래 플랫폼이 아니라 시간 기반 슬롯 인프라이다.
Template v2 Addendum
In Scope
- Prepaid slot operations (reservation, payment confirmation, pickup, quantity, PG connection)
Out of Scope
- Order brokering, settlement handling, refund amount calculation
Boundaries
- Payment responsibility is on publisher. Time/state management is on platform.
Source of Truth (SoT)
- Base: ADR-DS-060; Temporary hold: ADR-DS-061; Payment verification/reconcile: ADR-DS-062; Pickup ops: ADR-DS-063; Quantity/concurrency: ADR-DS-064; PG registration/secret handling: ADR-DS-065.
Validation
- Detect state/constraint violations via tests and batch checks.
- Recovery and reprocessing must be idempotent.
Revisit Conditions
- KPI threshold breach (reservation failure, expiry ratio, payment confirmation failure)
- External dependency change (PG, regulation, location API)
DS-000 v1 정합성 개정 (2026-03-08)
이 문서는 ADR-DS-000 v1에 정합되도록 다음 규칙을 우선 적용한다.
- Reservation 상태 집합은
reserved | redeemed | expired | cancelled만 사용한다. paid,payment_failed,no_show는 Reservation 상태로 사용하지 않는다.- 결제 중 임시 점유는 Reservation 상태가 아니라
hold도메인으로 분리한다. - 수량 차감은
reserved -> redeemed전이 트랜잭션에서만 수행한다. prepaid + verification_method=none은 결제 성공 시 즉시redeemed전이를 허용할 수 있다.prepaid + (location|qr)는 결제 성공 후 검증 성공 시redeemed로 전이한다.- 만료 시각은 운영 상한을 강제한다:
expires_at <= store_close_at.
본 섹션과 기존 본문이 충돌하면 본 섹션(DS-000 정합성 개정)이 우선한다.