trainers
trainers16mo ago

next.js 에서 https://api.tosspayments.com/v1/brandpay/authorizations/customer-token 무한호출

안녕하세요 문제는 제목과 같구요. 저희 시스템 구성은 다음과 같습니다. 1. next.js 주소 : localhost:3000 2. node.js 로 돌아가는 백엔드 주소: localhost:8081 1 에서 결제위젯 호출을 하고 브랜드페이 연동을 하는 과정입니다. 브랜드페이 redirect url 은 1의 주소인 localhost:3000/cart/payment/brandpay-callback-auth 로 설정되어 있으며 여기서 getServerSideProps 를 사용하여 1 의 서버사이드에서 2로 access token 발급 요청을 하고 있습니다. 위 요청에 대한 응답은 따로 주고 있지 않습니다. 정확히는 2 에서 true 를 내려주지만 1에서 별다른 처리를 하지 않습니다. 2에서 확인해보니 access token 은 발급이 잘 되었으나 1에서 이를 인지하지 못하고 계속해서 https://api.tosspayments.com/v1/brandpay/authorizations/customer-token 를 호출하고 그 response 는 다음과 같습니다. {"status":"PENDING","customerToken":null,"expiresIn":null} 요청량이 초과될 때 까지 계속 요청을 보내고 멈춥니다. 도움 부탁드립니다.
12 Replies
토스페이먼츠 BOT
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) : - 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요. * 주말/공휴일에는 답변이 늦을 수 있어요.
이실장
이실장16mo ago
연동하실 때 참고한 문서 공유줘보시겠어요 결제위젯 통해서 브랜드페이 연동하시나요
trainers
trainersOP16mo ago
브랜드페이 연동하기 | 토스페이먼츠 개발자센터
일반 결제와 내 상점만의 자체 간편결제 시스템 브랜드페이를 한 번에 연동하고 싶다면 결제위젯에 브랜드페이를 추가하세요.
trainers
trainersOP16mo ago
네 맞습니다.
이실장
이실장16mo ago
시크릿키 어떤거쓰셧어요?
토스페이먼츠 BOT
💡 정보 제출
아래 버튼을 눌러 외부로 노출되기 민감한 정보를 제출해주세요
trainers
trainersOP16mo ago
방금 수정하면서 발견한 것인데요.
export async function brandpayCallbackAuth(ctx: KoaAppContext) {
if (!ctx.state.loginInfo) {
throw new CustomError(ResCode.AUTH_NEED_LOGIN);
}

const query: RequestBrandpayAccessTokenQuery = ctx.query;

const { no: memberNo } = ctx.state.loginInfo;

// const refreshToken = await orderSvc.getMemberBrandpayRefreshToken(memberNo);
// if (refreshToken) {
// query.grantType = 'RefreshToken';
// query.refreshToken = refreshToken;
// delete query.code;
// }
const result = await orderSvc.requestBrandpayAccessToken(query);

if (result.accessToken) {
const { transaction } = ctx.state;
if (!transaction) {
throw new CustomError(ResCode.REQUEST_TRANSACTION_GET_FAILED);
}
await orderSvc.setBrandpayRefreshToken(memberNo, result.refreshToken, transaction);
await orderSvc.setBrandpayCustomerKey(memberNo, query.customerKey, transaction);
return true;
} else {
throw new CustomError(ResCode.ORDER_PAYMENT_BRANDPAY_AUTH_FAILED);
}
export async function brandpayCallbackAuth(ctx: KoaAppContext) {
if (!ctx.state.loginInfo) {
throw new CustomError(ResCode.AUTH_NEED_LOGIN);
}

const query: RequestBrandpayAccessTokenQuery = ctx.query;

const { no: memberNo } = ctx.state.loginInfo;

// const refreshToken = await orderSvc.getMemberBrandpayRefreshToken(memberNo);
// if (refreshToken) {
// query.grantType = 'RefreshToken';
// query.refreshToken = refreshToken;
// delete query.code;
// }
const result = await orderSvc.requestBrandpayAccessToken(query);

if (result.accessToken) {
const { transaction } = ctx.state;
if (!transaction) {
throw new CustomError(ResCode.REQUEST_TRANSACTION_GET_FAILED);
}
await orderSvc.setBrandpayRefreshToken(memberNo, result.refreshToken, transaction);
await orderSvc.setBrandpayCustomerKey(memberNo, query.customerKey, transaction);
return true;
} else {
throw new CustomError(ResCode.ORDER_PAYMENT_BRANDPAY_AUTH_FAILED);
}
위 코드에서 주석 처리 한 부분을 주석 해제하면 해당 문제가 발생합니다. 즉 refreshToken 을 사용하여 access token 을 발급받는 과정을 추가하면 발생하는 문제네요. 위는 2의 백엔드 코드입니다 시크릿키는 결제위젯 시크릿키가 아닌 자동결제・API 연동 키를 사용하였습니다 정보 제출이 안되네요
이실장
이실장16mo ago
그럼 주석 해제 안하시면 정상 동작하는거죠? 해결되신건가요?
trainers
trainersOP16mo ago
네 맞습니다. 그런데 그러면 refresh token 을 사용해서 access token 발급을 안하고 계속해서 AuthorizationCode 형식으로만 access token 을 발급받는 것인데 문제가 없을지요?
이실장
이실장16mo ago
네 전혀 문제없습니다.
trainers
trainersOP16mo ago
아 그렇군요! 네 감사합니다
토스페이먼츠 BOT
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.

Did you find this page helpful?