윤정빈
윤정빈14mo ago

400 Bad Request: INVALID_REQUEST, 필수 파라미터 누락

https://docs.tosspayments.com/reference/test/v1/payments/confirm/POST 위 API를 Spring Boot에서 사용하려 합니다. 요청을 하면 400 Bad Request: "{"code":"INVALID_REQUEST","message":"필수 파라미터가 누락되었습니다."}" 라는 에러가 나옵니다. 필수 파라미터를 모두 보낸 것 같은데 왜 저 에러가 나오는지 궁금합니다. 아래는 Spring Boot 코드와 요청을 보낼때의 JSON 데이터입니다.
RestTemplate rest = new RestTemplate();

HttpHeaders headers = new HttpHeaders();

String testSecretApiKey = tossPaymentConfig.getTestSecretKey() + ":";
String encodedAuth = new String(Base64.getEncoder().encode(testSecretApiKey.getBytes(StandardCharsets.UTF_8)));

headers.setBasicAuth(encodedAuth);
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

JSONObject param = new JSONObject();
param.put("orderId", orderId);
param.put("amount", amount);
param.put("paymentKey", paymentKey);

//System.out.println(new HttpEntity<>(param, headers));
return rest.postForEntity(
PAYMENT_URL + paymentKey,
new HttpEntity<>(param, headers),
TossPaymentSuccessDto.class
).getBody();
RestTemplate rest = new RestTemplate();

HttpHeaders headers = new HttpHeaders();

String testSecretApiKey = tossPaymentConfig.getTestSecretKey() + ":";
String encodedAuth = new String(Base64.getEncoder().encode(testSecretApiKey.getBytes(StandardCharsets.UTF_8)));

headers.setBasicAuth(encodedAuth);
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

JSONObject param = new JSONObject();
param.put("orderId", orderId);
param.put("amount", amount);
param.put("paymentKey", paymentKey);

//System.out.println(new HttpEntity<>(param, headers));
return rest.postForEntity(
PAYMENT_URL + paymentKey,
new HttpEntity<>(param, headers),
TossPaymentSuccessDto.class
).getBody();
<{"amount":3243,"orderId":"qec1d544-2a34-4f44-ada0-c5213d8fd8da","paymentKey":"e75jWNka9lpP2YxJ4K879ml2Knk5ovVRGZwXLObgyB0vMDm1"},[Authorization:"Basic dGVzdF9za19CYTVQelIwQXJubjlkN3dHRDZ2eHJ2bVluTmVEOg==", Content-Type:"application/json", Accept:"application/json"]>
23 Replies
토스페이먼츠 BOT
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) : - 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요. * 주말/공휴일에는 답변이 늦을 수 있어요.
김차장
김차장14mo ago
전송 url 세팅이 이상합니다.
return rest.postForEntity(
PAYMENT_URL + paymentKey,
new HttpEntity<>(param, headers),
TossPaymentSuccessDto.class
).getBody();
return rest.postForEntity(
PAYMENT_URL + paymentKey,
new HttpEntity<>(param, headers),
TossPaymentSuccessDto.class
).getBody();
여기에서 PAYMENT_URL + paymentKey, 를 확인해보세요
김차장
김차장14mo ago
직접 프로그램을 사용하시니까 아래 가이드로 확인하시면 더 쉬우실거에요 https://docs.tosspayments.com/reference#%EA%B2%B0%EC%A0%9C-%EC%8A%B9%EC%9D%B8
토스페이먼츠 BOT
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.
윤정빈
윤정빈OP14mo ago
url 세팅이 어떻게 이상한지 이해되지 않습니다. 보내주신 사이트와 토스페이먼츠 깃허브의 코드를 참고하였습니다. 깃허브 주소 : https://github.com/tosspayments/payment-samples/blob/main/payment-window/springboot/src/main/java/com/tosspayments/demo/payment/PaymentController.java 코드를 조금 수정해서 다시 테스트 하였는데 동일한 에러가 발생합니다. PAYMENT_URL= "https://api.tosspayments.com/v1/payments/" 입니다.
URL url = new URL(PAYMENT_URL + paymentKey);
URI uri = URI.create(String.valueOf(url));

return rest.postForEntity(
uri,
new HttpEntity<>(param, headers),
TossPaymentSuccessDto.class
).getBody();
URL url = new URL(PAYMENT_URL + paymentKey);
URI uri = URI.create(String.valueOf(url));

