KakaoPay API 활용해 결제 시스템 구현 (단건결제)

Park Jae Hong·2022년 8월 16일
0

버튼 클릭 시 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............................................");

		 // 결제 요청 method 호출
         return "redirect:" + kakaopay.kakaoPayReady(resultPrice,uPoint,mbNum,useCouponId);
     

     }
 }

💡 KakaoPay API 를 활용하기 위해서는 Kakao 에서 제공하는 구현방법 을 차례대로 구현해 주면 된다 !

먼저, API 를 사용하기 위해 필요한 요청 값(Request value)을 확인한 후 그에 맞는 VO를 구현

package com.pcwk.miss.domain;

/**
 * 결제 요청 VO
 */
public class ReadyResponseVO {

	private String tid; // 결제 번호
	private String next_redirect_pc_url; // 결제 완료시 이동할 페이지
	private String partner_order_id; // 주문한 사람 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();

       // 서버로 요청할 Header
       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");
       
       // 서버로 요청할 Body
       MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
       params.add("cid", "TC0ONETIME"); // 가맹정 코드 (test는 카카오에서 제공하는 샘플 코드 사용)
       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 {
      	 // Kakao 결제 요청 페이지 호출
           readyResponseVO = restTemplate.postForObject(new URI(HOST + "/v1/payment/ready"), body, ReadyResponseVO.class);
           
           LOG.debug("" + readyResponseVO);
           
           // 결제 성공 시 페이지 이동
           return readyResponseVO.getNext_redirect_pc_url();

       } catch (RestClientException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (URISyntaxException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
       
       return "/pay";
       
   }

결제 승인

결제 요청이 끝나면 결제 승인에 필요한 Parameter를 넣어서 메소드로 구현 !

public ApproveResponseVO kakaoPayInfo(String pg_token) {

       LOG.debug("KakaoPayInfoVO............................................");
       LOG.debug("-----------------------------");
       
       RestTemplate restTemplate = new RestTemplate();

       // 서버로 요청할 Header
       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) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (URISyntaxException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
       
       return null;
   }

결제 최소

결제를 취소할 경우 필요한 Parameter를 넣은 후 결제 취소 API를 요청


public String kakaoPayCancle(String tid, String cancel_amount){
   	 
       LOG.debug("KakaoPayInfoVO............................................");
       LOG.debug("-----------------------------");
       
       RestTemplate restTemplate = new RestTemplate();

       // 서버로 요청할 Header
       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) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (URISyntaxException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
       
       return null;
   }
	
}
profile
The people who are crazy enough to think they can change the world are the ones who do. -Steve Jobs-

0개의 댓글