열심히 끝까지

[API 사용] - 앱카드 결제 API(PAYAPP / PAYPLE) 본문

0607 팀 프로젝트 - 2Quals

[API 사용] - 앱카드 결제 API(PAYAPP / PAYPLE)

노유림 2022. 9. 30. 16:17

PAYAPP / PAYPLE 둘 다 실결제가 이루어지며 

PAYPLE은 24시간 내에 확실히 환불된다고 합니다.(test섭 내부에서)

(PAYAPP도 환불되는 것으로 알고있다만... 확실하게는 모르니 사용자는 확인할 것)

 

PAYAPP의 경우 빠르고 간단하게 사용할 수 있는 방법 존재한다. 

>> 빠르게 사용하는 방법

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script src="//lite.payapp.kr/public/api/payapp-lite.js"></script>
<script>
    PayApp.setDefault('userid',     '테스트코드');
    PayApp.setDefault('shopname',   '펫키지');
    function payappPay(){
        PayApp.setParam('goodname', 'USB');
        PayApp.setParam('price', '1000');
        PayApp.setParam('recvphone', '01000000000');
        PayApp.setParam('smsuse', 'n');
        PayApp.setParam('redirectpay', '1');
        PayApp.setParam('skip_cstpage', 'y');
        PayApp.call();
    }
</script>

<form name="MyForm">
    <input type="hidden" name="userid"   value="payapptest">
    <input type="hidden" name="shopname" value="펫키지">
    <input type="hidden" name="goodname" value="USB">
    <input type="hidden" name="price"    value="1000">
</form>

<a href="#" onclick="payappPay();">결제하기</a>
</body>
</html>

>> 여기서 PayApp.setDefault('userid', '테스트 id');로

      payapp에서 제공하는 테스트 아이디를 사용하면 실행 가능하다.

      - 어떤 포트에서도 사용 가능하며, 취소해도 다른 화면으로의 이동 없다.

PAYAPP에서는 더 자세한 코드도 제공하니 PAYPAA 홈페이지를 참고하면 좋을 것 같다.

[ 페이앱 홈페이지 참고 (페이앱 홈페이지 > API연동 > API연동 바로가기) ] 

 


 

PAYPLE의 경우 동영상까지 해서 설명해주는 부분 존재한다.

+ 깃허브를 이용한 테스트용 코드도 제공 [ 페이플 홈페이지 참고 (페이플 홈페이지 > API를 참고할 것) ]

 

>> 하지만 현재 나와 같은 boot 미사용자 및 다운그레이드 버전 사용자는

     코드에 맞게 업그레이드를 시키고 사용하면 된다.

     (boot가 깔려있지 않아 빨간 줄이 날 수 있으나, 사용에는 문제가 없다.)

 

- 하지만 boot에서 사용하는 코드로 인해 제대로 동작을 안하는 경우도 생겼다.

     > 즉, 내가 사용할 수 있게 변경이 필요하다는 뜻이다.

     > 현재의 나는 spring만 사용하는 사용자로, do요청을 받아들여 이동하도록 설정해두었다.

      ★ 다음 코드는 PAYPLE에서 제공하는 코드입니다.

                                          위의 페이플 홈페이지를 참고해주세요.★

 

 >> 참고로 다음에 올라오는 코드는 PAYPLE에서 제공하는 코드를 일부 변경한 것이다.

      [DispatcherSerlvet-servlet.xml을 만들어서 기본 파일을 PAYPLE에서 제공하는 파일로 설정할 것]

<context:component-scan base-package="com.example.payple" />

>> 이와 같이 설정할 것

      [web.xml에는 위의 디스패쳐 서블릿과 관련된 클래스를 작성하고 매핑해야하며

              언어 설정도 꼭 해줘야 언어가 넘어가도 깨지지 않고 진행이 된다.]

  <servlet>
  <!-- 사용하는 디스패쳐 서블릿 관련 작성 -->
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <!-- 인코딩 필터 -->
  <filter>
  	<filter-name>characterEncodingFilter</filter-name>
  	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  <!-- 언어 적용되는 곳 필터 -->
  <filter-mapping>
  	<filter-name>characterEncodingFilter</filter-name>
  	<url-pattern>*.do</url-pattern>
  </filter-mapping>

 

payple.jsp----------

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    /* 광고 혹은 뭔가를 넘겨주어야 할 때는 .jsp가 아니라 .do로 작용 */
	response.sendRedirect("order.do");
%>

