샌드박스 결제 테스트 시 "processProductGrant 브릿지를 호출해 주세요" 메시지가 나옵니다

  • 사용엔진: Unity3D 2021.3.45f2

  • 개발환경: Vanilla+JavaScript

  • SDK버전: 1.5.1

안드로이드 샌드박스앱으로 인앱테스트를 진행하고 있습니다. “테스트시작하기 > 결제 성공 테스트”를 선택 하면 무조건 실패 메시지가 나오는데요. 제가 뭔가 놓친게 있을지요?

참고로 해당 메시지가 나올때의 별도의 에러는 없었고, 그냥 아래와 같이 경고 메시지가 표시되었습니다.

유니티와 통신을 위한 .jslib에는 다음과 같은 코드를 사용하였습니다.

// Unity → JS: 결제 시작 (sku)

PurchaseItem: function(skuPtr) {

*var* sku = UTF8ToString(skuPtr);

if (!sku) {

  *console*.error("\[TossIAP\] SKU is undefined!");

  *window*.unityInstance.SendMessage("MessageRouter", "OnMessageFromJS", "iapPurchaseError:SKU undefined");

  return;

}

if (!*window*.\__TossIAPGrantResolvers) {

  *window*.\__TossIAPGrantResolvers = {};

}

*var* cleanup = *window*.TossIAP.createOneTimePurchaseOrder({

  options: {

    sku: sku,

    processProductGrant: *function*(obj) {

      *var* orderId = obj.orderId;

      *console*.log("\[TossIAP\] processProductGrant 호출:", orderId);

      *window*.unityInstance.SendMessage("MessageRouter", "OnMessageFromJS", "iapGrant:" + orderId);

      return new Promise(*function*(resolve) {

        *window*.\__TossIAPGrantResolvers\[orderId\] = *function*(success) {

          resolve(success === true);

        };

      });

    }

  },

  onEvent: *function*(event) {

    if (event && event.type === "success") {

      *console*.log("\[TossIAP\] 결제 성공 이벤트:", event.data);

      *window*.unityInstance.SendMessage(

        "MessageRouter",

        "OnMessageFromJS",

        "iapPurchaseSuccess:" + JSON.stringify(event.data)

      );

      if (cleanup) cleanup();

    }

  },

  onError: *function*(error) {

    *console*.error("\[TossIAP\] 결제 실패:", error);

    *var* msg = error && error.message ? error.message : "Unknown error";

    *window*.unityInstance.SendMessage("MessageRouter", "OnMessageFromJS", "iapPurchaseError:" + msg);

    if (cleanup) cleanup();

  }

});

*window*.addEventListener("pagehide", *function*() {

  try { if (cleanup) cleanup(); } catch (e) {}

});

},

// Unity → JS: 지급 결과 콜백 (orderId, success 0/1)

OnProductGrantResult: function(orderIdPtr, success) {

*var* orderId = UTF8ToString(orderIdPtr);

*var* ok = success ? true : false;

if (!*window*.\__TossIAPGrantResolvers) {

  *console*.warn("\[TossIAP\] GrantResolvers not initialized");

  return;

}

*var* resolver = *window*.\__TossIAPGrantResolvers\[orderId\];

if (resolver) {

  resolver(ok);

  delete *window*.\__TossIAPGrantResolvers\[orderId\];

  *console*.log("\[TossIAP\] 상품 지급 결과 반환:", orderId, ok);

} else {

  *console*.warn("\[TossIAP\] Resolver not found for orderId:", orderId);

}

},

// 별도 호출용 processProductGrant 함수

processProductGrant: function(obj) {

*var* orderId = obj.orderId;

*console*.log("\[TossIAP\] processProductGrant 호출:", orderId);

*// Unity*로 지급 시도 메시지 전달

*window*.unityInstance.SendMessage("MessageRouter", "OnMessageFromJS", "iapGrant:" + orderId);

*// Unity*에서 지급 성공*/*실패 결과를 다시 *resolve*해야 함

return new Promise(*function*(resolve) {

  *window*.\__TossIAPGrantResolvers\[orderId\] = *function*(success) {

    resolve(success === true);

  };

});

}

글이 중복된 것 같아요 :slight_smile: 다른 글에서 답변 드렸습니당