Flutter 웹에서 PortOne(v1)을 이용해 결제 기능을 구현하려고 시도했으나, 문제가 발생
<script src="https://cdn.iamport.kr/js/iamport.js"></script>
dart:js_interop
사용@JS()
+ @staticInterop
을 이용해 JS 함수와 객체를 Dart에서 호출 시도requestPay()
등을 Dart에서 호출하고자 함TypeError: Cannot read properties of undefined (reading 'IMP')
iamport.js
가 불러와졌지만, Dart → JS 경로에서 window.IMP
가 아직 초기화되지 않았거나, 접근 불가JS 코드를 index.html
에 직접 작성
index.html
에 작성<script>
let widget = null;
window.startPortOnePayment = async function (paymentData) {
try {
const paymentId = crypto.randomUUID(); // 또는 직접 생성
const paymentResult = await PortOne.requestPayment({
storeId: paymentData.storeId,
channelKey: paymentData.channelKey,
paymentId,
orderName: paymentData.orderName,
totalAmount: paymentData.totalAmount,
currency: paymentData.currency,
payMethod: paymentData.payMethod,
});
console.log(paymentResult);
if (paymentResult.code !== undefined) {
// 결제 실패
window.dispatchEvent(new CustomEvent("paymentResult", {
detail: { success: false, error_msg: paymentResult.message }
}));
return;
}
// ✅ 백엔드 없이 바로 결제 성공 처리
console.log("결제 성공:", paymentResult);
window.dispatchEvent(new CustomEvent("paymentResult", {
detail: { success: true, ...paymentResult }
}));
} catch (error) {
console.log("결제 오류:", error);
window.dispatchEvent(new CustomEvent("paymentResult", {
detail: { success: false, error_msg: error.message }
}));
}
}
</script>
v1 SDK → v2 SDK로 변경
<script src="https://cdn.portone.io/v2/browser-sdk.js"></script>
Dart에서 JS 이벤트 리스닝 처리
CustomEvent
사용import 'dart:html';
window.addEventListener('paymentResult', (event) {
final CustomEvent customEvent = event as CustomEvent;
final detail = customEvent.detail;
if (detail['success'] == true) {
// 결제 성공 처리
} else {
// 결제 실패 처리
}
});