카카오 페이 Bad Request 400 에러

###########################################################################

요청 코드

    @PostMapping("/ready")
    fun kakaoPayReady(@RequestBody pay : Pay, request : HttpServletRequest) : ResponseEntity<String>{
        var headers = HttpHeaders()
        var restTemplate = RestTemplate()
        val webUrl : String = "http://localhost:8080/"

        headers.add("Authorization","KakaoAK "+"{개인키라서 가리겠습니다}")
        headers.add("Accept", MediaType.APPLICATION_JSON_VALUE)
        headers.add("Host","kapi.kakao.com")
        headers.add("Content-type", MediaType.APPLICATION_FORM_URLENCODED_VALUE+";charset=utf-8")

        var params: MultiValueMap<String, String> = LinkedMultiValueMap()
        params.add("cid","TC0ONETIME")
        params.add("partner_order_id", "HAK Corp.")
        params.add("partner_user_id", pay.academySchedule?.academy?.name)
        params.add("item_name", pay.academySchedule?.name)
        params.add("quantity", "1")
        params.add("total_amount", pay?.academySchedule?.price.toString())
        params.add("tax_free_amount","0")
        params.add("approval_url", webUrl)
        params.add("cancel_url",webUrl)
        params.add("fail_url",webUrl)

        var body : HttpEntity<MultiValueMap<String,String>> = HttpEntity<MultiValueMap<String,String>>(params,headers)
        println("###############################################")
        println(body.headers.toString())
        println(body.body.toString())
        println("###############################################")
        try {
            :rage:kakaoPayReady = restTemplate.postForObject("https://kapi.kakao.com/v1/payment/ready", body, KakaoPayReady::class.java)
            return ResponseEntity<String>(kakaoPayReady!!.next_redirect_pc_url, HttpStatus.OK)
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return ResponseEntity(HttpStatus.NO_CONTENT)
    }

에러 내용

###############################################
header 
    {Authorization=[KakaoAK b6c1c0d9dcaeedd5745508c7b9d7e133], Accept=[application/json], Host=[kapi.kakao.com], Content-type=[application/x-www-form-urlencoded;charset=utf-8]}

params
    {cid=[TC0ONETIME], partner_order_id=[HAK Corp.], partner_user_id=[string], item_name=[string], quantity=[1], total_amount=[0], tax_free_amount=[0], approval_url=[http://localhost:8080/], cancel_url=[http://localhost:8080/], fail_url=[http://localhost:8080/]}
    ###############################################
    org.springframework.web.client.HttpClientErrorException: 400 Bad Request
    	at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94)
    	at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79)
    	at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
    	at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:766)
    	at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:724)
    	at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:680)
    	at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:435)
    	at com.ssafy.learnacademy.controller.PayController.kakaoPayReady(PayController.kt:54)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
    	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
    	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
    	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
    	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
    	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
    	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
    	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:209)
    	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
    	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
    	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
    	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
    	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468)
    	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    	at java.lang.Thread.run(Thread.java:748)

Rest API로 요청보냄, Kotlin으로 작성된 SpringBoot

이모티콘 넣어놓은 부분에서 오류가납니다
잘못된 요청이 들어왔다는데
값은 다 받아와졌고 header와 params, 요청주소에 문제가 없는거같은데…
무슨이유인지 도무지 모르겠습니다
해결방안이 있을까요…?

1개의 좋아요

해결하였습니다…

카카오 > 플랫폼 > web 부분에 ip:port 를 등록하니 되었습니다

1개의 좋아요

안녕하세요 카카오페이입니다.

해결이 되셨다니 다행입니다.
통신오류가 아닌 경우 결제 거절 사유는 response body에 상세 거절 코드 및 거절 메세지를 통하여 확인하실 수 있습니다.
함께 참고 부탁 드립니다.
image

감사합니다.