order.jsp----------

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
    <title>결제창 데모</title>

    <!-- jquery 는 파트너사에서 이용중인 jquery 버전으로 이용하셔도 됩니다. -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

    <script>
      $(document).ready(function () {
        $("#orderFormSubmit").on("click", function (event) {
          var fm = $("#orderForm")[0];
          fm.method = "POST";
          fm.action = "order_confirm.do";
          fm.submit();
          event.preventDefault();
        });

        /*
         *  #pay_type: 결제수단
         *  #taxsave_view: 현금영수증 발행여부 view
         *  #card_ver_view: 카드 세부 결제방식 view
         */
        $("#pay_type").on("change", function (e) {
          e.preventDefault();

          var this_val = $(this).val();

          if (this_val == "card") {
            $("#taxsave_view").css("display", "none");
            $("#card_ver_view").css("display", "");
          } else {
            $("#taxsave_view").css("display", "");
            $("#card_ver_view").css("display", "none");
          }

          $("#card_ver").on("change", function () {
            if ($(this).val() == "01") {
              $('#pay_work option[value*="AUTH"]').prop("disabled", false);
            } else {
              $('#pay_work option[value*="AUTH"]').prop("disabled", true);
            }
          });
        });

        /* 
		 *	#simple_flag: 간편결제 여부
         *  #payer_authtype_view: 비밀번호 결제 인증방식 view
         */
        $("#simple_flag").on("change", function (e) {
          e.preventDefault();

          var this_val = $(this).val();

          if (this_val == "Y") {
            $("#payer_authtype_view").css("display", "");
          } else {
            $("#payer_authtype_view").css("display", "none");
          }
        });
      });
    </script>

    <style>
      body {
        font-size: 12px;
      }

      input {
        width: 300px;
        height: 20px;
        border: 1px solid gray;
      }

      select {
        height: 30px;
      }

      table {
        border: 1px solid #aaaaaa;
        text-align: center;
      }

      tr {
        height: 35px;
      }

      th {
        text-align: center;
        font-weight: bold;
        background-color: #ececec;
      }

      td {
        text-align: left;
        padding-left: 5px;
      }

      #subject,
      #parameter,
      #value {
        background-color: rgba(120, 82, 232, 0.2);
        font-size: 15px;
      }

      #orderFormSubmit {
        font-size: 12px;
        font-weight: bold;
        width: 100px;
        height: 30px;
        cursor: pointer;
      }
    </style>
</head>
<body>
    <form id="orderForm" name="orderForm">
        <h2>| 주문 정보 설정</h2>
        <table>
            <colgroup>
                <col style="width: 150px;">
                <col style="width: 150px;">
                <col style="width: 300px;">
            </colgroup>
            <tr>
                <th id="subject">
                    항목
                </th>
                <th id="parameter">
                    요청변수
                </th>
                <th id="value">
                    값
                </th>
            </tr>
            <tr>
                <th>
                    주문번호
                </th>
                <th>
                    PCD_PAY_OID
                </th>
                <td>
                    <input type="text" name="pay_oid" id="pay_oid" value="">
                </td>
            </tr>
            <tr>
                <th>
                    파트너사 회원번호
                </th>
                <th>
                    PCD_PAYER_NO
                </th>
                <td>
                    <input type="text" name="payer_no" id="payer_no" value="${payer_no}">
                </td>
            </tr>
            <tr>
                <th>
                    결제고객 이름
                </th>
                <th>
                    PCD_PAYER_NAME
                </th>
                <td>
                    <input type="text" name="payer_name" id="payer_name" value="${payer_name}">
                </td>
            </tr>
            <tr>
                <th>
                    결제고객 휴대전화번호
                </th>
                <th>
                    PCD_PAYER_HP
                </th>
                <td>
                    <input type="text" name="payer_hp" id="payer_hp" value="${payer_hp}">
                </td>
            </tr>
            <tr>
                <th>
                    결제고객 이메일
                </th>
                <th>
                    PCD_PAYER_EMAIL
                </th>
                <td>
                    <input type="text" name="payer_email" id="payer_email" value="${payer_email}">
                </td>
            </tr>
            <tr>
                <th>
                    상품명
                </th>
                <th>
                    PCD_PAY_GOODS
                </th>
                <td>
                    <input type="text" name="pay_goods" id="pay_goods" value="${pay_goods}">
                </td>
            </tr>
            <tr>
                <th>
                    결제금액
                </th>
                <th>
                    PCD_PAY_TOTAL
                </th>
                <td>
                    <input type="text" name="pay_total" id="pay_total" value="${pay_total}">
                </td>
            </tr>
        </table>

        <h2>| 결제 정보 설정</h2>
        <table>
            <colgroup>
                <col style="width: 150px;">
                <col style="width: 150px;">
                <col style="width: 300px;">
            </colgroup>
            <tr>
                <th id="subject">
                    항목
                </th>
                <th id="parameter">
                    요청변수
                </th>
                <th id="value">
                    값
                </th>
            </tr>
            <tr>
                <th>
                    결제수단
                </th>
                <th>
                    PCD_PAY_TYPE
                </th>
                <td>
                    <span>
                        <select id="pay_type" name="pay_type">
                            <option value="transfer">계좌이체결제</option>
                            <option value="card">신용카드</option>
                        </select>
                    </span>
                    <span id="card_ver_view" style="display:none;">
                        <select id="card_ver" name="card_ver">
                            <option value="01">간편/정기(빌링키결제)</option>
                            <option value="02">앱카드</option>
                        </select>
                    </span>
                </td>
            </tr>
            <tr id="taxsave_view">
                <th>
                    현금영수증 발행여부
                </th>
                <th>
                    PCD_TAXSAVE_FLAG
                </th>
                <td>
                    <select id="taxsave_flag" name="taxsave_flag">
                        <option value="N">N</option>
                        <option value="Y">Y</option>
                    </select>
                </td>
            </tr>
            <tr>
                <th>
                    빌링키
                </th>
                <th>
                    PCD_PAYER_ID
                </th>
                <td>
                    <input type="text" name="payer_id" id="payer_id" value="">
                </td>
            </tr>
            <tr>
                <th>
                    결제요청 방식
                </th>
                <th>
                    PCD_PAY_WORK
                </th>
                <td>
                    <select id="pay_work" name="pay_work">
                        <option value="PAY">즉시결제(PAY)</option>
                        <option value="AUTH">빌링키 등록(AUTH)</option>
                        <option value="CERT">결제요청 재컨펌(CERT)</option>
                    </select>
                </td>
            </tr>
            <tr>
                <th>
                    과세설정
                </th>
                <th>
                    PCD_PAY_ISTAX
                </th>
                <td>
                    <select id="pay_istax" name="pay_istax">
                        <option value="Y" selected>과세</option>
                        <option value="N">비과세</option>
                    </select>
                </td>
            </tr>
            <tr>
                <th>
                    부가세 설정
                </th>
                <th>
                    PCD_PAY_TAXTOTAL
                </th>
                <td>
                    <input type="text" name="pay_taxtotal" id="pay_taxtotal" value="">
                </td>
            </tr>
            <tr>
                <th>
                    간편결제 구분
                </th>
                <th>
                    PCD_SIMPLE_FLAG
                </th>
                <td>
                    <select id="simple_flag" name="simple_flag">
                        <option value="N">미사용</option>
                        <option value="Y">사용</option>
                    </select>
                </td>
            </tr>
            <tr id="payer_authtype_view" style="display:none;">
                <th>
                    비밀번호 결제 인증방식
                </th>
                <th>
                    PCD_PAYER_AUTHTYPE
                </th>
                <td>
                    <select name="payer_authtype">
                        <option value="">미사용</option>
                        <option value="pwd">사용</option>
                    </select>
                </td>
            </tr>
            <tr>
                <th>
                    결제(요청)결과<br>RETURN URL
                </th>
                <th>
                    PCD_RST_URL
                </th>
                <td>
                    <select name="is_direct">
                        <option value="N">팝업</option>
                        <option value="Y">다이렉트</option>
                    </select>
                </td>
            </tr>
        </table>
    </form>
    <br>
    <button id="orderFormSubmit" style="margin-left: 525px">상품구매</button>
</body>
</html>

order_confirm.jsp----------

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport"
	content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
<title>결제정보 확인</title>
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<!-- payple js 호출. 테스트/운영 선택 -->
<script src="https://democpay.payple.kr/js/cpay.payple.1.0.1.js"></script> <!-- TEST (테스트) -->
<!-- <script src="https://cpay.payple.kr/js/cpay.payple.1.0.1.js"></script> --> <!-- REAL (운영) -->

<script>
	$(document).ready(
			function() {
				
				// callBack 함수 사용
				var getResult = function(res) {

					var url = "/order_result.php";

					var $form = $('<form></form>');
					$form.attr('action', url);
					$form.attr('method', 'post');

					$.each(res, function(key, val) {
						var input = $('<input type="hidden" name="' + key + '" value="' + val + '">');
						$form.append(input);
					});

					$form.appendTo('body');
					$form.submit();
				};

				// 결제 요청
				$("#payAction").on(
						"click",
						function(event) {

							var pay_type = "${pay_type}";
							var pay_work = "${pay_work}";
							var payer_id = "${payer_id}";
							var payer_no = "${payer_no}";
							var payer_name = "${payer_name}";
							var payer_hp = "${payer_hp}";
							var payer_email = "${payer_email}";
							var pay_goods = "${pay_goods}";
							var pay_total = Number("${pay_total}");
							var pay_taxtotal = Number("${pay_taxtotal}");
							var pay_istax = "${pay_istax}";
							var pay_oid = "${pay_oid}";
							var taxsave_flag = "${taxsave_flag}";
							var simple_flag = "${simple_flag}";
							var card_ver = "${card_ver}";
							var payer_authtype = "${payer_authtype}";
							var is_direct = "${is_direct}";
							var pcd_rst_url = "";
							var server_name = "${hostname}";
							
							// order_confirm.do에 결제 선택하는 창으로 다시 이동하도록 할 것
							// 결제창 방식 설정 - 팝업(상대경로), 다이렉트(절대경로)
							pcd_rst_url = is_direct === 'Y' ? server_name
									+ "order_confirm.do" : "order_confirm.do";
							// "/order_result"
							var obj = new Object();

							/* 결제연동 파라미터 */

							//DEFAULT SET 1
							obj.PCD_PAY_TYPE = pay_type; 	// (필수) 결제수단 (transfer|card)
							obj.PCD_PAY_WORK = pay_work; 	// (필수) 결제요청 방식 (AUTH | PAY | CERT)

							// 카드결제 시 필수 (카드 세부 결제방식)
							obj.PCD_CARD_VER = card_ver; 	// Default: 01 (01: 간편/정기결제, 02: 앱카드)

							/* 결제요청 방식별(PCD_PAY_WORK) 파라미터 설정 */

							/*
							 * 1. 빌링키 등록
							 * PCD_PAY_WORK : AUTH
							 */
							if (pay_work == 'AUTH') {

								obj.PCD_PAYER_NO = payer_no; 			// (선택) 결제자 고유번호 (파트너사 회원 회원번호) (결과전송 시 입력값 그대로 RETURN)
								obj.PCD_PAYER_NAME = payer_name; 		// (선택) 결제자 이름
								obj.PCD_PAYER_HP = payer_hp; 			// (선택) 결제자 휴대전화번호
								obj.PCD_PAYER_EMAIL = payer_email; 		// (선택) 결제자 이메일
								obj.PCD_TAXSAVE_FLAG = taxsave_flag; 	// (선택) 현금영수증 발행요청 (Y|N)
								obj.PCD_SIMPLE_FLAG = simple_flag; 		// (선택) 간편결제 여부 (Y|N)

							}

							/*
							 * 2. 빌링키 등록 및 결제
							 * PCD_PAY_WORK : PAY | CERT
							 */
							if (pay_work != 'AUTH') {

								// 2.1 첫결제 및 단건(일반,비회원)결제
								if (simple_flag != 'Y' || payer_id == '') {

									obj.PCD_PAY_GOODS = pay_goods; 			// (필수) 상품명
									obj.PCD_PAY_TOTAL = pay_total; 			// (필수) 결제요청금액
									obj.PCD_PAYER_NO = payer_no; 			// (선택) 결제자 고유번호 (파트너사 회원 회원번호) (결과전송 시 입력값 그대로 RETURN)
									obj.PCD_PAYER_NAME = payer_name; 		// (선택) 결제자 이름
									obj.PCD_PAYER_HP = payer_hp; 			// (선택) 결제자 휴대전화번호
									obj.PCD_PAYER_EMAIL = payer_email; 		// (선택) 결제자 이메일
									obj.PCD_PAY_TAXTOTAL = pay_taxtotal; 	// (선택) 부가세(복합과세 적용 시)
									obj.PCD_PAY_ISTAX = pay_istax; 			// (선택) 과세여부
									obj.PCD_PAY_OID = pay_oid; 				// (선택) 주문번호 (미입력 시 임의 생성)
									obj.PCD_TAXSAVE_FLAG = taxsave_flag; 	// (선택) 현금영수증 발행요청 (Y|N)

								}

								// 2.2 간편결제 (빌링키결제)
								if (simple_flag == 'Y' && payer_id != '') {

									// PCD_PAYER_ID 는 소스상에 표시하지 마시고 반드시 Server Side Script 를 이용하여 불러오시기 바랍니다.
									obj.PCD_PAYER_ID = payer_id; 			// (필수) 빌링키 - 결제자 고유ID (본인인증 된 결제회원 고유 KEY)
									obj.PCD_SIMPLE_FLAG = 'Y'; 				// (필수) 간편결제 여부 (Y|N)
									obj.PCD_PAY_GOODS = pay_goods; 			// (필수) 상품명
									obj.PCD_PAY_TOTAL = pay_total; 			// (필수) 결제요청금액
									obj.PCD_PAYER_NO = payer_no; 			// (선택) 결제자 고유번호 (파트너사 회원 회원번호) (결과전송 시 입력값 그대로 RETURN)
									obj.PCD_PAY_TAXTOTAL = pay_taxtotal; 	// (선택) 부가세(복합과세인 경우 필수)
									obj.PCD_PAY_ISTAX = pay_istax; 			// (선택) 과세여부
									obj.PCD_PAY_OID = pay_oid; 				// (선택) 주문번호 (미입력 시 임의 생성)
									obj.PCD_TAXSAVE_FLAG = taxsave_flag; 	// (선택) 현금영수증 발행요청 (Y|N)

								}

							}

							// DEFAULT SET 2
							obj.PCD_PAYER_AUTHTYPE = payer_authtype; 	// (선택) 비밀번호 결제 인증방식 (pwd : 패스워드 인증)
							obj.PCD_RST_URL = pcd_rst_url; 				// (필수) 결제(요청)결과 RETURN URL
							//obj.callbackFunction = getResult; 		// (선택) 결과를 받고자 하는 callback 함수명 (callback함수를 설정할 경우 PCD_RST_URL 이 작동하지 않음)

							// 파트너 인증시 받은 AuthKey 값 입력
							obj.PCD_AUTH_KEY = "${authKey}";

							// 파트너 인증시 받은 return_url 값 입력
							obj.PCD_PAY_URL = "${payReqURL}";

							PaypleCpayAuthCheck(obj);

							event.preventDefault();
						});
			});

