cindy
cindy4mo ago

결제 위젯 연동 시 결제 위젯을 띄우는 컴포넌트와 결제하기 버튼 로직 컴포넌트가 분리되어 있을 경우

기존에는 빌링 결제만 이용하다가 단건결제를 추가하기 위해서 결제 위젯 연동 테스트 중에 있습니다. 기존에 있는 코드에서 추가하다 보니 결제 위젯을 띄우는 컴포넌트와 실제 결제가 이뤄지는 컴포넌트가 분리되게 되었습니다. 그래서 둘의 상위 컴포넌트에서 아래와 같이 paymentWidget 상태를 만들어서 넘겨주고 있습니다. const [paymentWidget, setPaymentWidget] = useState<PaymentWidgetInstance | null>(null); 그런데 결제 수단을 선택하고 결제하기 버튼을 클릭하면 첨부한 사진과 같은 오류들이 뜹니다. 어쩔 때는 결제 수단이 선택되지 않았다는 오류가 뜨고 어쩔 때는 지원하지 않는 결제 수단이라는 오류가 뜹니다... ㅠ 또 가끔은 네이버페이랑 카카오페이만 지원하지 않는 결제 수단이라고 안되고 나머지 수단들은 결제 테스트가 될 때도 있는데 어떻게 수정해야 할까요...? 현재 위젯이 렌더링되는 컴포넌트는 PaymentWidget 컴포넌트이고 결제가 이뤄지는 컴포넌트는 PaymentInfo 컴포넌트입니다. 아래는 PaymentWidget 코드입니다. import { useEffect } from "react"; import { loadPaymentWidget, PaymentWidgetInstance } from "@tosspayments/payment-widget-sdk"; import styled from "styled-components"; interface PaymentWidgetProps { setPaymentWidget: (widget: PaymentWidgetInstance | null) => void; } export default function PaymentWidget({ setPaymentWidget }: PaymentWidgetProps) { const clientKey = ${import.meta.env.VITE_SINGLE_CLIENTKEY}; const price = 500; const customerKey = "customer-unique-key"; useEffect(() => { (async () => { const paymentWidget = await loadPaymentWidget(clientKey, customerKey); paymentWidget.renderPaymentMethods("#payment-widget", price); setPaymentWidget(paymentWidget); })(); }, [setPaymentWidget]); return ( <PaymentWidgetContainer> <PaymentWidgetBox id="payment-widget" /> </PaymentWidgetContainer> ); } const PaymentWidgetContainer = styled.div width: 100%; ; const PaymentWidgetBox = styled.div width: 100%; ; 그리고 PaymentInfo에서 결제가 이뤄지는 코드는 다음과 같습니다. <PaymentButton $isAgree={isAgree} disabled={!isAgree} type="button" onClick={() => handlePayment(id)}>결제하기</PaymentButton> async function handlePayment(id: number) { if (id === 4) { // 단건 결제 요청 (paymentWidget 사용) if (!paymentWidget) return; try { await paymentWidget.requestPayment({ orderId: "FWZbnh9VMiNXnK9zBqn4f", orderName: "토스 티셔츠 외 2건", customerName: "김토스", customerEmail: "customer123@gmail.com", customerMobilePhone: "01012341234", successUrl: ${window.location.origin}/success, failUrl: ${window.location.origin}/fail, }); } catch (error) { console.error("Error requesting payment:", error); } } else { // 다른 결제 방식 처리 (단건 결제 외 로직) postMembership( { productId: selectedPlan, couponMemberId: activeCouponId, }, { onSuccess: () => { if (activeCouponId) { sessionStorage.removeItem("couponTxt"); sessionStorage.removeItem("dcInfo"); } }, }, ); } }
No description
No description
6 Replies
토스페이먼츠 BOT
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) : - 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요. * 주말/공휴일에는 답변이 늦을 수 있어요.
Minsu Kim
Minsu Kim4mo ago
논외이지만, 빌링 이용하고 계셨으면 결제위젯 대신 결제창으로 연동 하셔도 괜찮으실 것 같은데요. 함수 한개 차이로 동일한 로직에서 이용이 가능합니다.
유부장
유부장4mo ago
지원하지 않는 결제 수단은 테스트 환경 설정 싱크를 해드리면 될것 같고 결제 수단이 선택되지 않았다는 케이스는 명확하게 어떤 상황에서 발생하시는지 이해되어야 답변 드릴 수 있을것 같습니다. 우선 테스트 키를 알려주세요. 설정싱크 해드리겠습니다.
cindy
cindyOP4mo ago
테스트 키입니다! test_gck_pP2YxJ4K87RzqvN0J4qJrRGZwXLO
유부장
유부장4mo ago
결제위젯 - nonsoo4q4f 으로 설정 되어 있는것 같고 nonsoo4q4f 테스트 환경 설정 싱크 해드렸어요 5분뒤에 확인해주세요. 지원하지 않는 결제 수단 에러는 해결 되실거에요
토스페이먼츠 BOT
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.

Did you find this page helpful?