리아
리아2y ago

결제위젯 에러

https://docs.tosspayments.com/guides/payment-widget/integration#1-결제위젯-그리기 이 부분 진행 중인데 아래와 같은 에러가 나면서 결제위젯이 그려지지 않습니다. 원인을 알 수 있을까요? 😉 TypeError: Cannot read properties of undefined (reading 'customerKey')
결제위젯 연동하기 | 토스페이먼츠 개발자센터
토스페이먼츠 결제위젯 연동 가이드입니다. 내 상점의 주문서 페이지에 최적의 주문서 UI를 연동하세요. 결제 연동하기 가장 편리한 로우코드(Low-code) 솔루션입니다.
31 Replies
토스페이먼츠 BOT
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) : - 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요. * 주말/공휴일에는 답변이 늦을 수 있어요.
이실장
이실장2y ago
render하는 부분 소스코드 올려주시겠어요? 저희가보내드린 에러는 아니고 코드상 에러가 발생하는 것 같네요
리아
리아OP2y ago
리액트 코드 그대로 사용해봤다가 안돼서 현재 html 코드로 테스트 해본 상태입니다. 둘 다 같은 에러 발생 했습니다(customerKey) 현재 사용한 코드 입니다! 1. index.html 에 <!-- 결제위젯 SDK 추가 --> <script src="https://js.tosspayments.com/v1/payment-widget"></script> 2. TossPayment.js 파일 생성 export default function TossPayment(props) { const { price, successUrl, failUrl, TOSS_CLIENT_KEY, customerId } = props; useEffect(() => { const script = document.createElement("script"); const scriptText = document.createTextNode( const paymentWidget = PaymentWidget("${TOSS_CLIENT_KEY}", "${customerId}") paymentWidget.renderPaymentMethods( "#payment-method", { value: ${price} }, { variantKey: "DEFAULT" } // 렌더링하고 싶은 결제 UI의 variantKey ) paymentWidget.renderAgreement('#agreement') ); script.appendChild(scriptText); document.body.appendChild(script); }, []); return ( <> <div id="payment-method"></div> <div id="agreement"></div> </> ); } 3. 사용하고자하는 js 파일에 import 후 사용 import TossPayment from "../../Components/Page/TossPayment"; // 자체 서버에서 TOSS_CLIENT_KEY, customerId 등 받아옵니다 const getTossKey = async () => { await API.get("/toss/request-data") .then((res) => { if (res.data.status) { console.log(res.data); setTossValues(res.data.results); setIsLoadedTossData(true); } }) .catch(function (error) {}); }; // 컴포넌트 호출 {isLoadedTossData && ( <TossPayment price={intRechargePoint} TOSS_CLIENT_KEY={tossValues.TOSS_CLIENT_KEY} customerId={tossValues.customerId} /> )}
Ayaan이안
Ayaan이안2y ago
1. index.html 에
<!-- 결제위젯 SDK 추가 -->
<script src="https://js.tosspayments.com/v1/payment-widget"></script>
<!-- 결제위젯 SDK 추가 -->
<script src="https://js.tosspayments.com/v1/payment-widget"></script>
2. TossPayment.js 파일 생성
export default function TossPayment(props) {
const { price, successUrl, failUrl, TOSS_CLIENT_KEY, customerId } = props;

useEffect(() => {
const script = document.createElement("script");
const scriptText = document.createTextNode(
`const paymentWidget = PaymentWidget("${TOSS_CLIENT_KEY}", "${customerId}")
paymentWidget.renderPaymentMethods(
"#payment-method",
{ value: ${price} },
{ variantKey: "DEFAULT" } // 렌더링하고 싶은 결제 UI의 variantKey
)
paymentWidget.renderAgreement('#agreement')
`
);
script.appendChild(scriptText);
document.body.appendChild(script);
}, []);

return (
<>
<div id="payment-method"></div>
<div id="agreement"></div>
</>
);
}
export default function TossPayment(props) {
const { price, successUrl, failUrl, TOSS_CLIENT_KEY, customerId } = props;

useEffect(() => {
const script = document.createElement("script");
const scriptText = document.createTextNode(
`const paymentWidget = PaymentWidget("${TOSS_CLIENT_KEY}", "${customerId}")
paymentWidget.renderPaymentMethods(
"#payment-method",
{ value: ${price} },
{ variantKey: "DEFAULT" } // 렌더링하고 싶은 결제 UI의 variantKey
)
paymentWidget.renderAgreement('#agreement')
`
);
script.appendChild(scriptText);
document.body.appendChild(script);
}, []);

return (
<>
<div id="payment-method"></div>
<div id="agreement"></div>
</>
);
}
3. 사용하고자하는 js 파일에 import 후 사용
import TossPayment from "../../Components/Page/TossPayment";

// 자체 서버에서 TOSS_CLIENT_KEY, customerId 등 받아옵니다
const getTossKey = async () => {
await API.get("/toss/request-data")
.then((res) => {
if (res.data.status) {
console.log(res.data);
setTossValues(res.data.results);
setIsLoadedTossData(true);
}
})
.catch(function (error) {});
};

// 컴포넌트 호출
{isLoadedTossData && (
<TossPayment
price={intRechargePoint}
TOSS_CLIENT_KEY={tossValues.TOSS_CLIENT_KEY}
customerId={tossValues.customerId}
/>
)}
import TossPayment from "../../Components/Page/TossPayment";

// 자체 서버에서 TOSS_CLIENT_KEY, customerId 등 받아옵니다
const getTossKey = async () => {
await API.get("/toss/request-data")
.then((res) => {
if (res.data.status) {
console.log(res.data);
setTossValues(res.data.results);
setIsLoadedTossData(true);
}
})
.catch(function (error) {});
};

// 컴포넌트 호출
{isLoadedTossData && (
<TossPayment
price={intRechargePoint}
TOSS_CLIENT_KEY={tossValues.TOSS_CLIENT_KEY}
customerId={tossValues.customerId}
/>
)}
위에 남겨주신 코드 단순히 코드 블럭으로 감쌌습니다. @adorable_unicorn_02081 npm으로 설치해서 해보시겠어요?
리아
리아OP2y ago
npm 으로 설치해서 진행한 코드도 공유드릴까요 ? 동일한 에러 발생했었습니다
Ayaan이안
Ayaan이안2y ago
네 공유주시면 확인에 도움이 될 것 같습니다.
Kimoon Lee
Kimoon Lee2y ago
혹시 사용하시는 clientkey 도 공유해 주실수 있을까요?
Ayaan이안
Ayaan이안2y ago
@adorable_unicorn_02081
리아
리아OP2y ago
코드 공유 드립니다 1. TossPaymentWidget.tsx 파일 생성 (파일첨부) 2. import 후 사용 import TossPaymentWidget from "../../Components/Page/TossPaymentWidget.tsx"; <TossPaymentWidget price={intRechargePoint} /> --- 사용하는 clientkey는 16자리 정도의 숫자(string)를 사용하다가 임의의 문자조합으로도 테스트해봤는데 동일한 에러 계속 발생했습니다!
리아
리아OP2y ago
콘솔에 찍히는 경고 또는 에러코드도 첨부드립니다 (경고)payment-widget:1 [Deprecation] Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. (경고)2DevTools failed to load source map: Could not load content for https://static.toss.im/tds/43.3.2/css/tds.min.css.map: HTTP error: status code 403, net::ERR_HTTP_RESPONSE_CODE_FAILURE (에러)TypeError: Cannot read properties of undefined (reading 'customerKey') at h (agreement-630e03e38ab0ad39.js:1:987) at ab (framework-eda8b9c7d07b8e2d.js:9:60868) at i (framework-eda8b9c7d07b8e2d.js:9:119408) at oO (framework-eda8b9c7d07b8e2d.js:9:99057) at framework-eda8b9c7d07b8e2d.js:9:98924 at oF (framework-eda8b9c7d07b8e2d.js:9:98931) at ox (framework-eda8b9c7d07b8e2d.js:9:95683) at oS (framework-eda8b9c7d07b8e2d.js:9:94238) at x (framework-eda8b9c7d07b8e2d.js:33:1364) at T (framework-eda8b9c7d07b8e2d.js:33:1894) at Vo.pt.<computed> (index.js:1:44277) at $o (index.js:1:44025) at og (index.js:1:44087)
Kimoon Lee
Kimoon Lee2y ago
렌더 하시는 시점에 tossValues.customerId! 가 어떤 값으로 찍히는지 알수 있을까요?
리아
리아OP2y ago
737501012345678 으로 찍히고 type은 string 입니다!
Kimoon Lee
Kimoon Lee2y ago
제가 NPM 없는 상태(처음에 공유주신 코드) 로 테스트 했을때 문제없이 잘보입니다. App.js
Kimoon Lee
Kimoon Lee2y ago
이렇게 두파일 받아서 해보실수 있을까요?
리아
리아OP2y ago
import Payment from "./components/UI/Payments"; 이 부분에 TossPayment 있는 경로로 대체해서 해보면 되는걸까요?? 계속 동일한 에러가 나오긴해요...ㅠ
Kimoon Lee
Kimoon Lee2y ago
아뇨 아래 payments.js 파일도 전달드렸습니다. 이걸로 경로만 맞춰서 해주세요.
리아
리아OP2y ago
동일한 에러입니다
No description
Kimoon Lee
Kimoon Lee2y ago
혹시 해당 서버를 저희가 접속해 볼수는 없을까요? 잘 뜨는거 아닌가요?
Kimoon Lee
Kimoon Lee2y ago
No description
Kimoon Lee
Kimoon Lee2y ago
결제 버튼은 연동을 안하신것 같긴한데 위젯은 정상적으로 렌더링되는것으로 보입니다.
리아
리아OP2y ago
현재 제 컴퓨터 크롬에서는 첨부 이미지와 같은 상태+에러가 나고 있고 제 컴퓨터 사파리와 다른 팀원 컴퓨터에선 정상적으로 뜨는 것 확인했습니다 브라우저에 문제가.. 있는걸까요...? ㅠㅠ
No description
유부장
유부장2y ago
저도 확인 했는데 문제 없이 위젯 뜨는것으로 보입니다 (아직 결제창 띄우기는 구현 안하신 것으로 보이네요, 결제하기 하면 바로 다른 창으로 넘어가네요)
리아
리아OP2y ago
네 위젯 뜨는것부터 문제가 있어서 그 후에 과정들은 구현하지 않은 상태입니다..
유부장
유부장2y ago
우선 저희 측 에서는 잘 뜨는 것으로 보여서.. 안 뜨는 환경에 뭔가 다른것이 있는지 확인 해보셔야 할것 같습니다.
리아
리아OP2y ago
네... 감도 안 오긴하는데 이런 문제가 있었던 분들은 없었던걸까요..?
유부장
유부장2y ago
특정 환경에서 안뜨는 건 말 그대로 천차만별이라.. 말씀 드리기 쉽지 않네요 해당 브라우저 캐시 초기화, 설치되어 있는 익스텐션 확인 등등을 해보시는 것으로 보통 말씀 드리게 되는것 같습니다.
리아
리아OP2y ago
캐시 초기화는 해봤고.. 익스텐션 한 번 더 확인해보겠습니다 . 답변 감사합니다!
Kimoon Lee
Kimoon Lee2y ago
특정 PC 에서만 안된다면 크롬 익스텐션이 있는지 확인부탁드릴께요.
토스페이먼츠 BOT
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.

Did you find this page helpful?