processProductGrant가 true를 반환했는데 PRODUCT_NOT_GRANTED_BY_PARTNER 에러가 발생합니다

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

질문 / 문제 해결

내용을 설명해주세요

환경

  • iOS (iPhone), 토스 앱 최신 버전
  • @apps-in-toss/web-framework 2.1.0
  • createOneTimePurchaseOrderprocessProductGrant 지원 버전 (v5.231.1+)

현상
processProductGrant 콜백에서 서버 API 호출 후 true를 반환했는데, onSuccess가 아닌 onErrorPRODUCT_NOT_GRANTED_BY_PARTNER가 전달됩니다. 동일 패턴으로 2건 발생했습니다.

코드

createOneTimePurchaseOrder({
  options: {
    sku: 'my-product-id',
    processProductGrant: async ({ orderId }) => {
      const ok = await fetch('/api/confirm', { body: JSON.stringify({ orderId }) });
      // ok.status === 200
      return true; // ← 정상 반환
    },
  },
  onEvent: (event) => {
    if (event.type === 'success') {
      // 여기에 도달하지 않음
    }
  },
  onError: (error) => {
    // error.code === 'PRODUCT_NOT_GRANTED_BY_PARTNER'
    // 콜백이 true를 반환했는데도 여기로 옴
  },
});

확인한 것

  • Sentry breadcrumbs에서 서버 API → 200 응답 직후(~1초 내) 에러 발생 확인
  • 서버 측 에러 로그 없음 — 콜백 내 로직은 정상 완료
  • 콜백이 false를 반환하거나 예외를 던진 경우가 아님
  • 2건 모두 iOS

대응
콜백 안에서 true 반환 전에 클라이언트 상태를 선저장하고, onError 발생 시에도 재진입 시 getPendingOrders로 복구되도록 처리했습니다.

질문
문서에는 PRODUCT_NOT_GRANTED_BY_PARTNER가 “파트너가 상품 지급에 실패했을 때” 발생한다고 되어 있는데, 콜백이 정상적으로 true를 반환한 경우에도 이 에러가 발생할 수 있는 조건이 있을까요? (예: 내부 타임아웃, 브릿지 통신 실패 등)

appName (선택)

draw