</script>
<style>
table {
	border: 1px solid #aaaaaa;
	text-align: center;
}

tr {
	height: 35px;
}

th {
	text-align: center;
	font-weight: bold;
	background-color: #ececec;
	font-size: 14px;
}

td {
	text-align: left;
	padding-left: 5px;
}

#subject, #parameter {
	background-color: rgba(120, 82, 232, 0.2);
	font-size: 15px;
}
</style>
</head>

<body>
	<table border="1">
		<h2>| Payple 연동 API</h2>
		<tr>
			<th id="subject">항목</th>
			<th id="parameter">요청변수</th>
		</tr>
		<tr>
			<th>결제자 이름</th>
			<td>${payer_name}</td>
		</tr>
		<tr>
			<th>결제자 휴대폰번호</th>
			<td>${payer_hp}</td>
		</tr>
		<tr>
			<th>결제자 이메일</th>
			<td>${payer_email}</td>
		</tr>
		<tr>
			<th>구매상품</th>
			<td>${pay_goods}</td>
		</tr>
		<tr>
			<th>결제금액</th>
			<td>${pay_total}</td>
		</tr>
		<tr>
			<th>과세여부</th>
			<td>${pay_istax}</td>
		</tr>
		<tr>
			<th>주문번호</th>
			<td>${pay_oid}</td>
		</tr>
		<tr>
			<th>현금영수증</th>
			<td>${taxsave_flag}</td>
		</tr>
	</table>
	<br />
	<button id="payAction" style="margin-left: 260px">결제하기</button>
</body>
</html>

PaypleController.java----------