return rest.postForEntity(
uri,
new HttpEntity<>(param, headers),
TossPaymentSuccessDto.class
).getBody();
GitHub
payment-samples/payment-window/springboot/src/main/java/com/tosspay...
Contribute to tosspayments/payment-samples development by creating an account on GitHub.
유부장
유부장14mo ago
paymentKey 를 json body 내로 전달 하고 있을때는 승인 API 가 삼부장님께서 전달하신 링크에 명시된 승인 API 를 쓰셔야 한다는 의미 입니다. github 은 내부에서 확인하고 업데이트 할게요 docs 링크 보면 아시겠지만, paymentKey 를 쿼리파람으로 받지 않습니다.
유부장
유부장14mo ago
https://github.com/tosspayments/payment-widget-sample/blob/main/jsp/success.jsp 여기 확인 해보셔도 도움이 될듯 하네요
GitHub
payment-widget-sample/jsp/success.jsp at main · tosspayments/paymen...
토스페이먼츠 결제위젯 샘플 앱입니다. . Contribute to tosspayments/payment-widget-sample development by creating an account on GitHub.
윤정빈
윤정빈OP14mo ago
url을 "https://api.tosspayments.com/v1/payments/confirm" 로 사용하고 amount도 String 타입으로 변경하였는데 계속 동일한 에러가나오네요.. 요청하는 방식 자체가 잘못된걸까요?
return rest.postForEntity(
"https://api.tosspayments.com/v1/payments/confirm",
new HttpEntity<>(param, headers),
TossPaymentSuccessDto.class
).getBody();
return rest.postForEntity(
"https://api.tosspayments.com/v1/payments/confirm",
new HttpEntity<>(param, headers),
TossPaymentSuccessDto.class
).getBody();
<{"amount":"3241","orderId":"cec1d544-2a34-4f44-ada0-c5213d8fd8da","paymentKey":"71DG90nOlP24xLea5zVAJdjL5mzaOlrQAMYNwW6BvjZdyEmJ"},[Authorization:"Basic dGVzdF9za19CYTVQelIwQXJubjlkN3dHRDZ2eHJ2bVluTmVEOg==", Content-Type:"application/json", Accept:"application/json"]>
유부장
유부장14mo ago
헤더타입 바꾸는것 추가 작업이 있으셔야 할것 같은데요
유부장
유부장14mo ago
시작이 반
[Spring] RestTemplate (Content-Type에러)
Spring 3.0부터 치원하는 http통신에서 유용하게 쓸 수 있는 템플릿이다. json, xml응답을 모두 받을 수 있다. Open API의 출력 형태가 Json이기 때문에 RestTemplate을 사용하였다. 처음으로 사용한 OpenAPI는 네이버 도서 검색 API였다. 하지만 이 API는 검색기능만 지원하였다. 책 분야별 전체 정보가 필요했다. 네이버 API사용 tmdrl5779.tistory.com/46 [Spring] 네이버 검색 API 사용 책 검색 API를 사용해볼것 RestTemplate를 스프링 빈으로 등록 package com.mkl.book.Configuration; import org.spr...
유부장
유부장14mo ago
이 내용 한번 참조 하셔서 header 타입 설정하는 라인 추가해서 다시 요청 시도 부탁 드려요
윤정빈
윤정빈OP14mo ago
그래도 같은 에러가 나옵니다
유부장
유부장14mo ago
음.. 그럼 설정한 값들을 하나씩 로그 남겨서 확인 해보면 좋을것 같은데 json object 로 설정한 param 에 put 으로 잘 들어갔는지, post 요청 전에 로그 한번 남겨 보시겠어요?
윤정빈
윤정빈OP14mo ago
디버깅으로 봤을때는 json object에 값이 잘 들어가는것을 확인했습니다.
유부장
유부장14mo ago
음...... 그러면 header 쪽으로 전달하는 것도 봐주시겠어요? headers 에 어떻게 설정되어 API 호출 되는지 application/json 이 아니라 test/css 등으로 설정 되어 있지 않은지 =
Kimoon Lee
Kimoon Lee14mo ago
request body 가 이렇게 전달되었습니다. {"empty":false,"mapType":"java.util.HashMap"} 코드를 다시 확인해 주시기 바랍니다.
윤정빈
윤정빈OP14mo ago
일단 param과 header는 모두 잘 들어가는것을 확인했습니다
No description
No description
Kimoon Lee
Kimoon Lee14mo ago
동일하게 이렇게 오고 있습니다. {"empty":false,"mapType":"java.util.HashMap"} rest.postForEntity( "https://api.tosspayments.com/v1/payments/confirm", new HttpEntity<>(param, headers), TossPaymentSuccessDto.class ).getBody(); 이방식으로 정상처리가 안되시는것으로 보입니다.
Kimoon Lee
Kimoon Lee14mo ago
GitHub
payment-widget-sample/jsp/success.jsp at main · tosspayments/paymen...
토스페이먼츠 결제위젯 샘플 앱입니다. . Contribute to tosspayments/payment-widget-sample development by creating an account on GitHub.
Kimoon Lee
Kimoon Lee14mo ago
이부분 참고해서 코드 수정해보세요. 이코드를 참고하셔도 될것 같습니다.
Kimoon Lee
Kimoon Lee14mo ago
No description
윤정빈
윤정빈OP14mo ago
성공했습니다!! 도와주셔서 감사합니다!!
Kimoon Lee
Kimoon Lee14mo ago
네 공유해주셔서 감사합니다.

Did you find this page helpful?