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

샌드박스앱 결제 테스트 중에 결제 완료 테스트를 누르면 무조건 다음과 같은 화면이 나옵니다.

로그를 찍어 봤을 때 sku는 정상적으로 표시되서, 게임 내에서 아이템 지급 처리는 되었는데, 제가 뭔가를 놓치고 있는 건가요? 아니면 원래 이렇게 되는 것이 정상인 건가요?
혹시나 해서 로그의 경고 메시지도 첨부 합니다.

참고로 아래 코드를 사용하였습니다.

// 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);

}

},

안녕하세요 :slight_smile:


여기서 두번째 결제 성공(서버 실패 테스트) 버튼을 누르신걸까요 ?
호출 결과가 달라보이는데, 최신 샌드박스앱으로 설치해주실 수 있을까요 ?

안녕하세요. 테스트는 안드로이드 디바이스에서 샌드박스 앱으로 했으며 “테스트시작하기 > 결제 성공 테스트” 를 실행했습니다.

저는 RN에서 만들고 있어서 좀 다를 수가 있는데.
만드신 코드에서는 promise 안에서 결과를 resolve 로만 전달해주고 있는 걸로 보여요.
processProductGrant function 에서 return true도 해줘야 grant 된 것으로 처리됩니다. 반대로 false면 grant 안된걸로 될꺼구요.
resolve 이후 return true 해주면 아마 해결되지 않을까.. 시도해 보세요!

예전에는 명시적으로 await IAP.completeProductGrant({ params: { orderId } }); 를 불러줬는데.이건 개인적으로 구현을 잘못했던 것 같아요. 안드로이드 12월 초 버전 샌드박스에서는 processProductGrant 내부에서 completeProductGrant 을 부르면 오류 메세지 없이 샌드박스 앱 자체가 죽어버립니다. (예전 버전의 샌드박스나 실제 출시된 앱의 결제에는 문제가 없습니다.) 올바른 구현은 아닌 것 같지만 이건 샌드박스의 미니앱 버그로 해결되면 좋을 듯.

ps. 뒤늦게 3시간 전 올리신 글의 코드 보니 Promise의 형태로 boolean을 리턴도 해보신 것 같은데 안되는게 이상하네요;; 그래도 리턴되는 부분을 잘 보시면 좋을 것 같아요. 그냥 boolean 형태로 리턴하시거나
completeProductGrant 도 한번 고려해 보세요!

1개의 좋아요

알려주신대로 completeProductGrant()에서 true를 리턴했더니 결제 성공 메시지가 나왔습니다.



        processProductGrant: function(obj) {

          var orderId = obj.orderId;

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



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



          var promise = new Promise(function(resolve) {

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

              resolve(success === true);

            };

          });



          // Toss SDK는 Promise를 기다리면서 동시에 true 반환을 기대

          return true; // 브릿지 연결 신호

          // 실제 성공/실패는 Promise resolve에서 전달됨

        }

      },

공식 가이드의 예제도 잘 보니까 그냥 true를 리턴하고 있네요, 유니티 베이스의 프로젝트이다 보니 여러모로 커스텀 하는 과정에서 놓쳤나봅니다. 너무 어렵네요 ㅠㅗㅠ

정말정말 너무 감사합니다

대박! 잘 해결되었다니 기분이 좋습니다. 성공 알려주셔서 감사해요.
토스를 통한 인앱결제라 해본 적도 없고 샘플도 적어 성공하기까지 시간이 좀 걸리지만 해보면 이해가 되게 잘 만들어 두었어요.

1개의 좋아요