“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]