인앱결제 새로운 상품 후 샌드박스에서 테스트 불가

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

질문 / 문제 해결

내용을 설명해주세요

개발환경: WebView
사용중인 SDK 버전: @apps-in-tossapps-in-tossapps-in-tossapps-in-toss/web-framework 2.4.7
테스트 환경: 샌드박스
토스앱 버전: 5.258.1
샌드박스 앱: 최신 버전
상품 SKU: ait.0000019167.986a4d44.dc62a60424.781268xxxx
ait.0000019167.b720bc67.9789279cec.8952xxxx (신규 상품)

안녕하세요.
현재 운영하고 있는 앱에 결제 상품이 1개 있었고, 새로 1개를 더 추가했습니다.
그 후에 샌드박스에서 결제 테스트가 정상적으로 되지 않아서 문의 드립니다.
신규 상품을 미노출-> 노출 로 한 후에 getProductItemList 에는 정상적으로 보이나
결제(성공) 테스트를 하니 첨부된 이미지처럼 에러가 납니다. (*기존 상품도 동일한 에러 발생 )

=====================================================================
[grant debug] tossOrder= {“orderId”:“C6C43745-6C2E-4170-9DE8-331E80BBEB94”,“sku”:null,“status”:“NOT_FOUND”,“statusDeterminedAt”:null,“reason”:“주문을 찾지 못했어요.”} expectedSku= ait.0000019167.b720bc67.9789279cec.8952433830

[grant debug] SKU mismatch — tossOrder.sku= null

어떻게 하면 테스트 가능한 지 알려주시면 감사하겠습니다.

이미지 첨부

안녕하세요 :slight_smile:
에러 화면으로 확인했을때는 상품 지급 처리(processProductGrant)가 호출되지 않아 발생한 문제 같은데,
사용하신 코드 공유해주실 수 있을까요 ?

네 다음과 같습니다.
현재 사용중인 상품 : ait.0000019167.986a4d44.dc62a60424.7812685505
이번에 추가한 상품 : ait.0000019167.b720bc67.9789279cec.8952433830 (미노출 시켰습니다. 다시 노출로 할까요?)

PREMIUM_READING_SKU의 값은 현재 사용중인 상품입니다.
새로 추가한 상품도 const 변수값만 다르고 로직은 같습니다.
감사합니다.

================================================================
const { IAP } = await import(‘@apps-in-toss/web-framework’);

  return await new Promise<PurchaseResult>((resolve) => {

    let cleanup: (() => void) | undefined;

    let purchaseOrderId: string | undefined;

    cleanup = IAP.createOneTimePurchaseOrder({

      options: {

        sku: PREMIUM_READING_SKU,

        processProductGrant: async ({ orderId }) => {

          if (typeof orderId !== 'string' || orderId.length === 0) {

            return false;

          }

          purchaseOrderId = orderId;

          savePurchaseContext(\`${ORDER_CONTEXT_PREFIX}${orderId}\`, params);

          const result = await grantToServer({

            orderId,

            sku: PREMIUM_READING_SKU,

            amount: 990,

            ...params,

          });

          return result;

        },

      },

      onEvent: (event) => {

        if (event.type === 'success') {

          cleanup?.();

          removePurchaseContext(PENDING_CONTEXT_KEY);

          if (event.data.orderId) {

            removePurchaseContext(\`${ORDER_CONTEXT_PREFIX}${event.data.orderId}\`);

          }

          setPurchasing(false);

          resolve({

            success: true,

            orderId: event.data.orderId,

          });

        }

      },

      onError: (error) => {

        cleanup?.();

        const err = error as TossPurchaseError;

        const errorOrderId = typeof err.userInfo?.orderId === 'string' ? err.userInfo.orderId : undefined;

        const targetOrderId = purchaseOrderId || errorOrderId;

processProductGrant 호출 구간에서 async를 빼고 테스트 해봐주실 수 있을까요?

async 를 빼니깐 응답이 안오는 것 같아요.
첨부 이미지에서 멈춰있습니다.

grantToSever() 함수가 정상 동작 하고 있나요 ?? true를 반환하는지요 ?!

false를 반환하고 있습니다.

[grantToServer]
status=403
ok=false
params={“orderId”:“4A56D1CC-4242-4B43-9C97-37CB0627CC12”,“sku”:“ait.0000019167.986a4d44.dc62a60424.7812685505”,“amount”:990,“category”:“relationships”,“questionId”:“rel_02”,“questionTitle”:“진짜 친구”,“cardId”:14}
body={“error”:“Order SKU mismatch”}

앗 processProductGrant 는 true로 반환해주셔야 합니다.
grantToServer 는 자체 서버로 주문을 전송하는 구간이지요 ?

넵 맞습니다.
자체 서버에서 한번 더 토스에 확인 작업을 하고 DB에 저장하는데
확인하는 과정에서 NOT_FOUND 가 나오는 것 같아서요. ^^;;

image

grantToServer에서 true를 반환 할 수 있도록 처리 후 재시도 부탁드려도 될까요 ?

엇! 그러면 혹시 결제 직후라
/api-partner/v1/apps-in-toss/order/get-order-status

이걸로 다시 결제 상태를 조회할 필요가 없을까요?

넵! 상품 지급 로직을 바로 호출해주시고, true 반환 부탁드립니다.

아하~ 알겠습니다
그렇게 함 해볼게요.

그럼 위에서 false 가 오는 건

결제가 아직 transaction 내에서 (아직 처리중~~~ ) 제쪽 서버에서 호출해서 그런가보네요? (?)

답변 감사합니다 :slight_smile: