릴리
릴리2y ago

INVALID_REQUEST, 필수 파라미터 누락 (400)

https://docs.tosspayments.com/reference/test/v1/payments/confirm/POST 에서 결제 승인을 하는건 잘 되는데 Spring Boot로 백엔드에서 값을 넘길 경우 승인이 되지를 않습니다. 아래는 요청 백엔드 코드입니다
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
httpHeaders.add("Authorization", "Basic " + api_key);

MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("paymentKey", tossPayReadyVO.getPaymentKey());
params.add("amount", String.valueOf(tossPayReadyVO.getAmount()));
params.add("orderId", tossPayReadyVO.getOrderId());

HttpEntity<?> requestData = new HttpEntity<>(params, httpHeaders);

try {
URI uri = URI.create(url);
String res = restTemplate.postForObject(uri, requestData, String.class);
System.out.println(res);
} catch (Exception e) {
e.printStackTrace();
}
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
httpHeaders.add("Authorization", "Basic " + api_key);

MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("paymentKey", tossPayReadyVO.getPaymentKey());
params.add("amount", String.valueOf(tossPayReadyVO.getAmount()));
params.add("orderId", tossPayReadyVO.getOrderId());

HttpEntity<?> requestData = new HttpEntity<>(params, httpHeaders);

try {
URI uri = URI.create(url);
String res = restTemplate.postForObject(uri, requestData, String.class);
System.out.println(res);
} catch (Exception e) {
e.printStackTrace();
}
"결제 승인" 테스트 | 토스페이먼츠 개발자센터
코드 구현이나 환경 설정 없이도 원하는 API를 실행해보세요.
25 Replies
토스페이먼츠 BOT
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) : - 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요. * 주말/공휴일에는 답변이 늦을 수 있어요.
김차장
김차장2y ago
여기의 코드를 참고하시길 바랍니다
릴리
릴리OP2y ago
그럼 Spring Boot에서 지원하는 RestTemplate를 사용할때도 JSONObject로 묶어줘야 하나요?
김차장
김차장2y ago
링크를 잘못드렸네요, 여기입니다. https://github.com/tosspayments/payment-samples
GitHub
GitHub - tosspayments/payment-samples
Contribute to tosspayments/payment-samples development by creating an account on GitHub.
김차장
김차장2y ago
JSON 데이터처리는 정해져있는지는 않고 취향에 맞는걸 선택하셔서 만들어 주시면 됩니다. 안되신다는 부분이... 여러가지 케이스일 수 있는데요 1. 승인요청이 안되었는지, 2. 승인요청은 되었으나 데이터가 잘못들어갔는지, 3. 승인요청이 되었고 데이터도 잘 들어갔으나 응답수신이 안되신건지.. 등을 확인하셔야해요 3.은 확인이 어려우실테니 보내셨던 주문번호를 알려주시면 저희쪽 로그를 보고 알려드릴게요
릴리
릴리OP2y ago
order_1688000902609 입니다 승인요청은 들어갔는데 만료가 되었다고 결제상태가 표시되어있습니다
김차장
김차장2y ago
음...그건 인증 후 10분이 지난후에 승인요청을 하셔서 그렇습니다 인증은 언제 하신 결제데이터일까요?
릴리
릴리OP2y ago
그 전에 승인요청을 보내도 같습니다 지금 다시 승인요청 보내고 주문번호 보내보겠씁니다
김차장
김차장2y ago
넵 잠시만요~~
릴리
릴리OP2y ago
order_1688002864971 입니다
김차장
김차장2y ago
이렇게 보내주고계신데요 JSON 데이터가 이상해요 {"paymentKey":["GvaE2lKMZ7DLJOpm5QrlB7050Q5DWd3PNdxbWnYzqR4gA6Xy"],"amount":["2000"],"orderId":["order_1688000902609"]}
릴리
릴리OP2y ago
어떻게 보내야 하나요? 정상적인 양식을 주실 수 있을까요?
김차장
김차장2y ago
{ "paymentKey": "GvaE2lKMZ7DLJOpm5QrlB7050Q5DWd3PNdxbWnYzqR4gA6Xy", "amount": 2000, "orderId": "order_1688000902609" } 이렇게 보내주셔야 맞습니다. 제가 말씀드린 1,2,3 중에는 2에 해당되는 내용이긴한데 이후에 다른 에러가 중첩되어있는 상태일 수도 있어요
릴리
릴리OP2y ago
RestTemplate로 api 요청을 전송할때 MultiValueMap<String, JSONObject> params = new LinkedMultiValueMap<>(); 에다가 파라미터 값을 넣는데 그래서 자동으로 []가 붙는 것 같아요
김차장
김차장2y ago
최종 통신하시기 전에 데이터를 .toString() 으로 찍어보시면 좋을거같아요
릴리
릴리OP2y ago
저도 이렇게 표시 됩니다. 아래의 경우
{paymentKey=[GvaE2lKMZ7DLJOpm5Qrl71BdXaWRjAVPNdxbWnYzqR4gA6Xy], amount=[2000], orderId=[order_test3223_1688003039442]},[Content-Type:"application/json", Authorization:"Basic {Base64 Key}"]
{paymentKey=[GvaE2lKMZ7DLJOpm5Qrl71BdXaWRjAVPNdxbWnYzqR4gA6Xy], amount=[2000], orderId=[order_test3223_1688003039442]},[Content-Type:"application/json", Authorization:"Basic {Base64 Key}"]
MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
params.set("paymentKey", tossPayReadyVO.getPaymentKey());
params.set("amount", tossPayReadyVO.getAmount());
params.set("orderId", tossPayReadyVO.getOrderId());

