열심히 끝까지
[API 사용] - 앱카드 결제 API(PAYAPP / PAYPLE) 본문
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;
}
}
>> 다시 말하지만 저의 코드가 아니기 때문에 이 글은 내려질 가능성이 있습니다.
'0607 팀 프로젝트 - 2Quals' 카테고리의 다른 글
[팀 프로젝트] - Spring을 이용한 팀 프로젝트(펫키지) 3일차 회의기록 (0) | 2022.10.04 |
---|---|
[팀 프로젝트] - Spring을 이용한 팀 프로젝트(펫키지) 2일차 회의기록 (0) | 2022.10.04 |
[팀 프로젝트] - Spring을 이용한 팀 프로젝트(펫키지) 1일차 회의기록 (0) | 2022.09.20 |
[팀 프로젝트] - 펫 상점(펫키지) 5일차 회의기록 및 완성본 (0) | 2022.09.13 |
[팀 프로젝트] - 펫 상점(펫키지) 4일차 회의 기록(더보기 버튼, 고객센터, itemSetVO 추가, 이메일 API & 문자 API) (0) | 2022.08.26 |