ソースを参照

Merge remote-tracking branch 'origin/xodud1202' into order

card007 5 年 前
コミット
3fdba3512f

+ 7 - 0
pom.xml

@@ -130,6 +130,13 @@
 			<scope>system</scope>
 			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/ConnectionKCP.jar</systemPath>
 		</dependency>
+		<dependency>
+			<groupId>kr.co.kcp.CT_CLI</groupId>
+			<artifactId>CT_CLI</artifactId>
+			<version>1.0</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/CtCli-1.0.6.jar</systemPath>
+		</dependency>
 		<!-- \\\ WEB-INF lib -->
 	</dependencies>
 	

+ 0 - 5
src/main/resources/config/application-locd.yml

@@ -58,17 +58,12 @@ download.path: /WIDE/workspace/files/data
 pg:
     kcp:
         log.dir: D:\\WIDE\\workspace\\files\\data\\style24\\logs\\front
-        user.type: PGNW
         gw:
             url: testpaygw.kcp.co.kr
             port: 8090
-        pa:
-            url: testpaygw.kcp.co.kr
-            port: 8090
         js.url: https://testpay.kcp.co.kr/plugin/payplus_web.jsp
         server: false
         site:
-            id: T0000
             cd: T0000
             key: 3grptw1.zW0GSo4PQdaGvsF__
             name: KCP TEST SHOP

BIN
src/main/webapp/WEB-INF/lib/CtCli-1.0.6.jar


+ 42 - 0
src/main/webapp/WEB-INF/views/mob/order/OrderNoMemberMob.html

@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org"
+	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	  layout:decorator="mob/common/layout/DefaultLayoutMob">
+
+<script type="text/javascript" th:src="${@environment.getProperty('pg.kcp.js.url')}" src=""></script>
+<script type="text/javascript" src="/ux/pc/js/payment.js"></script>
+<script type="text/javascript">
+	$(document).on("click", "#buyBtn", function() {
+		$.ajax({
+			type: "POST",
+			url : '/order/create/preOrder',
+			dataType : 'html',
+			data : {
+				pgGb		: "KCP"
+				, payMeans	: "G014_30"
+				, ordNo		: "5"
+				, goodsNm	: "상품 테스트"
+				, payAmt	: "1233"
+				, ordNm		: "이태영"
+				, ordEmail	: "xodud1202@naver.com"
+				, ordTelno	: "02-0000-0000"
+				, ordPhnno	: "010-7111-0000"
+			},
+			error : function(e) {
+				alert(3);
+			},
+			success : function(result) {
+				$("#order_info").html(result);
+				jsf__pay(document.order_info);
+			}
+		});
+	});
+</script>
+
+
+
+<form id="order_info" name="order_info" method="post" action="/order/pay/result/response" ></form>
+
+
+
+</html>

+ 113 - 0
src/main/webapp/WEB-INF/views/mob/pg/kcpOrderMob.html

