카카오페이 결제준비 요청하면 400 Bad Request 오류 발생합니다

안녕하세요. 스프링 4에서 아래와 같은 코드를 작성하여 실행을 해봤는데
400 Bad Request 오류가 발생합니다.
어떤 부분이 잘못됐는지 잘 모르겠습니다. 확인 부탁드립니다.

public class KakaoPayTestDrive {
    private static final String HOST = "https://kapi.kakao.com";

    public static void main(String[] args) {
    	paymentReady();
    }

    private static HttpHeaders getHeaders() {		
	    HttpHeaders headers = new HttpHeaders();
	    headers.add("Authorization", "KakaoAK " + "695c206ec549d13455fd2e0b582ea69a");
	    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON_UTF8));
	    return headers;
    }

    private static void paymentReady() {
        RestTemplate restTemplate = new RestTemplate();
    
        Map<String, Object> readyReq = new HashMap<String, Object>();
        readyReq.put("cid", "TC0ONETIME");
        readyReq.put("partner_order_id", "1001");
        readyReq.put("partner_user_id", "test@koitt.com");
        readyReq.put("item_name", "갤럭시S9");
        readyReq.put("quantity", "1");
        readyReq.put("total_amount", "1155000");
        readyReq.put("tax_free_amount", "0");
        readyReq.put("approval_url", "http://localhost:8082/approval.do");
        readyReq.put("cancel_url", "http://localhost:8082/cancel.do");
        readyReq.put("fail_url", "http://localhost:8082/fail.do");
            
        HttpEntity<Object> request = new HttpEntity<Object>(readyReq, getHeaders());
        ResponseEntity<Map> response = restTemplate.exchange(HOST + "/v1/payment/ready", HttpMethod.POST, request, Map.class);
        Map readyResp = response.getBody();
        System.out.println(readyResp);
    }
}

@shoony86
response body를 보시면 실패 이유를 알 수 있습니다.
한번 확인해보시겠어요?

Response body 부분을 다시 살펴보고 코드를 아래와 같이 다시 수정하였습니다.

public class KakaoPayTestDrive {
    private static final String HOST = "https://kapi.kakao.com";

    public static void main(String[] args) throws RestClientException, URISyntaxException {
	    paymentReady();
    }

    private static void paymentReady() throws RestClientException, URISyntaxException {

	    RestTemplate restTemplate = new RestTemplate();

	    // 서버로 요청할 Body
	    MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
	    params.add("cid", "TC0ONETIME");
	    params.add("partner_order_id", "1001");
	    params.add("partner_user_id", "test@koitt.com");
	    params.add("item_name", "갤럭시S9");
	    params.add("quantity", "1");
	    params.add("total_amount", "1155000");
	    params.add("tax_free_amount", "0");
	    params.add("approval_url", "http://localhost:8082/approval.do");
	    params.add("cancel_url", "http://localhost:8082/cancel.do");
	    params.add("fail_url", "http://localhost:8082/fail.do");
	
	    // 서버로 요청할 Header
	    HttpHeaders headers = new HttpHeaders();
	    headers.add("Authorization", "KakaoAK " + "695c206ec549d13455fd2e0b582ea69a");
	    headers.add("Accept", MediaType.APPLICATION_JSON_UTF8_VALUE);
	    headers.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");

	    HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(params, headers);
	    String response = restTemplate.postForObject(new URI(HOST + "/v1/payment/ready"), request, String.class);
	    System.out.println(response);
    }
}

수정을 하고 난 뒤에 로그를 확인해 봤더니 아래와 같이 역시나 400 Bad Request 오류가 발생합니다.
어떤게 잘못된건지 알려주세요 ^^

===========================request begin================================================
URI : https://kapi.kakao.com/v1/payment/ready
Method : POST
Headers : {Accept=[application/json;charset=UTF-8], Authorization=[KakaoAK 695c206ec549d13455fd2e0b582ea69a], Content-Type=[application/x-www-form-urlencoded;charset=UTF-8], Content-Length=[318]}
Request body: cid=TC0ONETIME&partner_order_id=1001&partner_user_id=test%40koitt.com&item_name=%EA%B0%A4%EB%9F%AD%EC%8B%9CS9&quantity=1&total_amount=1155000&tax_free_amount=0&approval_url=http%3A%2F%2Flocalhost%3A8082%2Fapproval.do&cancel_url=http%3A%2F%2Flocalhost%3A8082%2Fcancel.do&fail_url=http%3A%2F%2Flocalhost%3A8082%2Ffail.do
==========================request end================================================
Exception in thread “main” org.springframework.web.client.ResourceAccessException: I/O error on POST request for “https://kapi.kakao.com/v1/payment/ready”: Server returned HTTP response code: 400 for URL: https://kapi.kakao.com/v1/payment/ready; nested exception is java.io.IOException: Server returned HTTP response code: 400 for URL: https://kapi.kakao.com/v1/payment/ready
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:636)
at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:406)
at test.KakaoPayTestDrive.paymentReady(KakaoPayTestDrive.java:53)
at test.KakaoPayTestDrive.main(KakaoPayTestDrive.java:23)
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://kapi.kakao.com/v1/payment/ready
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263)
at org.springframework.http.client.SimpleClientHttpResponse.getBody(SimpleClientHttpResponse.java:85)
at org.springframework.http.client.BufferingClientHttpResponseWrapper.getBody(BufferingClientHttpResponseWrapper.java:69)
at test.LoggingRequestInterceptor.traceResponse(LoggingRequestInterceptor.java:33)
at test.LoggingRequestInterceptor.intercept(LoggingRequestInterceptor.java:18)
at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:86)
at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:70)
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:660)
… 4 more

@shoony86

response body 확인해보시고 금액을 좀 낮춰서 요청해주세요.

로그 찍는 코드가 아래와 같은데 response.getBody() 부분에서 예외발생하고 body 내용을 출력을 안하네요 ㅎㅎ
금액을 낮추니까 정상 실행 됩니다. ^^ 감사합니다.

private void traceResponse(ClientHttpResponse response) throws IOException {
StringBuilder inputStringBuilder = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), “UTF-8”));
String line = bufferedReader.readLine();
while (line != null) {
inputStringBuilder.append(line);
inputStringBuilder.append(’\n’);
line = bufferedReader.readLine();
}
System.out.println("============================response begin==========================================");
System.out.println("Status code : " + response.getStatusCode());
System.out.println("Status text : " + response.getStatusText());
System.out.println(“Headers : " + response.getHeaders());
System.out.println(“Response body: " + inputStringBuilder.toString());
System.out.println(”=======================response end=================================================”);
}

1개의 좋아요

ResponseEntity response = new RestTemplate().postForEntity(“https://kapi.kakao.com/v1/payment/ready”, entityMap, ReadyResponse.class);

위 질문자님의 마찬가지로 request를 하지만 response시에 400 Bad Request가 발생하고 있습니다.

response body 확인을 하기도 전에 발생하고 있는데, 원인을 알 수 있을까요~?