-
사용엔진: 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);
};
});
}

