ddd
ddd17mo ago

{"code":"UNAUTHORIZED_KEY","message":"인증되지 않은 시크릿 키 혹은 클라이언트 키 입니다.","data":null}

결제승인시 에러입니다 주문번호 ewrqrewqer 입니다.
62 Replies
토스페이먼츠 BOT
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) : - 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요. * 주말/공휴일에는 답변이 늦을 수 있어요.
today.lastday
today.lastday17mo ago
승인 API 호출시 잘못된 시크릿키를 이용하여 호출하였습니다. 클라이언트키와 시크릿키를 다시 확인 부탁드려요.
ddd
dddOP17mo ago
확인했는데 일치합니다
today.lastday
today.lastday17mo ago
어떤 코드를 보고 하셨을까요? 현재 요청 들어온 키로는 매칭이 안되는 키를 사용하셨습니다.
ddd
dddOP17mo ago
application.yml에 test시크릿키 입력 하였고 String encodedAuthKey = new String( Base64.getEncoder().encode((tossPaymentConfig.getTestSecretApiKey() + ":").getBytes(StandardCharsets.UTF_8))); headers.setBasicAuth(encodedAuthKey); 이렇게 header에 추가하였습니다.
Kimoon Lee
Kimoon Lee17mo ago
개발자 센터에서 사용하신 테스트 ck와 sk 가 한페이지에 표시 되는지 확인 부탁드립니다.
ddd
dddOP17mo ago
네 표시됩니다
Kimoon Lee
Kimoon Lee17mo ago
지금 해당 주문은 sk 를 "test_sk_0RnYX2w532B" 이렇게 시작하는것으로 보내주셨습니다. 맞는지 확인부탁드립니다.
ddd
dddOP17mo ago
네 시크릿키가 저렇게 시작됩니다
Kimoon Lee
Kimoon Lee17mo ago
네 그럼 잘못 보내주신겁니다. 결제창을 여실때 사용하신 키가 "test_ck_YZ1aOw" 이렇게 보내셨는데요. 이 것과 대응되는 키는 "test_sk_5GePWv" 이렇게 시작하는 키입니다. ck와 sk 를 맞춰서 쓰신건지 코드 확인부탁드릴께요.
ddd
dddOP17mo ago
저가 혼자하는거라 누가 만들어놓은 결제창 html 사용해서 하는데 거기에 const clientKey가 "test_ck_YZ1aOw"되있었습니다 그런데 다시 저 ck로 바꾸고 결제 요청해도 아직 똑같이 에러가 나옵니다 이번 주문번호는 aasszxczxc입니다
Kimoon Lee
Kimoon Lee17mo ago
어떤 ck 로바꾸신건가요?
ddd
dddOP17mo ago
아까 개발자용 테스트상점-api키-테스트 클라이언트키로 바꾸었습니다.
Kimoon Lee
Kimoon Lee17mo ago
승인 API 쪽 키를 수정하셨나요? 승인 API 가 정상적으로 안들어오는 것 같은데요. 키 뒤에 ":" 를 추가한뒤에 base64 인코딩을 하신것인지 확인 부탁드립니다.
ddd
dddOP17mo ago
일단 인코딩은 String encodedAuthKey = new String( Base64.getEncoder().encode((tossPaymentConfig.getTestSecretApiKey() + ":").getBytes(StandardCharsets.UTF_8)));이렇게 했습니다. tossPaymentConfig.getTestSecretApiKey() 로그도 실제 테스트 시크릿 키와 같게 나옵니다
Kimoon Lee
Kimoon Lee17mo ago
변경하신 테스트 sk 값을 찍어서 공유해주실수 있을까요?
ddd
dddOP17mo ago
변경하였다는게 인코딩한걸 말씀하시는건가요?
Kimoon Lee
Kimoon Lee17mo ago
네 맞습니다.
토스페이먼츠 BOT
💡 정보 제출
아래 버튼을 눌러 외부로 노출되기 민감한 정보를 제출해주세요
Kimoon Lee
Kimoon Lee17mo ago
여기에 넣어 주세요.
토스페이먼츠 BOT
pjm127
정상적으로 제출되었습니다.
Kimoon Lee
Kimoon Lee17mo ago
그런데 "UNAUTHORIZED_KEY" 이에러가 나시는 건가요? 저희 로그상으로는 "ALREADY_PROCESSED_PAYMENT" 가 나는것으로 보이는데요. 그전에는 "INVALID_REQUEST" 가 났구요.
토스페이먼츠 BOT
🫖 에러메세지를 찾아주세요 🧚
* code : INVALID_REQUEST * message : 잘못된 요청입니다. 🧞 발생가능한 에러를 모두 알려드려요~ 🔮 신용카드
- 예상문제 : 주민번호 또는 사업자번호가 숫자가 아닙니다.
- 해결방안 : 주민번호/사업자 번호에 숫자가 아닌 문자가 있습니다. 다시한번 확인해 주시기 바랍니다.
- 예상문제 : 주민번호 또는 사업자번호가 숫자가 아닙니다.
- 해결방안 : 주민번호/사업자 번호에 숫자가 아닌 문자가 있습니다. 다시한번 확인해 주시기 바랍니다.
🔮 신용카드
- 예상문제 : 주민번호/법인번호 자리수 오류입니다.
- 해결방안 : 주민번호또는 사업자 번호의 자리수가 올바르지 않습니다 주민번호 13자리, 사업자 번호 10자리 숫자입니다.
- 예상문제 : 주민번호/법인번호 자리수 오류입니다.
- 해결방안 : 주민번호또는 사업자 번호의 자리수가 올바르지 않습니다 주민번호 13자리, 사업자 번호 10자리 숫자입니다.
🔮 신용카드
- 예상문제 : 잘못된 결제요청입니다. 다시 시도해 주시기 바랍니다.
- 해결방안 : 결제 요청시 오류가 발생했습니다. 잠시후 다시 시도해 주시기 바랍니다.
- 예상문제 : 잘못된 결제요청입니다. 다시 시도해 주시기 바랍니다.
- 해결방안 : 결제 요청시 오류가 발생했습니다. 잠시후 다시 시도해 주시기 바랍니다.
🔮 신용카드
- 예상문제 : Z2:Not Exist Error MsgCode
- 해결방안 : 원인을 알수 없는 오류입니다. 카드사로 문의해 주시기 바랍니다.
- 예상문제 : Z2:Not Exist Error MsgCode
- 해결방안 : 원인을 알수 없는 오류입니다. 카드사로 문의해 주시기 바랍니다.
🔮 신용카드
- 예상문제 : 금액 필드가 잘못되었습니다.
- 해결방안 : 결제 금액을 잘못 입력하셨습니다. 다시 한번 확인해 주시기 바랍니다.
- 예상문제 : 금액 필드가 잘못되었습니다.
- 해결방안 : 결제 금액을 잘못 입력하셨습니다. 다시 한번 확인해 주시기 바랍니다.
예상문제는 상점관리자에서 주문번호 별로도 확인가능해요!
Kimoon Lee
Kimoon Lee17mo ago
새로 결제를 생성헤서 승인을 보내주신후에 주문번호를 알려주세요.
ddd
dddOP17mo ago
wetrrewqrqew 입니다
Kimoon Lee
Kimoon Lee17mo ago
정상결제 되신거 아닌가요?
ddd
dddOP17mo ago
지금 해보니까 홈페이지 api 테스트에서 200 나왔습니다 requestPaymentAccept error : 400 Bad Request: "{"code":"INVALID_REQUEST","message":"필수 파라미터가 누락되었습니다."}" 이게 나왔는데 params : {"amount":10,"orderId":"wetrrewqrqew","paymentKey":"a90ZoyegEOALnQvDd2VJYM1pLMeKpb3Mj7X41mNW5kzKbwG6"} 에는 내용이 다 담겨져있습니다
Kimoon Lee
Kimoon Lee17mo ago
최소 결제금액이 100원입니다 100원 이상으로 테스트를 해주세요. 잠시만요 equestPaymentAccept error : 400 Bad Request: "{"code":"INVALID_REQUEST","message":"필수 파라미터가 누락되었습니다."}" 17시 43분33초에 드린응답입니다. 이 응답은 body를 {"empty":false} 이렇게 보내주셨어요. 뭔가 /v1/payments/confirm을 여러번 호출하시는 것 같습니다. 이부분도 확인해 보세요.
ddd
dddOP17mo ago
네 일단 다시 해보겠습니다. 파라미터가 누락되었다는데 결제승인에 파라미터는 3개 {"amount":10,"orderId":"wetrrewqrqew","paymentKey":"a90ZoyegEOALnQvDd2VJYM1pLMeKpb3Mj7X41mNW5kzKbwG6"} 이렇게 맞지않나요?
Ayaan이안
Ayaan이안17mo ago
{"empty":false} 라고 보내주고 계십니다. amount, orderId, paymentKey 셋다 안보내주셔서 응답된 에러에요
ddd
dddOP17mo ago
혹시 자바 코드 확인해주실수 있나요 로그까지는 내용이 나오는데 왜 empty가 나가는지 모르겠습니다
Ayaan이안
Ayaan이안17mo ago
아뇨 저희가 자바 코드를 확인할 방법은 없습니다. 냥과장님이 아까부터 요청하신 주문건에 대해서 로그에 찍혀있는 body값을 열람하고 알려주신건데 { empty: false } 라는 바디가 들어오는 경우에 INVALID_REQUEST가 나가고 있는거로 보입니다. 냥과장님 말씀처럼 /v1/payments/confirm을 여러번 호출하고 계신 걸 수 있으니 코드 로직을 다시한번 확인해 보시는걸 추천드립니다.
ddd
dddOP17mo ago
저가 말한거는 제가 쓴 코드 말씀드리는건데 여기 올려서 하는건 좀 그렇나요?
Ayaan이안
Ayaan이안17mo ago
아 ~ 작성하신 코드이시군요 공유주신다면 확인을 해드릴 순 있습니다..
ddd
dddOP17mo ago
@Transactional public PaymentSuccessDto requestPaymentAccept(String paymentKey, String orderId, Long amount) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = getHeaders(); JSONObject params = new JSONObject(); params.put("paymentKey", paymentKey); params.put("orderId", orderId); params.put("amount", amount); PaymentSuccessDto result = null; String u = TossPaymentConfig.URL + "confirm"; //"https://api.tosspayments.com/v1/payments/confirm" HttpEntity<JSONObject> jsonObjectHttpEntity = new HttpEntity<>(params, headers); log.info("jsonObjectHttpEntity : {}", jsonObjectHttpEntity); result = restTemplate.postForObject(u, new HttpEntity<>(params, headers), PaymentSuccessDto.class); return result; } 입니다
Ayaan이안
Ayaan이안17mo ago
log.info("jsonObjectHttpEntity : {}", jsonObjectHttpEntity); 여기까지는 바디가 잘 나온거죠?
ddd
dddOP17mo ago
jsonObjectHttpEntity : <{"amount":10,"orderId":"wetrrewqrqew","paymentKey":"a90ZoyegEOALnQvDd2VJYM1pLMeKpb3Mj7X41mNW5kzKbwG6"},[Authorization:"Basic dGVzdF9za18wUm5ZWDJ3NTMyQnlST3pxMFpLM05leXFBcFFFOg==", Content-Type:"application/json", Idempotency-Key:"0ce70d3e-0b5b-4a3a-85d1-32eb537e7add", Accept:"application/json"]> 이렇게 나옵니다
Ayaan이안
Ayaan이안17mo ago
이거 말고 payments/confirm을 호출하는 곳이 또 있지는 않으신가요 ?
ddd
dddOP17mo ago
아니요 없습니다
Ayaan이안
Ayaan이안17mo ago
다시 한번 확인해 주시겠어요?
ddd
dddOP17mo ago
저가 결제 승인부터 시작한거라 추가적으로 서비스 코드를 작성한게 없습니다..
Ayaan이안
Ayaan이안17mo ago
기존에 확인된 내용을 인용했을 때 ALREADY_PROCESSED_PAYMENT가 나기도 하고, 200으로 잘 떨어지기도 하고 { empty: false } 가 들어오기도 해서 특정 조건에서 중복으로 req가 나가거나 empty false가 들어가는거 같아서요.
Kimoon Lee
Kimoon Lee17mo ago
이렇게 3번 요청이 들어오고 있어요.
Kimoon Lee
Kimoon Lee17mo ago
No description
Kimoon Lee
Kimoon Lee17mo ago
JSON 이 아니라 [] 로 싸서 보내시는 케이스가 있습니다.
ddd
dddOP17mo ago
이건 파라미터가 잘못됬다해서 다시 코드 고치고 요청한거입니다 지금은 다시 [] 없는걸로 하고있습니다 죄송한데 혹시 주문 한번만 새로 만들고 요청보내봐도 될까요 저가 result = restTemplate.postForObject(u, new HttpEntity<>(params, headers), PaymentSuccessDto.class); restTemplate 요청하는게 하나밖에없어서 여러번 호출된다는게 이해가 안가는데...
Ayaan이안
Ayaan이안17mo ago
네 그렇게 해주세요 그리고 주문 번호 공유부탁드립니다
ddd
dddOP17mo ago
wwwwwwwwwweeeeeee 입니다
Ayaan이안
Ayaan이안17mo ago
똑같이 오류가 나오고 계신상황이신가요?
Kimoon Lee
Kimoon Lee17mo ago
이번엔 body가 전부 {"empty":false} 이렇게 들어오고 있습니다 전체적으로 승인 API 호출하는 부분에 대해 코드 검토를 해주셔야 할것 같습니다.
ddd
dddOP17mo ago
HttpEntity<JSONObject> jsonObjectHttpEntity = new HttpEntity<>(params, headers); log.info("jsonObjectHttpEntity : {}", jsonObjectHttpEntity); PaymentSuccessDto paymentSuccessDto = restTemplate.postForObject(u, jsonObjectHttpEntity , PaymentSuccessDto.class); return paymentSuccessDto; 인데 로그까지는 파라미터랑 헤더 내용 다 나오는거면 new HttpEntity<>(params, headers)이게 잘못된건가요? 그 뒤로는 그냥 return밖에 없습니다..
Kimoon Lee
Kimoon Lee17mo ago
헤더는 정상적으로 들어오는데, body가 {"empty":false} 이렇게 들어옵니다. 그리고 v1/payments/{paymentkey} 로 요청주실때도 있고, /v1/payments/confirm 으로 요청하실때도 있습니다. 뭔가 놓치는 코드나 다른곳에서 도는 코드가 있어 보입니다.
ddd
dddOP17mo ago
v1/payments/{paymentkey} 는 혹시나해서 바꾼거라 지금은 다시 confirm으로 하였습니다
Kimoon Lee
Kimoon Lee17mo ago
No description
Kimoon Lee
Kimoon Lee17mo ago
헤더나 endpoint 는 문제가 없고, body 가 안들어오는게 문제입니다.
Ayaan이안
Ayaan이안17mo ago
요런식으로 찍히고 계신가요?
Kimoon Lee
Kimoon Lee17mo ago
그리고 멱등키는 우선 빼고 보내주세요.
ddd
dddOP17mo ago
네 로그까지는 잘 찍히는데 new HttpEntity<>(params, headers);에 넣을때 헤더값은 들어가는데 바디값이 안들어갑니다
Kimoon Lee
Kimoon Lee17mo ago
지금은 여러번 요청되는 것 같아 보이진 않습니다. 약4~5분 차이로 오는것으로 봐서 그냥 요청 주시는것 같아요.
ddd
dddOP17mo ago
네 요청자체는 저가 자동으로 연결한게아니라 수동으로 보내는거라 그건 문제가 아닌거같습니다 저 성공했습니다.. HttpEntity<String> jsonObjectHttpEntity = new HttpEntity<>(params.toString(), headers); 엔티티 넘겨줄떄 body에 toString을 해서 String으로 넘겨주니까 성공하였습니다 늦은시간까지 도와주셔서 감사합니다. 오늘 잠 못자는줄알았는데..
Kimoon Lee
Kimoon Lee17mo ago
네 다행이네요. 공유해주셔서 감사합니다.
토스페이먼츠 BOT
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.

Did you find this page helpful?