[iOS 정기결제] PAYMENT_COMPLETED 이후 최초 지급·구독 콜백 처리 순서 문의

이 글의 성격은 무엇인가요?

질문 / 문제 해결

내용을 설명해주세요

안녕하세요. 프롬프트 공방의 월간 구독을 연동하고 있습니다.

iOS에서 주문 상태는 PAYMENT_COMPLETED인데 이용권 지급이 완료되지 않습니다. 저희가 ‘구독 콜백으로 이용 기간을 확인한 후 최초 지급’하도록 구현한 것이 맞는지 문의드립니다.

개발·테스트 환경

  • WebView / React
  • @apps-in-toss/web-framework 3.1.1
  • iPhone의 토스 앱에서 콘솔에 등록한 AIT 빌드 테스트
  • 상품: MONTHLY 자동 갱신 구독, 매월 이용권과 크레딧 지급

확인한 현상

  1. 9월 21일 21:13 KST에 구독 결제를 진행했습니다.
  2. 같은 날 22:18경 콜백을 등록·검증했습니다. 즉, 해당 결제보다 콜백 등록이 늦었습니다.
  3. 9월 22일 02:17:58 KST까지 확인한 결과, 서버의 주문 조회 결과는 PAYMENT_COMPLETED였습니다. 토스 로그인과 주문의 사용자·SKU 검증은 통과했습니다.
  4. callback.registration_verification은 수신했으나 subscription.status_changed는 서버에 저장된 내역이 없습니다. 등록 검증 성공을 실제 구독 알림 수신으로 간주하지는 않고 있습니다.
  5. iPhone 결제 화면은 긴 로딩 후 ‘환불을 신청해 주세요’ 안내로 바뀌었고, 구매 복구도 완료되지 않았습니다. 실제 환불은 신청하지 않았습니다.

현재 구현

서버에서 주문의 사용자·SKU·결제 상태를 검증한 뒤, 인증된 구독 콜백으로 이용 기간까지 확인해야 최초 이용권·크레딧을 지급하도록 구현했습니다.
기간을 확인하지 못해 실제 지급은 보류 중이며, processProductGrant는 false를 반환합니다. 구매 복구에서도 미지급 상태인 주문에 completeProductGrant를 호출하지 않습니다.

토스 측 오류로 단정하는 것이 아니라, 이 대기 조건 때문에 최초 지급을 막고 있는지 확인하고 싶습니다.

질문

1. 최초 지급의 올바른 순서는 무엇인가요?
서버에서 PAYMENT_COMPLETED와 사용자·SKU를 검증하면, 구독 콜백을 기다리지 않고 실제 이용권·크레딧을 지급한 뒤 지급 완료를 반환해야 하나요?
최초 CREATED 알림은 processProductGrant 성공 또는 completeProductGrant 처리 이전에 오나요, 이후에 오나요?

2. 최초 이용 기간은 서버에서 어떻게 확인해야 하나요?
콜백이 아직 없거나 expiresAt=null인 경우, 실제 구독 시작·만료 시각을 확인할 공식 서버 API·필드 또는 산정 기준이 있나요?

3. 콜백 등록 이전에 발생한 결제는 어떻게 복구하나요?
등록 이전 결제의 구독 이벤트도 소급 발송되나요? 아니라면 이벤트 재전송이나 서버 재조회 등을 통해, 재결제 없이 복구할 수 있는 권장 절차가 궁금합니다.

우선 1번의 지급 순서와 2번의 기간 처리 기준을 알면 저희 구현부터 수정할 수 있습니다.
주문 ID 등 개별 거래 정보는 공식 비공개 상담에 전달해 두었으며, 이 글에서는 공통 연동 명세를 확인받고자 합니다. 감사합니다.

appName (선택)

prompt-atelier