@@ -0,0 +1,113 @@
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+<meta http-equiv="Pragma" content="no-cache">
+<meta http-equiv="Expires" content="-1">
+	<!-- 페이코 송부 정보 -->
+	<th:block th:if="${!#strings.isEmpty(payment.paycoDirect)}">
+		<input type="hidden" name="payco_direct"	th:value="${payment.paycoDirect}" />
+		<input type="hidden" name="pay_mthod"		th:value="${payment.payMthod}" />
+	</th:block>
+
+	<!-- 주문 데이터 -->
+	<input type="hidden" name="pgGb"			th:value="${payment.pgGb}" />
+	<input type="hidden" name="payMeans"		th:value="${payment.payMeans}" />
+
+	<input type="hidden" name="encoding_trans"	value="UTF 8" />	<!-- 추가 인코딩 네임은 대문자 -->
+	<input type="hidden" name="PayUrl"			value="" />			<!-- 주문페이지 소스에 이미 PayUrl 이 input 값에 있다면 추가하지 않습니다 -->
+
+	<input type="hidden" name="req_tx"			th:value="${payment.reqTx}" />		<!-- 요청의 종류를 구분하는 변수 결제요청페이지의 경우 ‘pay’로 설정 -->
+	<input type="hidden" name="shop_name"		th:value="${payment.siteName}" />	<!-- 상점이름(영문으로 작성권장) -->
+	<input type="hidden" name="site_cd"			th:value="${payment.siteCd}" />		<!-- 필수, 상점코드 -->
+	<input type="hidden" name="currency"		th:value="${payment.currency}" />	<!-- 필수, 원화 : WON / 달러 : USD -->
+	<input type="hidden" name="approval_key"	th:value="${pament.approvalKey}" id="approval" />	<!-- 결제등록 키 -->
+	<input type="hidden" name="escw_used"		value="N">	<!-- 인증시 필요한 파라미터(변경불가)-->
+	<input type="hidden" name="pay_method"		th:value="${payment.payMethod}" />	<!-- 필수, 결제수단코드(신용카드 : 100000000000, 계좌이체 : 010000000000, 가상계좌 : 001000000000, 포인트 : 000100000000, 휴대폰 : 000010000000, 상품권 : 000000001000, ARS : 000000000010) -->
+	<input type="hidden" name="van_code"		value="">							<!-- 인증시 필요한 파라미터(변경불가)-->
+	<input type="hidden" name="quotaopt"		th:value="${payment.quotaopt}"/>	<!-- 최대 할부 개월 수(0 ~ 18까지 설정 가능) -->
+	<input type="hidden" name="ipgm_date"		value=""/>							<!-- 가상계좌설정 -->
+	<input type="hidden" name="Ret_URL"			value="/order/form">				<!-- 리턴 URL (kcp와 통신후 결제를 요청할 수 있는 암호화 데이터를 전송 받을 가맹점의 주문페이지 URL) -->
+	<input type="hidden" name="tablet_size"		value="1.0">						<!-- 화면 크기 조정 -->
+	<input type="hidden" name="response_type"	value="TEXT"/>						<!-- 결제 정보 등록시 응답 타입 ( 필드가 없거나 값이 '' 일경우 TEXT, 값이 XML 또는 JSON 지원 -->
+	<input type="hidden" name="PayUrl"			value="" id="PayUrl"/>				<!-- 결제 정보 등록시 응답 타입 ( 필드가 없거나 값이 '' 일경우 TEXT, 값이 XML 또는 JSON 지원 -->
+	<input type="hidden" name="traceNo"			value="" id="traceNo"/>				<!-- 결제 정보 등록시 응답 타입 ( 필드가 없거나 값이 '' 일경우 TEXT, 값이 XML 또는 JSON 지원 -->
+	<input type="hidden" name="res_cd"			value=""/>							<!-- 결과코드 -->
+	<input type="hidden" name="res_msg"			value=""/>							<!-- 결과메세지 -->
+	<input type="hidden" name="ordr_idxx"		th:value="${payment.ordrIdxx}" />	<!-- 필수, 상점 관리 주문번호 (유니크한 값 설정 권장) -->
+	<input type="hidden" name="good_mny"		th:value="${payment.goodMny}" />	<!-- 필수, 주문요청금액 (※ 화폐단위가 ‘USD’ 일 경우, Cent까지 설정 ex ) $10.55 일 경우 콤마를 뺀 1055, $100 일 경우 10000로 설정 -->
+	<input type="hidden" name="good_name"		th:value="${payment.goodName}" />	<!-- 필수, 상품명 -->
+	<input type="hidden" name="buyr_name"		th:value="${payment.buyrName}" />	<!-- 필수, 주문자 이름 -->
+	<input type="hidden" name="buyr_mail"		th:value="${payment.buyrMail}" />	<!-- 선택, 주문자 이메일 -->
+	<input type="hidden" name="buyr_tel1"		th:value="${payment.buyrTel1}" />	<!-- 선택, 주문자 전화번호 -->
+	<input type="hidden" name="buyr_tel2"		th:value="${payment.buyrTel2}" />	<!-- 필수, 주문자 휴대폰번호 -->
+	<input type="hidden" name="enc_info"		value=""/>
+	<input type="hidden" name="enc_data"		value=""/>
+	<input type="hidden" name="use_pay_method"	value=""/>
+	<input type="hidden" name="cash_yn"         value=""/>
+	<input type="hidden" name="cash_tr_code"	value=""/>
+
+
+
+
+	<input type="hidden" name="shop_user_id"	th:value="${payment.shopUserId}" />	<!-- 필수, 쇼핑몰회원ID 기관에 따라 RM 조치를 위해 쇼핑몰 관리 ID를 필수로 요청 -->
+
+
+
+
+
+	<!-- 신용카드 정보 -->
+
+
+	<!-- 가상계좌 설정 -->
+
+
+	<!-- 리턴 URL (kcp와 통신후 결제를 요청할 수 있는 암호화 데이터를 전송 받을 가맹점의 주문페이지 URL) -->
+	<input type="hidden" name="Ret_URL"         value="<%=url%>">
+	<!-- 화면 크기조정 -->
+	<input type="hidden" name="tablet_size"     value="<%=tablet_size%>">
+
+	<!-- 무통장입금 정보 -->
+	<!-- <input type="hidden" name="vcnt_expire_term"	th:value="${payment.vcntExpireTerm}"/> -->	<!-- 무통장입금 유효기간 설정 (3 = 3일) -->
+
+	<!-- 2012년 8월 18일 전자상거래법 개정 관련 설정 부분 -->
+	<!-- 제공 기간 설정 0:일회성 1:기간설정(ex 1:2012010120120131)  -->
+	<input type="hidden" name="good_expr"		th:value="${payment.goodExpr}" />
+
+	<!-- 표준웹 설정 정보입니다(변경 불가) -->
+	<input type="hidden" name="module_type"		th:value="${payment.moduleType}" />
+
+	<!--
+			※ 필 수
+			필수 항목 : 표준웹에서 값을 설정하는 부분으로 반드시 포함되어야 합니다
+			값을 설정하지 마십시오
+	-->
+
+
+	<input type="hidden" name="ret_pay_method"  value=""/>
+	<input type="hidden" name="tran_cd"         value=""/>
+
+
+	<!-- 주문정보 검증 관련 정보 : 표준웹 에서 설정하는 정보입니다 -->
+	<input type="hidden" name="ordr_chk"        value=""/>
+
+	<!--  현금영수증 관련 정보 : 표준웹 에서 설정하는 정보입니다 -->
+	<input type="hidden" name="cash_yn"         value=""/>
+	<input type="hidden" name="cash_tr_code"    value=""/>
+	<input type="hidden" name="cash_id_info"    value=""/>
+
+	<!-- 카카오페이 관련 정보 -->
+	<input type="hidden" name="pgTid" th:value="${payment.pgTid}"/>
+	<input type="hidden" name="partnerOrderId" th:value="${payment.partnerOrderId}"/>
+	<input type="hidden" name="partnerUserId" th:value="${payment.partnerUserId}"/>
+	<input type="hidden" name="pgToken" value=""/>
+	<input type="hidden" name="nextRedirectAppUrl" th:value="${payment.nextRedirectAppUrl}"/>
+	<input type="hidden" name="nextRedirectMobileUrl" th:value="${payment.nextRedirectMobileUrl}"/>
+	<input type="hidden" name="nextRedirectPcUrl" th:value="${payment.nextRedirectPcUrl}"/>
+	<input type="hidden" name="androidAppScheme" th:value="${payment.androidAppScheme}"/>
+	<input type="hidden" name="iosAppScheme" th:value="${payment.iosAppScheme}"/>
+
+	<!-- 네이버페이 관련 정보 -->
+	<input type="hidden" name="reserveId" th:value="${payment.reserveId}"/>
+	<input type="hidden" name="paymentId" value=""/>
+
+</html>

+ 210 - 0
src/main/webapp/ux/mo/js/payment.js

@@ -0,0 +1,210 @@
+var ajax_flag = true;
+var req01_AJAX;
+var PayUrl="";
+
+function initRequest() {
+	if ( window.XMLHttpRequest ) {
+		return new XMLHttpRequest();
+	} else if ( window.ActiveXObject ) {
+		return new ActiveXObject( "Microsoft.XMLHTTP" );
+	}
+}
+
+function sendRequest( url ) {
+	req01_AJAX = null;
+	req01_AJAX = initRequest();
+	
+	if ( req01_AJAX ) {
+		req01_AJAX.onreadystatechange = process_AJAX;
+		req01_AJAX.open( "POST", url, true );
+		req01_AJAX.send( null );
+	}
+}
+
+function kcp_AJAX() {
+	// 해당 소스는 jQuery를 사용 하지 않는 업체에서도 작동 할수 있도록 구현되었습니다.
+	// 이 부분은 javascript로 구현시 jQuery를 이용하면 더욱 쉽게 구현 할수 있습니다.
+	// 또는
+	// javascript를 통한 ajax 통신을 할 필요 없이 소스내에 order_approval.jsp를 연동해서 사용 하셔도 관계 없으며
+	// 제공되는 jar 파일에 직접 전달된 데이터를 사용할수 있도록 method가 구현 되어 있습니다.
+	if(ajax_flag) {
+		var url    = "order_approval.jsp";
+		var form = document.order_info;
+		var params = "?site_cd=" + form.site_cd.value
+			+ "&ordr_idxx=" + form.ordr_idxx.value
+			+ "&good_mny=" + form.good_mny.value
+			+ "&pay_method=" + form.pay_method.value
+			+ "&escw_used=" + form.escw_used.value
+			+ "&good_name=" + form.good_name.value
+			+ "&response_type=" + form.response_type.value
+			+ "&Ret_URL=" + form.Ret_URL.value;
+		sendRequest( url + params );
+		
+		ajax_flag = false;
+	} else {
+		alert("통신 중입니다. 잠시만 기다려 주세요.");
+	}
+	
+}
+
+function process_AJAX() {
+	if ( req01_AJAX.readyState == 4 ) {		//READY_STATE_COMPLETE = 4
+		if ( req01_AJAX.status == 200 ) {
+			if ( req01_AJAX.responseText != null ) {
+				// 해당 소스는 jQuery를 사용 하지 않는 업체에서도 작동 할수 있도록 구현되었습니다.
+				// 이 부분은 javascript로 구현시 jQuery를 이용하면 더욱 쉽게 구현 할수 있습니다.
+				// 또는
+				// javascript를 통한 ajax 통신을 할 필요 없이 소스내에 order_approval.jsp를 연동해서 사용 하셔도 관계 없으며
+				// 제공되는 jar 파일에 직접 전달된 데이터를 사용할수 있도록 method가 구현 되어 있습니다.
+				try {
+					var form = document.order_info;
+					
+					if( form.response_type.value == "JSON" ) {
+						StateChangeForJSON( req01_AJAX ); // JSON 방식일 경우
+					} else if( form.response_type.value == "XML" ) {
+						StateChangeForXML( req01_AJAX ); // XML 방식일 경우
+					} else if( form.response_type.value == "TEXT" || form.response_type.value == "" ) {
+						StateChangeForText( req01_AJAX ); // TEXT 방식일 경우
+					}
+				} catch( e ) {
+					StateChangeForText( req01_AJAX ); // TEXT 방식일 경우
+				}
+			}
+		} else {
+			ajax_flag=true;
+			alert( req01_AJAX.responseJSON );
+		}
+	}
+}
+
+function StateChangeForText( req ) {
+	var txt = req01_AJAX.responseText.split( ":" );
+	
+	if( txt[0].replace(/^\s*/,'').replace(/\s*$/,'') == '0000' ) {
+		document.getElementById( "approval" ).value = txt[1].replace(/^\s*/,'').replace(/\s*$/,'');
+		// 아래 alert는 삭제 해도됨
+		alert("성공적으로 거래가 등록 되었습니다.");
+		PayUrl = decodeURIComponent( txt[2].replace(/^\s*/,'').replace(/\s*$/,'') );
+		
+		document.getElementById( "traceNo" ).value = txt[3].replace(/^\s*/,'').replace(/\s*$/,'');
+		
+		if( txt.length == 6 )
+			document.getElementById( "PayUrl"  ).value = txt[5].replace(/^\s*/,'').replace(/\s*$/,'');
+		
+		call_pay_form();
+	} else {
+		var res_msg = txt[2].replace(/^\s*/,'').replace(/\s*$/,'');
+		
+		ajax_flag=true;
+		alert("실패 되었습니다.[" + res_msg + "]");
+	}
+}
+
+function StateChangeForXML( req ) {
+	var xmlDoc = ( new DOMParser() ).parseFromString( req.responseText.replace(/^\s*/,'').replace(/\s*$/,''), "text/xml" ).documentElement;
+	
+	var x = xmlDoc.getElementsByTagName( "data" );
+	
+	if( x[0].getElementsByTagName( "Code" )[0].childNodes[0].nodeValue == '0000' ) {
+		document.getElementById( "approval" ).value = x[0].getElementsByTagName( "approvalKey" )[0].childNodes[0].nodeValue;
+		// 아래 alert는 삭제 해도됨
+		alert("성공적으로 거래가 등록 되었습니다.");
+		PayUrl = x[0].getElementsByTagName( "PayUrl" )[0].childNodes[0].nodeValue;
+		
+		document.getElementById( "traceNo" ).value = x[0].getElementsByTagName( "traceNo"     )[0].childNodes[0].nodeValue;
+		
+		try{
+			document.getElementById( "PayUrl"  ).value = x[0].getElementsByTagName( "request_URI" )[0].childNodes[0].nodeValue;
+		}catch(e){}
+		
+		call_pay_form();
+	} else {
+		ajax_flag=true;
+		
+		alert("실패 되었습니다.[" + x[0].getElementsByTagName( "Message" )[0].childNodes[0].nodeValue + "]");
+	}
+}
+
+
+function StateChangeForJSON( xmlHttpRequest ) {
+	var json = eval('('+ xmlHttpRequest.responseText +')');
+	
+	if( json.Code == '0000' ) {
+		document.getElementById( "approval" ).value = json.approvalKey;
+		// 아래 alert는 삭제 해도됨
+		alert("성공적으로 거래가 등록 되었습니다.");
+		PayUrl = json.PayUrl;
+		
+		document.getElementById( "PayUrl"  ).value = json.request_URI;
+		document.getElementById( "traceNo" ).value = json.traceNo;
+		
+		call_pay_form();
+	} else {
+		ajax_flag=true;
+		
+		alert("실패 되었습니다.[" + json.Message + "]");
+	}
+}
+
+/* kcp web 결제창 호츨 (변경불가) */
+function call_pay_form() {
+	var v_frm = document.order_info;
+	
+	if(v_frm.encoding_trans == undefined) {
+		v_frm.action = PayUrl;
+	} else {
+		if(v_frm.encoding_trans.value == "UTF-8") {
+			v_frm.action = PayUrl.substring(0, PayUrl.lastIndexOf("/")) + "/jsp/encodingFilter/encodingFilter.jsp";
+			v_frm.payUrl.value = PayUrl;
+		} else {
+			v_frm.action = PayUrl;
+		}
+	}
+	
+	if (v_frm.Ret_URL.value == "") {
+		/* Ret_URL값은 현 페이지의 URL 입니다. */
+		alert("연동시 Ret_URL을 반드시 설정하셔야 됩니다.");
+		return false;
+	} else {
+		v_frm.submit();
+	}
+}
+
+/* kcp 통신을 통해 받은 암호화 정보 체크 후 결제 요청 (변경불가) */
+function chk_pay() {
+	self.name = "tar_opener";
+	var pay_form = document.pay_form;
+	
+	if (pay_form.res_cd.value == "3001" ) {
+		alert("사용자가 취소하였습니다.");
+		pay_form.res_cd.value = "";
+	}
+	
+	if (pay_form.enc_info.value)
+		pay_form.submit();
+}
+
+var isMobile = {
+	Android: function() {
+		return navigator.userAgent.match(/Android/i);
+	},
+	BlackBerry: function() {
+		return navigator.userAgent.match(/BlackBerry/i);
+	},
+	iOS: function() {
+		return navigator.userAgent.match(/iPhone|iPad|iPod/i);
+	},
+	Opera: function() {
+		return navigator.userAgent.match(/Opera Mini/i);
+	},
+	Windows: function() {
+		return navigator.userAgent.match(/IEMobile/i);
+	},
+	any: function() {
+		return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
+	}
+};
+
+if( isMobile.any() )
+	document.getElementById("cssLink").setAttribute("href", controlCss);
+