HttpEntity<?> requestData = new HttpEntity<>(params, httpHeaders);
MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
params.set("paymentKey", tossPayReadyVO.getPaymentKey());
params.set("amount", tossPayReadyVO.getAmount());
params.set("orderId", tossPayReadyVO.getOrderId());

HttpEntity<?> requestData = new HttpEntity<>(params, httpHeaders);
이렇게 소스를 사용중인데 어떻게 추가를 해야 하나요?
김차장
김차장2y ago
JSON 데이터 생성은 취향대로 하시면 되는부분이라.. 어떤 특정 메소드를 권장드리긴 어렵구요, 샘플코드를 참고하셔서 생성하시면 될거같아요 개인적으로는 이렇게 쓰고 있어요 JSONObject obj = new JSONObject(); obj.put("name1", value1); obj.put("name2", value2); obj.put("name3", value3);
릴리
릴리OP2y ago
그럼 그 데이터를 바디에 담아야 하는데 body 파라미터에 담을때는 어떤 key로 담아야 하나요
김차장
김차장2y ago
JSONObject 에서 객체를 생성하고 담겨있는 상태라서 쏘시기만 하면됩니다. OutputStream outputStream = connection.getOutputStream(); outputStream.write(obj.toString().getBytes("UTF-8"));
릴리
릴리OP2y ago
일단 다시 요청하고 orderId 다시 보내보겠습니다 order_test3223_1688004029901 입니다 시크릿 키 연동정보가 잘못됐다고.. 위의 request는 우선 해결된거 같아요!
김차장
김차장2y ago
오우...메시지가 달라졌네요 {"code":"INVALID_API_KEY","message":"잘못된 시크릿키 연동 정보 입니다."} 넵 이건... 승인요청된 키가 안맞을때 보이는 에러에요
릴리
릴리OP2y ago
API_KEY 다시 수정하니까 해결 됐습니다 감사합니다!
김차장
김차장2y ago
넵 좋은 서비스 만드시길 바랍니다!
릴리
릴리OP2y ago
빠른 답변 감사합니다
토스페이먼츠 BOT
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.

Did you find this page helpful?