package com.example.payple;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class PaypleController {


	/**
	 * 파트너 인증 메소드
	 * 
	 * @param params // 상황별 파트너 인증 요청 파라미터(계정정보 제외)
	 * @return JSONObject // 파트너 인증 응답값
	 */
	public JSONObject payAuth(Map<String, String> params) {
		JSONObject jsonObject = new JSONObject();
		JSONParser jsonParser = new JSONParser();
		try {

			// 파트너 인증 Request URL
			String pURL = "테스트 서버URL"; // TEST (테스트)
			// String pURL = "실제 운영 서버URL"; // REAL (운영)

			// 계정정보 == 홈페이지 들어가면 코드 존재, 직접 확인해볼 것
			String cst_id = "id값";
			String cust_key = "키값";

			JSONObject obj = new JSONObject();
			obj.put("cst_id", cst_id);
			obj.put("custKey", cust_key);

			// 상황별 파트너 인증 요청 파라미터
			
			 if (params != null) { 
				 for (Map.Entry<String, String> elem : params.entrySet()) { 
					 obj.put(elem.getKey(), elem.getValue()); 
				 } 
			}
			 

			System.out.println("파트너 인증 Request: " + obj.toString());

			URL url = new URL(pURL);
			HttpURLConnection con = (HttpURLConnection) url.openConnection();

			/*
			 * ※ Referer 설정 방법 
			 * TEST : referer에는 테스트 결제창을 띄우는 도메인을 넣어주셔야합니다. 
			 * 		  결제창을 띄울 도메인과 referer값이 다르면 [AUTH0007] 응답이 발생합니다.
			 * REAL : referer에는 가맹점 도메인으로 등록된 도메인을 넣어주셔야합니다.
			 * 		  다른 도메인을 넣으시면 [AUTH0004] 응답이 발생합니다.
			 * 		  또한, TEST에서와 마찬가지로 결제창을 띄우는 도메인과 같아야 합니다.
			 */
			con.setRequestMethod("POST");
			con.setRequestProperty("content-type", "application/json");
			con.setRequestProperty("charset", "UTF-8");
			con.setRequestProperty("referer", "http://localhost:80");
			con.setDoOutput(true);

			DataOutputStream wr = new DataOutputStream(con.getOutputStream());
			wr.write(obj.toString().getBytes());
			wr.flush();
			wr.close();

			int responseCode = con.getResponseCode();
			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
			String inputLine;
			StringBuffer response = new StringBuffer();

			while ((inputLine = in.readLine()) != null) {
				response.append(inputLine);
			}

			in.close();

			jsonObject = (JSONObject) jsonParser.parse(response.toString());

		} catch (Exception e) {
			e.printStackTrace();
		}
		return jsonObject;

	}
	
}

orderController.java----------

