특정 상황에서 `@tosspayments/payment-sdk` 가 이상하게 동작합니다.
import { useEffect } from "react";
import { loadTossPayments } from "@tosspayments/payment-sdk";
import { PageProps } from "pages/_app";
const PaymentPage = ({ router }: PageProps) => {
if (!router.isReady) return;
const {
phase,
amount,
orderId,
orderName,
onSuccess,
onFailure,
paymentKey,
errorCode,
errorMessage,
} = router.query as PaymentPageQuery;
useEffect(() => {
switch (phase) {
case "init":
const { origin, pathname, search } = window.location;
const query = new URLSearchParams(search);
query.delete("orderId");
query.delete("amount");
loadTossPayments(process.env.NEXT_PUBLIC_TOSS_CLIENT_KEY).then(({ requestPayment }) =>
requestPayment("카드", {
amount: Number(amount),
orderId,
orderName,
successUrl: origin + pathname.replace("init", "success") + "?" + query,
failUrl: origin + pathname.replace("init", "failure") + "?" + query,
}).catch((error) => {
console.error(error);
alert("결제를 취소합니다.");
window.history.go(-2);
}),
);
return;
case "success":
router.push({ pathname: onSuccess, query: { ...router.query, paymentId: paymentKey } });
return;
case "failure":
router.push({ pathname: onFailure, query: { ...router.query, errorCode, errorMessage } });
return;
}
}, []);
return null;
};import { useEffect } from "react";
import { loadTossPayments } from "@tosspayments/payment-sdk";
import { PageProps } from "pages/_app";
const PaymentPage = ({ router }: PageProps) => {
if (!router.isReady) return;
const {
phase,
amount,
orderId,
orderName,
onSuccess,
onFailure,
paymentKey,
errorCode,
errorMessage,
} = router.query as PaymentPageQuery;
useEffect(() => {
switch (phase) {
case "init":
const { origin, pathname, search } = window.location;
const query = new URLSearchParams(search);
query.delete("orderId");
query.delete("amount");
loadTossPayments(process.env.NEXT_PUBLIC_TOSS_CLIENT_KEY).then(({ requestPayment }) =>
requestPayment("카드", {
amount: Number(amount),
orderId,
orderName,
successUrl: origin + pathname.replace("init", "success") + "?" + query,
failUrl: origin + pathname.replace("init", "failure") + "?" + query,
}).catch((error) => {
console.error(error);
alert("결제를 취소합니다.");
window.history.go(-2);
}),
);
return;
case "success":
router.push({ pathname: onSuccess, query: { ...router.query, paymentId: paymentKey } });
return;
case "failure":
router.push({ pathname: onFailure, query: { ...router.query, errorCode, errorMessage } });
return;
}
}, []);
return null;
};고객이 결제 페이지에 진입하자마자 "결제를 취소합니다" 문구가 표시된 dialog 를 보게 된다고 합니다.
amount 도 양수이고, order_id 와 order_name의 길이/구성 제한도 지켰고, success_url 과 failure_url 도 정상입니다.
제가 직접 브라우저(Windows, MacOS, iOS, Android), 앱(flutter 웹뷰 iOS/Android) 으로 테스트할 때에도 전혀 문제가 없었습니다.
혹시 브라우저 버젼에 따라,
requestPayment()requestPayment() 메서드 실행 자체에 실패하는 경우도 있나요?