logo

포럼

Error parsing HTTP request header에러

“getNext_redirect_pc_url()” 을 통해서 qr코드를 스캔하면 하단의 approval_url로 redirect되고, 이때 mapping을 해둔 /payment/success경로의 afterPayRequest()라는 함수가 실행되게 코드를 작성했습니다.
하지만 log.info(“결제 승인요청 중 …”);라인이 실행되지 않고, 아래에 표시한 것과 같이 "Error parsing HTTP request header"라는 에러가 발생합니다.
카카오페이 api는 보안이슈로 인해 http는 사용하지 못한다고 알고 있는데 그렇다면 어떤식으로 해결하면 좋을지 방법이나 방향성을 알고 싶습니다.

    public String kakaoPayReady() { //결제 준비
        // Server Request Body : 서버 요청 본문
        Map<String, String> params = new HashMap<>();

        params.put("cid", cid); // 가맹점 코드 - 테스트용
        params.put("partner_order_id", "1001"); // 주문 번호
        params.put("partner_user_id", "goguma"); // 회원 아이디
        params.put("item_name", "감자"); // 상품 명
        params.put("quantity", "10"); // 상품 수량
        params.put("total_amount", "10000"); // 상품 총액
        params.put("tax_free_amount", "200"); // 상품 비과세 금액
        params.put("approval_url", "https://localhost:8080/payment/success");
        params.put("cancel_url", "https://developers.kakao.com/cancel");
        params.put("fail_url", "https://developers.kakao.com/fail");
        log.info("parameter value : " + params);

        // 헤더와 바디 붙이기
        HttpEntity<Map<String, String>> body = new HttpEntity<Map<String, String>>(params, this.getHeaders());
        // URL 생성 및 전송
        RestTemplate restTemplate = new RestTemplate();
        try {
            log.info("try 진입");
            kakaoPayReady = restTemplate.postForObject(new URI(host + "/online/v1/payment/ready"), body, KakaoReadyResponse.class);
            String url = kakaoPayReady.getNext_redirect_pc_url();
            return url;

        } catch (RestClientException e) {
            log.info("RestClientException : " + e);
        } catch (URISyntaxException e) {
            log.info("URISyntaxException : " + e);
        }
        return null;
    }

public String approveResponse(String pgToken) { //결제 승인 요청
        log.info("결제 승인요청 중 ........");
        Map<String, String> params = new HashMap<>();
        params.put("cid", cid);
        params.put("tid", kakaoPayReady.getTid());
        params.put("partner_order_id", "1001");
        params.put("partner_user_id", "goguma");
        params.put("pg_token", pgToken);
        log.info("parameter value : " + params);

        HttpEntity<Map<String, String>> body = new HttpEntity<Map<String, String>>(params, this.getHeaders());
        RestTemplate restTemplate = new RestTemplate();
        try {
            kakaoPayApprove = restTemplate.postForObject(new URI(host + "/online/v1/payment/success"), body, KakaoApproveResponse.class);
        } catch (RestClientException e) {
            log.info("RestClientException : " + e);
        } catch (URISyntaxException e) {
            log.info("URISyntaxException : " + e);
        }


        return pgToken;
    }
@RestController
@RequestMapping("/payment")
@RequiredArgsConstructor
@Log
@Setter
public class KakaoPayController {
    private final KakaoPayService kakaoPay;

    //결제 요청
    @PostMapping("/ready")
    public void readyToKakaoPay(HttpServletResponse response) {
        log.info("payment/ready 진입");
        String url = kakaoPay.kakaoPayReady();
        try {
            response.sendRedirect(url);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    //결제 승인
    @GetMapping("/success")
    public void afterPayRequest(@RequestParam("pg_token") String pgToken) {
        log.info("payment/success 진입");
        String kakaoApprove = kakaoPay.approveResponse(pgToken);
        ResponseEntity entity = new ResponseEntity<>(kakaoApprove, HttpStatus.OK);
    }

2024-04-11T16:44:05.541+09:00 INFO 16252 — [nio-8080-exec-6] c.p.backend.service.KakaoPayService : header value : [Host:“https://open-api.kakaopay.com”, Authorization:“SECRET_KEY DEV1A4C28485C32709A0D888EDD62DEE89D9A5D3”, Content-Type:“application/json”]
2024-04-11T16:44:05.542+09:00 INFO 16252 — [nio-8080-exec-6] c.p.backend.service.KakaoPayService : try 진입
2024-04-11T16:44:16.965+09:00 INFO 16252 — [nio-8080-exec-9] o.apache.coyote.http11.Http11Processor : Error parsing HTTP request header
Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x010x020x000x010x000x010xfc0x030x03H0xbb`;0x9d0xe30xf20xb50xbe0xdbP0x95^0xdd0xb30xd1,c0xaa:0xee0xaa0xdf0xb30x890J0x12n0xf2I0xb6 ]. HTTP method names must be tokens
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:419) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:272) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]

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

전달주신 정보만으로는 에러구간을 파악하기 어렵습니다.
partner_user_id : “goguma” 으로 로그를 확인하였을때, 4/12일 요청거래중 정상 ready 및 approve 정상응답된것까지 확인됩니다.
다만 일부 approve 요청응답이 에러응답되고 있습니다.

  1. {“code”:-701,“message”:“authentication doesn’t complete!”}
  2. {“code”:-702,“message”:“payment is already done!”}

1번 케이스는, 인증완료전에 approve 요청이 인입되어 발생한 케이스입니다.
2번 케이스는 이미 approve 이 인입되어 정상응답되었으나 , 중복 approve 요청이 인입된 케이습니다.

만약 현재 계속 에러가 발생되시는 케이스가 있다면, TID를 공유부탁드립니다.
로그 확인하여 답변드리도록 하겠습니다.

감사합니다.

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

문의 주신 내용 중
"카카오페이 api는 보안이슈로 인해 http는 사용하지 못한다"에 대한 부분 가이드 드립니다.

카카오페이 개발자센터에서는
사이트 도메인 등록 시 아래와 같은 형태의 http 프로토콜 사용은 허용하고 있습니다.

http://36.46.31.221 (O)
http://localhost:8080/ (0)
http://127.0.0.1 (0)

자세한 설명은
문서 > 시작하기 > 애플리케이션 관리 > 플랫폼 > 사이트 도메인 참고 부탁드립니다.

감사합니다.