package com.example.payple;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class orderController extends PaypleController{
	
	/*
	 * order.jsp : 주문 페이지  
	 */
	@RequestMapping(value = "/order.do")
	public String order(Model model) {
		model.addAttribute("payer_no", "1234"); 				// 파트너 회원 고유번호
		model.addAttribute("payer_name", "홍길동"); 				// 결제자 이름
		model.addAttribute("payer_hp", "01012345678"); 			// 결제자 휴대전화번호
		model.addAttribute("payer_email", "test@payple.kr"); 	// 결제자 이메일
		model.addAttribute("pay_goods", "휴대폰"); 				// 상품명
		model.addAttribute("pay_total", "1000"); 				// 결제요청금액

		return "order.jsp";
	}
	
	/*
	 * order_confirm.jsp : 결제확인 페이지
	 */
	@RequestMapping(value = "/order_confirm.do")
	public String order_confirm(HttpServletRequest request, Model model) {

		model.addAttribute("pay_type", request.getParameter("pay_type")); 				// 결제수단 (transfer|card)
		model.addAttribute("pay_work", request.getParameter("pay_work")); 				// 결제요청 방식 (AUTH | PAY | CERT)
		model.addAttribute("payer_id", request.getParameter("payer_id")); 				// 결제자 고유 ID (빌링키)
		model.addAttribute("payer_no", request.getParameter("payer_no")); 				// 파트너 회원 고유번호
		model.addAttribute("payer_name", request.getParameter("payer_name")); 			// 결제자 이름
		model.addAttribute("payer_hp", request.getParameter("payer_hp")); 				// 결제자 휴대전화번호
		model.addAttribute("payer_email", request.getParameter("payer_email")); 		// 결제자 이메일
		model.addAttribute("pay_goods", request.getParameter("pay_goods")); 			// 상품명
		model.addAttribute("pay_total", request.getParameter("pay_total")); 			// 결제요청금액
		model.addAttribute("pay_taxtotal", request.getParameter("pay_taxtotal")); 		// 부가세(복합과세 적용 시)
		model.addAttribute("pay_istax", request.getParameter("pay_istax")); 			// 과세 여부 (과세:Y 비과세:N)
		model.addAttribute("pay_oid", request.getParameter("pay_oid")); 				// 주문번호
		model.addAttribute("taxsave_flag", request.getParameter("taxsave_flag")); 		// 현금영수증 발행요청 (Y|N)
		model.addAttribute("simple_flag", request.getParameter("simple_flag")); 		// 간편결제 여부 (Y|N)
		model.addAttribute("card_ver", request.getParameter("card_ver")); 				// 카드 세부 결제방식
		model.addAttribute("payer_authtype", request.getParameter("payer_authtype")); 	// 비밀번호 결제 인증방식 (pwd : 패스워드 인증)
		model.addAttribute("is_direct", request.getParameter("is_direct")); 			// 결제창 호출 방식 (DIRECT: Y | POPUP: N)
		model.addAttribute("hostname", System.getenv("HOSTNAME"));

		// 파트너 인증
		JSONObject obj = new JSONObject();
		obj = payAuth(null);

		// 파트너 인증 후 결제요청 시 필요한 필수 파라미터
		model.addAttribute("authKey", obj.get("AuthKey")); 		// 인증 키
		model.addAttribute("payReqURL", obj.get("return_url")); // 결제요청 URL

		return "order_confirm.jsp";
	}


	/*
	 * order_result.jsp : 결제결과 확인 페이지
	 */
	@RequestMapping(value = "/order_result.do")
	public String order_result(HttpServletRequest request, Model model) {

		// 1. 결제결과 모두 출력
		Enumeration<String> params = request.getParameterNames();
		String result = "";

		while (params.hasMoreElements()) {
			String name = (String) params.nextElement();
			result += name + " => " + request.getParameter(name) + "<br>";
		}
		model.addAttribute("result", result);

		// 2. 결제결과 파라미터로 받기 - 응답 파라미터를 받아서 활용해보세요.
		model.addAttribute("pay_rst", request.getParameter("PCD_PAY_RST")); 					// 결제요청 결과 (success | error)
		model.addAttribute("pay_code", request.getParameter("PCD_PAY_CODE")); 					// 결제요청 결과 코드
		model.addAttribute("pay_msg", request.getParameter("PCD_PAY_MSG")); 					// 결제요청 결과 메세지
		model.addAttribute("pay_type", request.getParameter("PCD_PAY_TYPE")); 					// 결제수단 (transfer|card)
		model.addAttribute("card_ver", request.getParameter("PCD_CARD_VER")); 					// 카드 세부 결제방식
		model.addAttribute("pay_work", request.getParameter("PCD_PAY_WORK")); 					// 결제요청 방식 (AUTH | PAY | CERT)
		model.addAttribute("auth_key", request.getParameter("PCD_AUTH_KEY")); 					// 결제요청 파트너 인증 토큰 값
		model.addAttribute("pay_reqkey", request.getParameter("PCD_PAY_REQKEY")); 				// (CERT방식) 최종 결제요청 승인키
		model.addAttribute("pay_cofurl", request.getParameter("PCD_PAY_COFURL")); 				// (CERT방식) 최종 결제요청 URL

		model.addAttribute("payer_id", request.getParameter("PCD_PAYER_ID")); 					// 결제자 고유 ID (빌링키)
		model.addAttribute("payer_no", request.getParameter("PCD_PAYER_NO")); 					// 결제자 고유번호 (파트너사 회원 회원번호)
		model.addAttribute("payer_name", request.getParameter("PCD_PAYER_NAME")); 				// 결제자 이름
		model.addAttribute("payer_hp", request.getParameter("PCD_PAYER_HP")); 					// 결제자 휴대전화번호
		model.addAttribute("payer_email", request.getParameter("PCD_PAYER_EMAIL")); 			// 결제자 이메일 (출금결과 수신)
		model.addAttribute("pay_oid", request.getParameter("PCD_PAY_OID")); 					// 주문번호
		model.addAttribute("pay_goods", request.getParameter("PCD_PAY_GOODS")); 				// 상품명
		model.addAttribute("pay_total", request.getParameter("PCD_PAY_TOTAL")); 				// 결제요청금액
		model.addAttribute("pay_taxtotal", request.getParameter("PCD_PAY_TAXTOTAL")); 			// 부가세(복합과세 적용 시)
		model.addAttribute("pay_istax", request.getParameter("PCD_PAY_ISTAX")); 				// 과세 여부 (과세:Y 비과세:N)
		model.addAttribute("pay_date", request.getParameter("PCD_PAY_TIME") == null ? "": 
			request.getParameter("PCD_PAY_TIME").substring(0, 8)); 								// 결제완료 일자
		model.addAttribute("pay_bankacctype", request.getParameter("PCD_PAY_BANKACCTYPE")); 	// 고객 구분 (법인 | 개인 or 개인사업자)

		model.addAttribute("pay_bank", request.getParameter("PCD_PAY_BANK")); 					// 은행코드
		model.addAttribute("pay_bankname", request.getParameter("PCD_PAY_BANKNAME")); 			// 은행명
		model.addAttribute("pay_banknum", request.getParameter("PCD_PAY_BANKNUM")); 			// 계좌번호
		model.addAttribute("taxsave_rst", request.getParameter("PCD_TAXSAVE_RST")); 			// 현금영수증 발행결과 (Y|N)

		model.addAttribute("pay_cardname", request.getParameter("PCD_PAY_CARDNAME")); 			// 카드사명
		model.addAttribute("pay_cardnum", request.getParameter("PCD_PAY_CARDNUM")); 			// 카드번호
		model.addAttribute("pay_cardtradenum", request.getParameter("PCD_PAY_CARDTRADENUM"));	// 카드 거래번호
		model.addAttribute("pay_cardauthno", request.getParameter("PCD_PAY_CARDAUTHNO")); 		// 카드 승인번호
		model.addAttribute("pay_cardreceipt", request.getParameter("PCD_PAY_CARDRECEIPT")); 	// 카드 매출전표 URL

		return "order_result.jsp";
	}

	/*
	 * payRefund : 결제취소
	 */
	@ResponseBody
	@PostMapping(value = "/payRefund.do")
	public JSONObject payRefund(HttpServletRequest request) {

		JSONObject jsonObject = new JSONObject();
		JSONParser jsonParser = new JSONParser();

		// 결제취소 전 파트너 인증
		Map<String, String> refundParams = new HashMap();
		refundParams.put("PCD_PAYCANCEL_FLAG", "Y");

		JSONObject authObj = new JSONObject();
		authObj = payAuth(refundParams);

		// 파트너 인증 응답값
		String cstId = (String) authObj.get("cst_id"); 			// 파트너사 ID
		String custKey = (String) authObj.get("custKey"); 		// 파트너사 키
		String authKey = (String) authObj.get("AuthKey"); 		// 인증 키
		String payRefURL = (String) authObj.get("return_url"); 	// 결제취소요청 URL

		// 결제취소 요청 파라미터
		String refund_key = "a41ce010ede9fcbfb3be86b24858806596a9db68b79d138b147c3e563e1829a0"; // (필수) 환불키
		String pay_oid = request.getParameter("PCD_PAY_OID"); 									// (필수) 주문번호
		String pay_date = request.getParameter("PCD_PAY_DATE"); 								// (필수) 원거래 결제일자
		String refund_total = request.getParameter("PCD_REFUND_TOTAL"); 						// (필수) 결제취소 요청금액
		String refund_taxtotal = request.getParameter("PCD_REFUND_TAXTOTAL"); 					// 결제취소 부가세

		try {

			// 결제취소 요청 전송
			JSONObject refundObj = new JSONObject();

			refundObj.put("PCD_CST_ID", cstId);
			refundObj.put("PCD_CUST_KEY", custKey);
			refundObj.put("PCD_AUTH_KEY", authKey);
			refundObj.put("PCD_REFUND_KEY", refund_key);
			refundObj.put("PCD_PAYCANCEL_FLAG", "Y");
			refundObj.put("PCD_PAY_OID", pay_oid);
			refundObj.put("PCD_PAY_DATE", pay_date);
			refundObj.put("PCD_REFUND_TOTAL", refund_total);
			refundObj.put("PCD_REFUND_TAXTOTAL", refund_taxtotal);

			URL url = new URL(payRefURL);
			HttpURLConnection con = (HttpURLConnection) url.openConnection();

			con.setRequestMethod("POST");
			con.setRequestProperty("content-type", "application/json");
			con.setRequestProperty("referer", "http://localhost:8080");
			con.setDoOutput(true);

			DataOutputStream wr = new DataOutputStream(con.getOutputStream());
			wr.writeBytes(refundObj.toString());
			wr.flush();
			wr.close();

			int responseCode = con.getResponseCode();
			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
			String inputLine;
			StringBuffer response = new StringBuffer();

			while ((inputLine = in.readLine()) != null) {
				response.append(inputLine);
			}

			in.close();

			jsonObject = (JSONObject) jsonParser.parse(response.toString());

		} catch (Exception e) {
			e.printStackTrace();
		}

		return jsonObject;

	}
	
	
	/*
	 * payCertSend : 결제요청 재컨펌 (CERT)
	 */
	@ResponseBody
	@PostMapping(value = "/payCertSend")
	public JSONObject payCertSend(HttpServletRequest request) {

		JSONObject jsonObject = new JSONObject();
		JSONParser jsonParser = new JSONParser();
		
		// 결제요청 재컨펌(CERT) 데이터 - 필수
		String auth_key = request.getParameter("PCD_AUTH_KEY"); 	// 파트너 인증 토큰 값
		String payer_id = request.getParameter("PCD_PAYER_ID"); 	// 결제자 고유 ID (빌링키)
		String pay_reqkey = request.getParameter("PCD_PAY_REQKEY"); // 최종 결제요청 승인키
		String pay_cofurl = request.getParameter("PCD_PAY_COFURL"); // 최종 결제요청 URL
		
		try {

			// 결제요청 재컨펌(CERT) 요청 전송
			JSONObject refundObj = new JSONObject();

			refundObj.put("PCD_CST_ID", "test"); 				// 파트너사 cst_id
			refundObj.put("PCD_CUST_KEY", "abcd1234567890"); 	// 파트너사 custKey
			refundObj.put("PCD_AUTH_KEY", auth_key); 
			refundObj.put("PCD_PAYER_ID", payer_id); 
			refundObj.put("PCD_PAY_REQKEY", pay_reqkey);

			URL url = new URL(pay_cofurl);
			HttpURLConnection con = (HttpURLConnection) url.openConnection();

			con.setRequestMethod("POST");
			con.setRequestProperty("content-type", "application/json");
			con.setRequestProperty("referer", "http://localhost:8080");
			con.setDoOutput(true);

			DataOutputStream wr = new DataOutputStream(con.getOutputStream());
			wr.writeBytes(refundObj.toString());
			wr.flush();
			wr.close();

			int responseCode = con.getResponseCode();
			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
			String inputLine;
			StringBuffer response = new StringBuffer();

			while ((inputLine = in.readLine()) != null) {
				response.append(inputLine);
			}

			in.close();

			jsonObject = (JSONObject) jsonParser.parse(response.toString());

		}catch (Exception e) {
			e.printStackTrace();
		}

		return jsonObject;
	}
	
	
	
	// 정기결제 재결제(빌링키결제) (paySimpleSend.jsp)
	@RequestMapping(value = "/paySimpleSend.do")
	public String paySimpleSendRoute(Model model) {

		model.addAttribute("payer_id", ""); 					// 결제자 고유 ID (빌링키)
		model.addAttribute("pay_goods", "휴대폰"); 				// 상품명
		model.addAttribute("pay_total", "1000"); 				// 결제요청금액
		model.addAttribute("payer_no", "1234"); 				// 결제자 고유번호 (파트너사 회원 회원번호)
		model.addAttribute("payer_email", "test@payple.kr"); 	// 결제자 이메일

		return "paySimpleSend";
	}
	
	
	/*
	 * paySimpleSend : 정기결제 재결제(빌링키 결제)
	 */
	@ResponseBody
	@PostMapping(value = "/paySimpleSend.do")
	public JSONObject paySimpleSend(HttpServletRequest request) {
		JSONObject jsonObject = new JSONObject();
		JSONParser jsonParser = new JSONParser();

		// 정기결제 재결제 전 파트너 인증
		Map<String, String> bilingParams = new HashMap();
		bilingParams.put("PCD_PAY_TYPE", request.getParameter("PCD_PAY_TYPE"));
		bilingParams.put("PCD_SIMPLE_FLAG", "Y");

		JSONObject authObj = new JSONObject();
		authObj = payAuth(bilingParams);

		System.out.println(authObj.toString());

		// 파트너 인증 응답값
		String cstId = (String) authObj.get("cst_id"); 			// 파트너사 ID
		String custKey = (String) authObj.get("custKey"); 		// 파트너사 키
		String authKey = (String) authObj.get("AuthKey"); 		// 인증 키
		String bilingURL = (String) authObj.get("return_url"); 	// 카드 정기결제 재결제 요청 URL

		// 정기결제 재결제 요청 파라미터
		String pay_type = request.getParameter("PCD_PAY_TYPE"); 			// (필수) 결제수단 (card | transfer)
		String payer_id = request.getParameter("PCD_PAYER_ID"); 			// (필수) 결제자 고유 ID (빌링키)
		String pay_goods = request.getParameter("PCD_PAY_GOODS"); 			// (필수) 상품명
		String pay_total = request.getParameter("PCD_PAY_TOTAL"); 			// (필수) 결제요청금액
		String pay_oid = request.getParameter("PCD_PAY_OID"); 				// 주문번호
		String payer_no = request.getParameter("PCD_PAYER_NO"); 			// 결제자 고유번호 (파트너사 회원 회원번호)
		String payer_name = request.getParameter("PCD_PAYER_NAME"); 		// 결제자 이름
		String payer_hp = request.getParameter("PCD_PAYER_HP");				// 결제자 휴대전화번호
		String payer_email = request.getParameter("PCD_PAYER_EMAIL"); 		// 결제자 이메일
		String pay_istax = request.getParameter("PCD_PAY_ISTAX"); 			// 과세여부
		String pay_taxtotal = request.getParameter("PCD_PAY_TAXTOTAL"); 	// 부가세(복합과세 적용 시)

		try {
			// 정기결제 재결제 요청 전송
			JSONObject bilingObj = new JSONObject();

			bilingObj.put("PCD_CST_ID", cstId);
			bilingObj.put("PCD_CUST_KEY", custKey);
			bilingObj.put("PCD_AUTH_KEY", authKey);
			bilingObj.put("PCD_PAY_TYPE", pay_type);
			bilingObj.put("PCD_PAYER_ID", payer_id);
			bilingObj.put("PCD_PAY_GOODS", pay_goods);
			bilingObj.put("PCD_SIMPLE_FLAG", "Y");
			bilingObj.put("PCD_PAY_TOTAL", pay_total);
			bilingObj.put("PCD_PAY_OID", pay_oid);
			bilingObj.put("PCD_PAYER_NO", payer_no);
			bilingObj.put("PCD_PAYER_NAME", payer_name);
			bilingObj.put("PCD_PAYER_HP", payer_hp);
			bilingObj.put("PCD_PAYER_EMAIL", payer_email);
			bilingObj.put("PCD_PAY_ISTAX", pay_istax);
			bilingObj.put("PCD_PAY_TAXTOTAL", pay_taxtotal);

			System.out.println(bilingObj.toString());

			URL url = new URL(bilingURL);
			HttpURLConnection con = (HttpURLConnection) url.openConnection();

			con.setRequestMethod("POST");
			con.setRequestProperty("content-type", "application/json");
			con.setRequestProperty("charset", "UTF-8");
			con.setRequestProperty("referer", "http://localhost:8080");
			con.setDoOutput(true);

			DataOutputStream wr = new DataOutputStream(con.getOutputStream());
			wr.write(bilingObj.toString().getBytes());
			wr.flush();
			wr.close();

			int responseCode = con.getResponseCode();
			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
			String inputLine;
			StringBuffer response = new StringBuffer();

			while ((inputLine = in.readLine()) != null) {
				response.append(inputLine);
			}

			in.close();

			jsonObject = (JSONObject) jsonParser.parse(response.toString());

		} catch (Exception e) {
			e.printStackTrace();
		}
		return jsonObject;
	}
}

 

 

>> 다시 말하지만 저의 코드가 아니기 때문에 이 글은 내려질 가능성이 있습니다.