박성화
박성화2y ago

페이먼츠 위젯 불러오기 안됨

next.js 로 페이먼츠 위젯을 불러오는 기능을 작동시키려고 하는데 콘솔에 error가 생기면서 위젯이 생성되지 않습니다. 코드는 아래와 같습니다. useEffect(() => { const setToss = async () => { const clientKey = process.env .NEXT_PUBLIC_TOSS_PAYMENTS_CLIENT_KEY as string; const customerKey = myDatabaseId; const paymentWidget = await loadPaymentWidget( clientKey, customerKey, ); // 결제방법 UI const paymentMethodWidget = paymentWidget.renderPaymentMethods( '#payment-widget', { value: finalPrice, currency: 'KRW', country: 'KR' }, ); // 이용약관 동의 UI paymentWidget.renderAgreement('#agreement'); paymentWidgetRef.current = paymentWidget; paymentMethodWidgetRef.current = paymentMethodWidget; console.log('widjet activated'); }; if (myDatabaseId != (null || undefined)) { setToss(); } }, []); 콘솔에서 확인되는 오류 화면도 첨부합니다. 문제가 무엇일까요?
No description
44 Replies
박성화
박성화OP2y ago
{/* 결제 위젯 /} <div id="payment-widget" style={{ width: '100%' }} /> {/ 개인 정보 동의 */} <div id="agreement" style={{ width: '100%' }} /> 화면에는 이렇게 반환하고 있습니다
Ayaan이안
Ayaan이안2y ago
payment-widget이라는 아이디를 가진 일레멘트가 있는지 확인 부탁드립니다 아 있는군요
박성화
박성화OP2y ago
네네ㅠ
Ayaan이안
Ayaan이안2y ago
개발자 도구로 inspect해보셨을까요
박성화
박성화OP2y ago
콘솔 말씀이신가요? 해당 에러에 대한 이미지 첨부했습니다
Ayaan이안
Ayaan이안2y ago
No description
Ayaan이안
Ayaan이안2y ago
일레멘트 탭 확인해 달라는 뜻이었어요 일레멘트 탭에서 해당 div가 존재하는지 확인이 필요해요
박성화
박성화OP2y ago
No description
박성화
박성화OP2y ago
있습니다 화면에는 전혀 보이지 않아요
박성화
박성화OP2y ago
No description
박성화
박성화OP2y ago
아 혹시 위젯에 들어가는 금액이 0원이면 아예 위젯이 생성되지 않는 것인가요?
Ayaan이안
Ayaan이안2y ago
네 그렇습니다만 오류가 다르게 나와야 할거 같은데요. 3000원 같은 금액으로 지금 한번 넣어보시겠어요?
박성화
박성화OP2y ago
네 잠시만요 한 3~5분 정도 후에 이미지 남기겠습니다
박성화
박성화OP2y ago
.
No description
박성화
박성화OP2y ago
payment-widget은 아까와 같이 존재합니다
박성화
박성화OP2y ago
No description
Ayaan이안
Ayaan이안2y ago
사용하시는 npm library 버전이 어떻게 되세요?
박성화
박성화OP2y ago
어떤 라이브러리 말씀이시죠? "dependencies": { "@svgr/webpack": "^5.5.0", "@tosspayments/payment-widget-sdk": "^0.9.0", "@types/react-scroll-sync": "^0.8.3", "@types/styled-components": "^5.1.12", "axios": "^0.21.1", "babel-plugin-styled-components": "^1.13.2", "nanoid": "^3.1.25", "next": "11.1.0", "next-s3-upload": "^0.2.4", "react": "17.0.2", "react-daum-postcode": "^3.1.3", "react-dom": "17.0.2", "react-kakao-login": "^2.1.0", "react-scroll-sync": "^0.9.0", "react-spring": "^9.5.5", "styled-components": "^5.3.0", "swiper": "^9.3.2" }, "devDependencies": { "@types/react": "17.0.19", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", "eslint": "7.32.0", "eslint-config-airbnb": "^18.2.1", "eslint-config-next": "11.1.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-babel": "^5.3.1", "eslint-plugin-import": "^2.23.4", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-react": "^7.24.0", "eslint-plugin-react-hooks": "^4.2.0", "typescript": "^4.9.3" } } 토스 위젯 말씀이시라면 0.9.0 입니다. 해당 코드는 package.json 일부입니다.
티라미슈
티라미슈2y ago
div id 에 # 넣어보세요~
Ayaan이안
Ayaan이안2y ago
아 잠시만요 @박성화 Widget 로드하는 코드에서 #을 지워 보세요 넣는게 아니라 지워야 하는것 같아 보입니다
티라미슈
티라미슈2y ago
금액 0이면 당연히 안되고, body div id 명시한곳에 # 이 누락 되어 있는것 같아요~
Ayaan이안
Ayaan이안2y ago
그건 원래 selector가 id 값이면 #이 붙으므로 무관한 문제입니다만
티라미슈
티라미슈2y ago
아~ 그런가요?
박성화
박성화OP2y ago
일단 샵넣어도 안되긴 합니다
Ayaan이안
Ayaan이안2y ago
renderPaymentMethod와 renderAgreement에서 #을 빼보세요 네 querySelector 함수와 css selector 표준에는 id 는 #, class는 . 으로 prefix 하는것으로 나와있어요
티라미슈
티라미슈2y ago
그렇네요 ㅎㅎ 감사합니다~
박성화
박성화OP2y ago
안됩니다ㅠ
Ayaan이안
Ayaan이안2y ago
혹시 몰라서 #을 빼보라고 가이드를 드린건데 아아 안되시는 군요
박성화
박성화OP2y ago
혹시 위젯 관련 div 엘리먼트가 생성되는게 useEffect 이용 시기보다 더 느려서 그런것일까요?
Ayaan이안
Ayaan이안2y ago
그렇다면, 가능합니다
박성화
박성화OP2y ago
그럼 useEffect의 dependency에 html 엘리먼트를 넣는 방법이 있나요?
Ayaan이안
Ayaan이안2y ago
그건 조금 어렵습니다.
박성화
박성화OP2y ago
그럼 좋은 방법이 있을까요?
Ayaan이안
Ayaan이안2y ago
div 생성 후 위젯 호출 코드를 실행하도록 해보세요
박성화
박성화OP2y ago
네 방법은 고민 좀 해보겠습니다.
Ayaan이안
Ayaan이안2y ago
아니면 이 방법도 있습니다.
Ayaan이안
Ayaan이안2y ago
GitHub
payment-widget-sample/nextjs/src/pages/index.tsx at 20c100d6ccfd22d...
토스페이먼츠 결제위젯 샘플 앱입니다. . Contribute to tosspayments/payment-widget-sample development by creating an account on GitHub.
Ayaan이안
Ayaan이안2y ago
이 파일 참고하셔서 useAsync 사용하도록 수정해 보시면 될거 같습니다
박성화
박성화OP2y ago
해당 ref도 모두 똑같이 설정했습니다. 애당초 샘플 프로젝트 보고 가져온거라서요 지금 dependency를 줄 수 있는 방법을 찾고 있습니다. useAsync는 해당 라이브러리에서 이용한 커스텀 훅인가요? callback ref로 해결했습니다
박성화
박성화OP2y ago
라이브러리 업데이트에 도움이 될까 해서 참고한 링크도 드립니다.
Ayaan이안
Ayaan이안2y ago
import { useAsync } from "react-use"; react-use library의 hook입니다! 공유해 주셔서 감사합니다.
토스페이먼츠 BOT
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.

Did you find this page helpful?