우기부기
우기부기13mo ago

브랜드페이 인증 관련

현재 브랜드페이 SDK 및 API를 이용하여 개발 중인데, 계속 authorization 오류가 발생합니다. 브랜드페이 sdk 메서드에서는 redirect URL을 통해 authorization code를 발급받는 로직이 아닌가요? 꼭 브랜드페이 API를 통해서만 구현해야 하나요?
37 Replies
토스페이먼츠 BOT
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) : - 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요. * 주말/공휴일에는 답변이 늦을 수 있어요.
이실장
이실장13mo ago
어떤 오류가 발생하나요
우기부기
우기부기OP13mo ago
addPaymentMethod 메서드를 호출했을 때 콘솔에 아래 로그가 찍힙니다. "https://api.tosspayments.com/v1/brandpay/authorizations 400 (Bad Request)" "Uncaught (in promise) KnownError: customerToken이 존재하지 않습니다. at checkAgreement" 리다이렉트 url 등록하지 않아서 생긴 이슈라 다시 리다이렉트 url을 등록했어요. 그리고 requestPayment 메서드 호출했더니 아래 오류가 발생합니다. GET https://api.tosspayments.com/v1/brandpay/authorizations/customer-token?customerKey=-1OKZxxJ9PrzlokCfIvYA13 429 (Too Many Requests)
today.lastday
today.lastday13mo ago
redirectUrl로 이동하면 해당 페이지에서 accessToken을 발급받는 API를 호출하도록 구현해야 합니다. 이 과정을 추가하셨나요? https://docs.tosspayments.com/guides/payment-widget/integration-brandpay#3-access-token-%EB%B0%9C%EA%B8%89%ED%95%98%EA%B8%B0
브랜드페이 연동하기 | 토스페이먼츠 개발자센터
일반 결제와 내 상점만의 자체 간편결제 시스템 브랜드페이를 한 번에 연동하고 싶다면 결제위젯에 브랜드페이를 추가하세요.
우기부기
우기부기OP13mo ago
네 했는데도 동일한 현상이 지속되네요..
이실장
이실장13mo ago
사용한clinetKey및 secretKey제출해주세요
토스페이먼츠 BOT
💡 정보 제출
민감 정보를 안전하게 제출해주세요
이실장
이실장13mo ago
위에 누르고 제출하세요
우기부기
우기부기OP13mo ago
전달드렸습니다.
이실장
이실장13mo ago
시크릿키를 제출해주세요
우기부기
우기부기OP13mo ago
시크릿키 제출했습니다.
이실장
이실장13mo ago
현재 사용하시는 js sciprt src도 한번 공유해주시겠어요? 현 채널에 올려주셔도됩ㄴ디ㅏ
우기부기
우기부기OP13mo ago
const clientKey = 'test_ck_LkKEypNArW9yZ662b6eL3lmeaxYG'; // 테스트용 클라이언트 키 const customerKey = '-1OKZxxJ9PrzlokCfIvYA131243'; // 내 상점에서 고객을 구분하기 위해 발급한 고객의 고유 ID export default function Test() { let brandpay: any; useEffect(() => { async function loadTossBrandPay() { brandpay = await loadBrandPay(clientKey, customerKey, { redirectUrl: 'http://localhost:3000/form/reservation-temp/success', ui: { highlightColor: '#26C2E3', buttonStyle: 'full', labels: { oneTouchPay: '내 상점 원터치결제', }, }, windowTarget: 'iframe', }); } loadTossBrandPay(); }, []); return ( <button onClick={() => { brandpay .requestPayment({ amount: 15000, orderId: 'iq60pCMyM93TzXpCVhgK-', orderName: '토스 티셔츠 외 2건', customerName: '박토스', customerEmail: 'customer@example.com', }) .then(function (data) { // 결제 요청 성공 처리 }) .catch(function (error) { console.error(error); }); }} > button </button> ); } 이게 메인 페이지이고 아래는 리다이렉트 페이지에요 const ReservationFormSuccessPage = () => { const router = useRouter(); const [isDropDownOpen, setIsDropDownOpen] = useState(false); const [reservationId, setReservationId] = useState(''); const [reservationDate, setReservationDate] = useState(''); useEffect(() => { async function getAccessToken() { try { const response = await axios.get(http://localhost:3000/api/payment/authorization?code=${router.query.code}&customerKey=${router.query.customerKey}); console.log(response.data); } catch (error) { console.error(error); } } if (router.isReady) { console.log(router.query); if (router.query.code && router.query.customerKey) { getAccessToken(); } } }, [router.isReady, router.query]); ...
이실장
이실장13mo ago
우기부기
우기부기OP13mo ago
콘솔로 찍었을 때 안나온걸로 봐선 호출이 안된 것 같아요. 브랜드페이 admin에서 리다이렉트 URL 등록 했는데도요.
이실장
이실장13mo ago
콘솔말고 network tab을 한번 살표보시기 바랍니다.
이실장
이실장13mo ago
거기서 http://localhost:3000/api/payment/authorization 여기는 호출하나요?
이실장
이실장13mo ago
거기서 토큰 발급하시는거 아닌가요?
우기부기
우기부기OP13mo ago
네 맞아요 근데 그 내부의 콘솔 로그가 안찍혀서요
이실장
이실장13mo ago
네 그럼 그부분 확인해보시기 바랍니다.
우기부기
우기부기OP13mo ago
네 한번 확인해볼게요!
토스페이먼츠 BOT
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.
우기부기
우기부기OP13mo ago
안녕하세요. 이게 내부 API 요청 문제가 아닌 것 같아요. 가장 단순한 코드로 테스트하는데 요청을 중복해서 계속 보내고 있네요
이실장
이실장13mo ago
그건 accessToken이 발급이 안되면 발급될떄까지 저희가 redirectUrl호출합니다.
우기부기
우기부기OP13mo ago
그런 로직이 있군요. import { useRouter } from 'next/router'; import { useEffect } from 'react'; const SuccessPage = () => { const router = useRouter(); useEffect(() => { console.log('Query parameters:', router.query); }, [router.query]); return ( <div> <h1>Reservation Success</h1> <p>Your reservation has been successfully processed.</p> <div> <h2>Query Parameters:</h2> {Object.entries(router.query).map(([key, value]) => ( <p key={key}>{${key}: ${value}}</p> ))} </div> </div> ); }; export default SuccessPage; 이게 redirect 되는 페이지 코드인ㄷ 여기서 쿼리 파라미터도 출력이 안되고 있어요
이실장
이실장13mo ago
저희가 코드를 봐드리지 않습니다. redirect페이지 자체에서 token을 발급해보세요
우기부기
우기부기OP13mo ago
네 잠시만요 리다이렉트 URL로 아예 안넘어가는 것 같은데 혹시 리다이렉트 URL을 등록하는 방법이 개발자센터 대시보드에서 등록하는 방법 말고 또 있나요? url을 여러개 등록했는데 등록한 url이 순차적으로 워킹해야 된다던지 localhost로 등록하면 안된다던지 하는 규칙이 있나요? 혹시 전화로 기술 관련 문의도 가능한가요?
Ayaan이안
Ayaan이안13mo ago
1544-7772(고객센터 대표번호) -> 2(기존가맹점 문의) -> 5(기술지원팀)로 연락주시면 전화로도 문의가 가능하기는 합니다만, 현재 문의가 급증하여 연결이 지연될 수 있습니다.
토스페이먼츠 BOT
토스페이먼츠 결제연동팀
빠르고 정확한 결제연동 경험을 위해, 디스코드에서는 기술 문의만 받고 있습니다. 계약 및 운영 관련 문의는 1544-7772나 홈페이지 상담을 이용해주세요. 감사합니다.
이실장
이실장13mo ago
export default function Test() { let brandpay: any; useEffect(() => { async function loadTossBrandPay() { brandpay = await loadBrandPay(clientKey, customerKey, { redirectUrl: 'http://localhost:3000/form/reservation-temp/success', ui: { 여기 등록하신 url로 리다이렉트 합니다.
우기부기
우기부기OP13mo ago
http://localhost:3000/form/reservation-temp/success 로 정상적으로 리다이렉션 되고 있다는 말씀이시죠?
유부장
유부장13mo ago
브랜드페이 연동에 대해, 어떻게 이해하고 있는지 중간 정리 하는게 좋을것 같아요. 1) 프론트에서 브랜드페이 jsSDK 호출이 발생한다. 2) redirectUrl 로 code, customerKey 가 포함되어 get 방식으로 데이터를 전달 한다. 3) redirectUrl 에서, 전달된 code, customerKey 를 추출해서, access token 발급 API 를 호출 한다. 이 순서 입니다. redirectUrl 로 get 방식으로 데이터가 전달 될때, 이를 추출해서 access token 호출하는 것이 정상적으로 구현되어 있는지를 봐주시면 됩니다. redirectUrl 로 고객이 "리다이렉트" 되는게 아닙니다. 결제가 성공하고 고객이 이동하는 도착지는, requestPayment 에 있는 successUrl 입니다. 혹시나 잘못 이해하고 있으신게 아닌가 해서 설명 드립니다.
우기부기
우기부기OP13mo ago
redirectUrl 이 페이지가 아니라 GET API endpoint가 되어야 하나요? API로 endpoint로 연동하니까 되네요
유부장
유부장13mo ago
브랜드페이 노드 샘플입니다. https://github.com/tosspayments/brandpay-sample/tree/main/quickstart/node view - checkout 에서 redirectUrl 설정보면 redirectUrl: 'http://localhost:3000/callback-auth' 이렇게 되어 있지요? https://github.com/tosspayments/brandpay-sample/blob/main/quickstart/node/index.js 여기에서 callback-auth get 방식 처리 보면 쿼리 파람으로 전달된 데이터 추출해서 토큰 발행 수행하고 있습니다. node 샘플 이해하실 수 있으실것 같아서 전달 드려 봅니다
우기부기
우기부기OP13mo ago
아 넵 확인 감사합니다!

Did you find this page helpful?