버튼 클릭 시 controller 호출 코드
<form name = "frmSubmit">
<button id="kakaoapibtn"><img src="${path}/resources/img/kakao.jpeg"></button>
</form>
let theForm = document.frmSubmit;
theForm.method = "post";
theForm.action = "/miss/pay/kakaoPay.do";
호출된 controller 코드에서 결제 요청 메서드를 다시 호출해 준다 ❗
@Controller
@RequestMapping("pay")
public class PayController {
@PostMapping("/kakaoPay.do")
public String kakaoPay() throws SQLException {
LOG.debug("kakaoPay post............................................");
return "redirect:" + kakaopay.kakaoPayReady(resultPrice,uPoint,mbNum,useCouponId);
}
}
💡 KakaoPay API 를 활용하기 위해서는 Kakao 에서 제공하는 구현방법 을 차례대로 구현해 주면 된다 !
먼저, API 를 사용하기 위해 필요한 요청 값(Request value)을 확인한 후 그에 맞는 VO를 구현
package com.pcwk.miss.domain;
public class ReadyResponseVO {
private String tid;
private String next_redirect_pc_url;
private String partner_order_id;
public ReadyResponseVO(String tid, String next_redirect_pc_url, String partner_order_id) {
super();
this.tid = tid;
this.next_redirect_pc_url = next_redirect_pc_url;
this.partner_order_id = partner_order_id;
}
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
public String getNext_redirect_pc_url() {
return next_redirect_pc_url;
}
public void setNext_redirect_pc_url(String next_redirect_pc_url) {
this.next_redirect_pc_url = next_redirect_pc_url;
}
public String getPartner_order_id() {
return partner_order_id;
}
public void setPartner_order_id(String partner_order_id) {
this.partner_order_id = partner_order_id;
}
@Override
public String toString() {
return "ReadyResponseVO [tid=" + tid + ", next_redirect_pc_url=" + next_redirect_pc_url + ", partner_order_id="
+ partner_order_id + "]";
}
}
결제 요청
카카오페이 API 를 사용하기 위해 필요한 Parameter 값을을 결제 요청 메서드에 맞춰 구현해준다.

public String kakaoPayReady() throws SQLException {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "KakaoAK " + "ac83ec5a8b8bb9ce4c1b05b2959816ef");
headers.add("Accept", org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE);
headers.add("Content-Type", org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");
MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
params.add("cid", "TC0ONETIME");
params.add("partner_order_id", "1001");
params.add("partner_user_id", "gorany");
params.add("item_name", "TICKET");
params.add("quantity", "1");
params.add("total_amount", "10000");
params.add("tax_free_amount", "0");
params.add("approval_url", "http://localhost:8081/miss/pay/paycom.do");
params.add("cancel_url", "http://localhost:8081/miss/pay/reserve.do");
params.add("fail_url", "http://localhost:8081/miss/pay/paying.do");
HttpEntity<MultiValueMap<String, String>> body = new HttpEntity<MultiValueMap<String, String>>(params, headers);
try {
readyResponseVO = restTemplate.postForObject(new URI(HOST + "/v1/payment/ready"), body, ReadyResponseVO.class);
LOG.debug("" + readyResponseVO);
return readyResponseVO.getNext_redirect_pc_url();
} catch (RestClientException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
return "/pay";
}
결제 승인
결제 요청이 끝나면 결제 승인에 필요한 Parameter를 넣어서 메소드로 구현 !
public ApproveResponseVO kakaoPayInfo(String pg_token) {
LOG.debug("KakaoPayInfoVO............................................");
LOG.debug("-----------------------------");
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "KakaoAK " + "ac83ec5a8b8bb9ce4c1b05b2959816ef");
headers.add("Accept", org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE);
headers.add("Content-Type", org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");
MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
params.add("cid", "TC0ONETIME");
params.add("tid", readyResponseVO.getTid());
params.add("partner_order_id", "1001");
params.add("partner_user_id", "gorany");
params.add("pg_token", pg_token);
params.add("total_amount", String.valueOf(totalPrice));
HttpEntity<MultiValueMap<String, String>> body = new HttpEntity<MultiValueMap<String, String>>(params, headers);
try {
approveResponseVO = restTemplate.postForObject(new URI(HOST + "/v1/payment/approve"), body, ApproveResponseVO.class);
LOG.debug("" + approveResponseVO);
return approveResponseVO;
} catch (RestClientException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
return null;
}
결제 최소
결제를 취소할 경우 필요한 Parameter를 넣은 후 결제 취소 API를 요청
public String kakaoPayCancle(String tid, String cancel_amount){
LOG.debug("KakaoPayInfoVO............................................");
LOG.debug("-----------------------------");
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "KakaoAK " + "ac83ec5a8b8bb9ce4c1b05b2959816ef");
headers.add("Accept", org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE);
headers.add("Content-Type", org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");
MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
params.add("cid", "TC0ONETIME");
params.add("tid", tid);
params.add("cancel_amount", cancel_amount);
params.add("cancel_tax_free_amount", "0");
params.add("payload", "http://localhost:8081/miss/mypage/historyView.do?mbNum=" + mbNum);
HttpEntity<MultiValueMap<String, String>> body = new HttpEntity<MultiValueMap<String, String>>(params, headers);
try {
approveResponseVO = restTemplate.postForObject(new URI(HOST + "/v1/payment/cancel"), body, ApproveResponseVO.class);
LOG.debug("" + approveResponseVO);
return approveResponseVO.getPayload();
} catch (RestClientException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
return null;
}
}