PC 카카오페이 추가

This commit is contained in:
chicpro
2015-09-15 18:05:29 +09:00
parent 508dbe35ca
commit 7c86e41701
16 changed files with 1403 additions and 10 deletions

View File

@ -102,6 +102,16 @@ if(!isset($default['de_easy_pay_use'])) {
sql_query(" ALTER TABLE `{$g5['g5_shop_default_table']}`
ADD `de_easy_pay_use` tinyint(4) NOT NULL DEFAULT '0' AFTER `de_iche_use` ", true);
}
// 카카오페이 필드 추가
if(!isset($default['de_kakaopay_mid'])) {
sql_query(" ALTER TABLE `{$g5['g5_shop_default_table']}`
ADD `de_kakaopay_mid` varchar(255) NOT NULL DEFAULT '' AFTER `de_tax_flag_use`,
ADD `de_kakaopay_key` varchar(255) NOT NULL DEFAULT '' AFTER `de_kakaopay_mid`,
ADD `de_kakaopay_enckey` varchar(255) NOT NULL DEFAULT '' AFTER `de_kakaopay_key`,
ADD `de_kakaopay_hashkey` varchar(255) NOT NULL DEFAULT '' AFTER `de_kakaopay_enckey`,
ADD `de_kakaopay_cancelpwd` varchar(255) NOT NULL DEFAULT '' AFTER `de_kakaopay_hashkey` ", true);
}
?>
<form name="fconfig" action="./configformupdate.php" onsubmit="return fconfig_check(this)" method="post" enctype="MULTIPART/FORM-DATA">
@ -679,6 +689,41 @@ if(!isset($default['de_easy_pay_use'])) {
<input type="text" name="de_inicis_admin_key" value="<?php echo $default['de_inicis_admin_key']; ?>" id="de_inicis_admin_key" class="frm_input" size="5" maxlength="4">
</td>
</tr>
<tr>
<th scope="row"><label for="de_kakaopay_mid">카카오페이 상점 MID</label></th>
<td>
<?php echo help("카카오페이로 부터 발급 받으신 상점아이디(MID) 10자리 중 첫 KHSIR과 끝 m 을 제외한 영문4자리를 입력 합니다. 예) KHSIRtestm"); ?>
<span class="sitecode">KHSIR</span> <input type="text" name="de_kakaopay_mid" value="<?php echo $default['de_kakaopay_mid']; ?>" id="de_kakaopay_mid" class="frm_input" size="5" maxlength="4"> <span class="sitecode">m</span>
</td>
</tr>
<tr>
<th scope="row"><label for="de_kakaopay_key">카카오페이 상점 서명키</label></th>
<td>
<?php echo help("카카오페이로 부터 발급 받으신 상점 서명키를 입력합니다."); ?>
<input type="text" name="de_kakaopay_key" value="<?php echo $default['de_kakaopay_key']; ?>" id="de_kakaopay_key" class="frm_input" size="90">
</td>
</tr>
<tr>
<th scope="row"><label for="de_kakaopay_enckey">카카오페이 상점 EncKey</label></th>
<td>
<?php echo help("카카오페이로 부터 발급 받으신 상점 인증 전용 EncKey를 입력합니다."); ?>
<input type="text" name="de_kakaopay_enckey" value="<?php echo $default['de_kakaopay_enckey']; ?>" id="de_kakaopay_enckey" class="frm_input" size="20">
</td>
</tr>
<tr>
<th scope="row"><label for="de_kakaopay_hashkey">카카오페이 상점 HashKey</label></th>
<td>
<?php echo help("카카오페이로 부터 발급 받으신 상점 인증 전용 HashKey를 입력합니다."); ?>
<input type="text" name="de_kakaopay_hashkey" value="<?php echo $default['de_kakaopay_hashkey']; ?>" id="de_kakaopay_hashkey" class="frm_input" size="20">
</td>
</tr>
<tr>
<th scope="row"><label for="de_kakaopay_cancelpwd">카카오페이 결제취소 비밀번호</label></th>
<td>
<?php echo help("카카오페이 상점관리자에서 설정하신 취소 비밀번호를 입력합니다.<br>입력하신 비밀번호와 상점관리자에서 설정하신 비밀번호가 일치하지 않으면 취소가 되지 않습니다."); ?>
<input type="text" name="de_kakaopay_cancelpwd" value="<?php echo $default['de_kakaopay_cancelpwd']; ?>" id="de_kakaopay_cancelpwd" class="frm_input" size="20">
</td>
</tr>
<tr>
<th scope="row">에스크로 사용</th>
<td>
@ -690,9 +735,9 @@ if(!isset($default['de_easy_pay_use'])) {
</td>
</tr>
<tr>
<th scope="row">신용카드 결제테스트</th>
<th scope="row">결제 테스트</th>
<td>
<?php echo help("신용카드를 테스트 하실 경우에 체크하세요. 결제단위 최소 1,000원"); ?>
<?php echo help("PG사의 결제 테스트 하실 경우에 체크하세요. 결제단위 최소 1,000원"); ?>
<input type="radio" name="de_card_test" value="0" <?php echo $default['de_card_test']==0?"checked":""; ?> id="de_card_test1">
<label for="de_card_test1">실결제 </label>
<input type="radio" name="de_card_test" value="1" <?php echo $default['de_card_test']==1?"checked":""; ?> id="de_card_test2">

View File

@ -176,6 +176,11 @@ $sql = " update {$g5['g5_shop_default_table']}
de_hp_use = '{$_POST['de_hp_use']}',
de_escrow_use = '{$_POST['de_escrow_use']}',
de_tax_flag_use = '{$_POST['de_tax_flag_use']}',
de_kakaopay_mid = '{$_POST['de_kakaopay_mid']}',
de_kakaopay_key = '{$_POST['de_kakaopay_key']}',
de_kakaopay_enckey = '{$_POST['de_kakaopay_enckey']}',
de_kakaopay_hashkey = '{$_POST['de_kakaopay_hashkey']}',
de_kakaopay_cancelpwd = '{$_POST['de_kakaopay_cancelpwd']}',
de_member_reg_coupon_use = '{$_POST['de_member_reg_coupon_use']}',
de_member_reg_coupon_term = '{$_POST['de_member_reg_coupon_term']}',
de_member_reg_coupon_price = '{$_POST['de_member_reg_coupon_price']}',

View File

@ -325,6 +325,11 @@ CREATE TABLE IF NOT EXISTS `g5_shop_default` (
`de_hp_use` tinyint(4) NOT NULL DEFAULT '0',
`de_escrow_use` tinyint(4) NOT NULL DEFAULT '0',
`de_tax_flag_use` tinyint(4) NOT NULL DEFAULT '0',
`de_kakaopay_mid` varchar(255) NOT NULL DEFAULT '',
`de_kakaopay_key` varchar(255) NOT NULL DEFAULT '',
`de_kakaopay_enckey` varchar(255) NOT NULL DEFAULT '',
`de_kakaopay_hashkey` varchar(255) NOT NULL DEFAULT '',
`de_kakaopay_cancelpwd` varchar(255) NOT NULL DEFAULT '',
`de_member_reg_coupon_use` tinyint(4) NOT NULL DEFAULT '0',
`de_member_reg_coupon_term` int(11) NOT NULL DEFAULT '0',
`de_member_reg_coupon_price` int(11) NOT NULL DEFAULT '0',

View File

@ -0,0 +1,3 @@
<?php
include_once('../../common.php');
?>

141
shop/kakaopay/getTxnId.php Normal file
View File

@ -0,0 +1,141 @@
<?php
include_once('./_common.php');
include_once(G5_LIB_PATH.'/json.lib.php');
/**
* 2014.12.02 : 인증요청 송신 전문 외 항목 제거
*/
include(G5_SHOP_PATH.'/kakaopay/incKakaopayCommon.php');
include(G5_SHOP_PATH.'/kakaopay/lgcns_KMpay.php');
function KMPayRequest($key) {
return (isset($_REQUEST[$key])?$_REQUEST[$key]:"");
}
// 로그 저장 위치 지정
$kmFunc = new kmpayFunc($LogDir);
$kmFunc->setPhpVersion($phpVersion);
// TXN_ID를 요청하기 위한 PARAMETERR
$REQUESTDEALAPPROVEURL = KMPayRequest("requestDealApproveUrl"); //인증 요청 경로
$PR_TYPE = KMPayRequest("prType"); //결제 요청 타입
$MERCHANT_ID = KMPayRequest("MID"); //가맹점 ID
$MERCHANT_TXN_NUM = KMPayRequest("merchantTxnNum"); //가맹점 거래번호
$channelType = KMPayRequest("channelType");
$PRODUCT_NAME = KMPayRequest("GoodsName"); //상품명
$AMOUNT = KMPayRequest("Amt"); //상품금액(총거래금액) (총거래금액 = 공급가액 + 부가세 + 봉사료)
$CURRENCY = KMPayRequest("currency"); //거래통화(KRW/USD/JPY 등)
$RETURN_URL = KMPayRequest("returnUrl"); //결제승인결과전송URL
$CERTIFIED_FLAG = KMPayRequest("CERTIFIED_FLAG"); //가맹점 인증 구분값 ("N","NC")
$OFFER_PERIOD_FLAG = KMPayRequest("OFFER_PERIOD_FLAG"); //상품제공기간 플래그
$OFFER_PERIOD = KMPayRequest("OFFER_PERIOD"); //상품제공기간
//무이자옵션
$NOINTYN = KMPayRequest("noIntYN"); //무이자 설정
$NOINTOPT = KMPayRequest("noIntOpt"); //무이자 옵션
$MAX_INT =KMPayRequest("maxInt"); //최대할부개월
$FIXEDINT = KMPayRequest("fixedInt"); //고정할부개월
$POINT_USE_YN = KMPayRequest("pointUseYn"); //카드사포인트사용여부
$POSSICARD = KMPayRequest("possiCard"); //결제가능카드설정
$BLOCK_CARD = KMPayRequest("blockCard"); //금지카드설정
// ENC KEY와 HASH KEY는 가맹점에서 생성한 KEY 로 SETTING 한다.
$merchantEncKey = KMPayRequest("merchantEncKey");
$merchantHashKey = KMPayRequest("merchantHashKey");
$hashTarget = $MERCHANT_ID.$MERCHANT_TXN_NUM.str_pad($AMOUNT,7,"0",STR_PAD_LEFT);
// payHash 생성
$payHash = strtoupper(hash("sha256", $hashTarget.$merchantHashKey, false));
//json string 생성
$strJsonString = new JsonString($LogDir);
$strJsonString->setValue("PR_TYPE", $PR_TYPE);
$strJsonString->setValue("channelType", $channelType);
$strJsonString->setValue("MERCHANT_ID", $MERCHANT_ID);
$strJsonString->setValue("MERCHANT_TXN_NUM", $MERCHANT_TXN_NUM);
$strJsonString->setValue("PRODUCT_NAME", $PRODUCT_NAME);
$strJsonString->setValue("AMOUNT", $AMOUNT);
$strJsonString->setValue("CURRENCY", $CURRENCY);
$strJsonString->setValue("CERTIFIED_FLAG", $CERTIFIED_FLAG);
$strJsonString->setValue("OFFER_PERIOD_FLAG", $OFFER_PERIOD_FLAG);
$strJsonString->setValue("OFFER_PERIOD", $OFFER_PERIOD);
$strJsonString->setValue("NO_INT_YN", $NOINTYN);
$strJsonString->setValue("NO_INT_OPT", $NOINTOPT);
$strJsonString->setValue("MAX_INT", $MAX_INT);
$strJsonString->setValue("FIXED_INT", $FIXEDINT);
$strJsonString->setValue("POINT_USE_YN", $POINT_USE_YN);
$strJsonString->setValue("POSSI_CARD", $POSSICARD);
$strJsonString->setValue("BLOCK_CARD", $BLOCK_CARD);
$strJsonString->setValue("PAYMENT_HASH", $payHash);
// 결과값을 담는 부분
$resultCode = "";
$resultMsg = "";
$txnId = "";
$merchantTxnNum = "";
$prDt = "";
$strValid = "";
// Data 검증
$dataValidator = new KMPayDataValidator($strJsonString->getArrayValue());
$strValid = $dataValidator->resultValid;
if (strlen($strValid) > 0) {
$arrVal = explode(",", $strValid);
if (count($arrVal) == 3) {
$resultCode = $arrVal[1];
$resultMsg = $arrVal[2];
} else {
$resultCode = $strValid;
$resultMsg = $strValid;
}
}
// Data에 이상 없는 경우
if (strlen($strValid) == 0) {
// CBC 암호화
$paramStr = $strJsonString->getJsonString();
$kmFunc->writeLog("Request");
$kmFunc->writeLog($paramStr);
$kmFunc->writeLog($strJsonString->getArrayValue());
$encryptStr = $kmFunc->parameterEncrypt($merchantEncKey, $paramStr);
$payReqResult = $kmFunc->connMPayDLP($REQUESTDEALAPPROVEURL, $MERCHANT_ID, $encryptStr);
$resultString = $kmFunc->parameterDecrypt($merchantEncKey, $payReqResult);
$resultJSONObject = new JsonString($LogDir);
if (substr($resultString, 0, 1) == "{") {
$resultJSONObject->setJsonString($resultString);
$resultCode = $resultJSONObject->getValue("RESULT_CODE");
$resultMsg = $resultJSONObject->getValue("RESULT_MSG");
if ($resultCode == "00") {
$txnId = $resultJSONObject->getValue("TXN_ID");
$merchantTxnNum = $resultJSONObject->getValue("MERCHANT_TXN_NUM");
$prDt = $resultJSONObject->getValue("PR_DT");
}
}
$kmFunc->writeLog("Result");
$kmFunc->writeLog($resultString);
$kmFunc->writeLog($resultJSONObject->getArrayValue());
}
$result = array();
$result = array(
'resultCode' => $resultCode,
'resultMsg' => $resultMsg,
'txnId' => $txnId,
'prDt' => $prDt
);
die(json_encode($result));
?>

View File

@ -0,0 +1,43 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
//인증,결제 및 웹 경로
$CNSPAY_WEB_SERVER_URL = 'https://kmpay.lgcns.com:8443';
$targetUrl = 'https://kmpay.lgcns.com:8443';
$msgName = '/merchant/requestDealApprove.dev';
$CnsPayDealRequestUrl = 'https://pg.cnspay.co.kr:443';
if ($default['de_card_test']) {
$MID = 'cnstest25m';
$merchantEncKey = '10a3189211e1dfc6';
$merchantHashKey = '10a3189211e1dfc6';
$cancelPwd = '123456';
//가맹점서명키
$merchantKey = '33F49GnCMS1mFYlGXisbUDzVf2ATWCl9k3R++d5hDd3Frmuos/XLx8XhXpe+LDYAbpGKZYSwtlyyLOtS/8aD7A==';
} else {
$MID = 'KHSIR'.$default['de_kakaopay_mid'].'m';
$merchantEncKey = trim($default['de_kakaopay_enckey']);
$merchantHashKey = trim($default['de_kakaopay_hashkey']);
$cancelPwd = trim($default['de_kakaopay_cancelpwd']);
//가맹점서명키
$merchantKey = trim($default['de_kakaopay_cancelpwd']);
}
//버전
$phpVersion = 'PLP-0.1.1.3';
//로그 경로
$LogDir = G5_SHOP_PATH.'/kakaopay/log';
// TXN_ID를 가져오기 위해 세팅
$ediDate = date("YmdHis"); // 전문생성일시
$_REQUEST['PayMethod'] = 'KAKAOPAY';
$_REQUEST['CERTIFIED_FLAG'] = 'CN';
$_REQUEST['AuthFlg'] = '10';
$_REQUEST['currency'] = 'KRW';
$_REQUEST['MID'] = $MID;
$_REQUEST['merchantEncKey'] = $merchantEncKey;
$_REQUEST['merchantHashKey'] = $merchantHashKey;
$_REQUEST['requestDealApproveUrl'] = $targetUrl.$msgName;
?>

View File

@ -0,0 +1,76 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
include(G5_SHOP_PATH.'/kakaopay/incKakaopayCommon.php');
include(G5_SHOP_PATH.'/kakaopay/lgcns_CNSpay.php');
// 로그 저장 위치 지정
$connector = new CnsPayWebConnector($LogDir);
$connector->CnsActionUrl($CnsPayDealRequestUrl);
$connector->CnsPayVersion($phpVersion);
// 요청 페이지 파라메터 셋팅
$connector->setRequestData($_REQUEST);
// 추가 파라메터 셋팅
$connector->addRequestData("actionType", "PY0"); // actionType : CL0 취소, PY0 승인, CI0 조회
$connector->addRequestData("MallIP", $_SERVER['REMOTE_ADDR']); // 가맹점 고유 ip
$connector->addRequestData("CancelPwd", $cancelPwd);
//가맹점키 셋팅 (MID 별로 틀림)
$connector->addRequestData("EncodeKey", $merchantKey);
// 4. CNSPAY Lite 서버 접속하여 처리
$connector->requestAction();
// 5. 결과 처리
$buyerName = $_REQUEST["BuyerName"]; // 구매자명
$goodsName = $_REQUEST["GoodsName"]; // 상품명
// $buyerName = iconv("euc-kr", "utf-8", $connector->getResultData("BuyerName")); // 구매자명
// $goodsName = iconv("euc-kr", "utf-8", $connector->getResultData("GoodsName")); // 상품명
$resultCode = $connector->getResultData("ResultCode"); // 결과코드 (정상 :3001 , 그 외 에러)
$resultMsg = $connector->getResultData("ResultMsg"); // 결과메시지
$authDate = $connector->getResultData("AuthDate"); // 승인일시 YYMMDDHH24mmss
$authCode = $connector->getResultData("AuthCode"); // 승인번호
$payMethod = $connector->getResultData("PayMethod"); // 결제수단
$mid = $connector->getResultData("MID"); // 가맹점ID
$tid = $connector->getResultData("TID"); // 거래ID
$moid = $connector->getResultData("Moid"); // 주문번호
$amt = $connector->getResultData("Amt"); // 금액
$cardCode = $connector->getResultData("CardCode"); // 카드사 코드
$cardName = $connector->getResultData("CardName"); // 결제카드사명
$cardQuota = $connector->getResultData("CardQuota"); // 00:일시불,02:2개월
$cardInterest = $connector->getResultData("CardInterest"); // 무이자 여부 (0:일반, 1:무이자)
$cardCl = $connector->getResultData("CardCl"); // 체크카드여부 (0:일반, 1:체크카드)
$cardBin = $connector->getResultData("CardBin"); // 카드BIN번호
$cardPoint = $connector->getResultData("CardPoint"); // 카드사포인트사용여부 (0:미사용, 1:포인트사용, 2:세이브포인트사용)
$paySuccess = false; // 결제 성공 여부
$nonRepToken =$_REQUEST["NON_REP_TOKEN"]; //부인방지토큰값
$resultMsg = iconv("euc-kr", "utf-8", $resultMsg);
$cardName = iconv("euc-kr", "utf-8", $cardName);
/** 위의 응답 데이터 외에도 전문 Header와 개별부 데이터 Get 가능 */
if($payMethod == "CARD"){ //신용카드
if($resultCode == "3001") $paySuccess = true; // 결과코드 (정상 :3001 , 그 외 에러)
}
if($paySuccess) {
$tno = $tid;
$amount = $amt;
$app_time = '20'.$authDate;
$bank_name = $cardName;
$depositor = '';
$account = '';
$commid = $cardCode;
$mobile_no = '';
$app_no = $authCode;
$card_name = $cardName;
$pay_type = 'CARD';
$escw_yn = '0';
} else {
alert('[RESULT_CODE] : ' . $resultCode . '\\n[RESULT_MSG] : ' . $resultMsg);
}
?>

View File

@ -0,0 +1,465 @@
<?php
// 버전 1.0 : 2014/11/06 문석호, 최초 작성
/**
* 2014.12.02 : 1) 로깅 시 주요 정보 마스킹 처리, 2) PayMethod key check
*/
class CnsPayWebConnector {
private $LogPath = "";
private $ActionUrl = "";
private $cancelUrl = "";
private $phpVersion = "";
private $encodeKey = "";
private $requestData = array();
private $resultData = array();
public function CnsActionUrl($url) {
$this->ActionUrl = $url;
}
public function CnsPayVersion($ver) {
$this->phpVersion = $ver;
}
public function CnsPayWebConnector($LogDir) {
$this->cancelUrl = $this->ActionUrl."/lite/cancelProcess.jsp";
if (substr($LogDir, strlen($LogDir) - 1) == "/") {
$LogDir = substr($LogDir, 0, strlen($LogDir) - 1);
}
@mkdir($LogDir);
$this->LogPath = $LogDir."/";
}
public function setRequestData($request) {
try {
foreach (array_keys($request) as $key) {
$this->requestData[$key] = iconv("UTF-8", "EUC-KR", $request[$key]);
}
return "_TRUE_";
} catch (Exception $ex) {
$this->writeLog("setRequestData() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function addRequestData($key, $value) {
try {
$this->requestData[$key] = $value;
return "_TRUE_";
} catch (Exception $ex) {
$this->writeLog("addRequestData() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function getResultData($key) {
try {
if (!in_array($key, array_keys($this->resultData))) {
return "";
} else if ($key == "Amt") {
if ($this->resultData[$key] != null && $this->resultData[$key] != "null" && $this->resultData[$key] != "") {
return $this->resultData[$key];
} else {
return "0";
}
}
return $this->resultData[$key];
} catch (Exception $ex) {
$this->writeLog("getResultData() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
// 2014.12.02 추가 (check key in array)
private function getRequestData($key) {
if (array_key_exists($key, $this->requestData)) {
return $this->requestData[$key];
} else {
return "";
}
}
public function requestAction() {
$encodeKey = $this->requestData["EncodeKey"];
unset($this->requestData["EncodeKey"]);
try {
if ($this->requestData["actionType"] != "CL0" && $this->requestData["actionType"] != "CI0") {
if ($this->getRequestData("PayMethod") != "ESCROW") {
$this->requestData["TID"] = $this->generateTID($this->requestData["MID"], $this->getRequestData("PayMethod"));
}
}
$serviceUrl = $this->setActionType($this->requestData["actionType"], $this->getRequestData("PayMethod"));
if ($serviceUrl == "_FAIL_" || $serviceUrl == "CNSPAY_10") {
$this->resultData["ResultCode"] = "JL10";
$this->resultData["ResultMsg"] = "actionType 설정이 잘못되었습니다.";
return "_FAIL_";
}
$this->writeLog("Request");
$this->writeLog($this->requestData);
$requestMessage = $this->makeRequestText($this->requestData);
$resultMessage = $this->connectToServer($serviceUrl, $requestMessage);
$this->writeLog("Result");
// 2014.12.02 수신 전문 로깅 처리 제외
//$this->writeLog($resultMessage);
if ($resultMessage == "_FAIL_" || substr($resultMessage, 0, 4) == "FAIL") {
$resultCode = "";
$resultMsg = "";
$netCancelFlag = $this->requestNetCancel();
if ($netCancelFlag == "_TRUE_") {
$resultCode = "JL32";
$resultMsg = "PGWEB서버 통신중 오류가 발생하였습니다. (NET_CANCEL)";
} else { // netCancel 실패이면,
$resultCode = "JL33";
$resultMsg = "네트웍이 불안정으로 승인 실패하였습니다. 결제가 비 정상 처리 될 수 있으니 거래내역을 반드시 확인해주십시오.";
}
$this->resultData["ResultCode"] = $resultCode;
$this->resultData["ResultMsg"] = $resultMsg;
return "_FAIL_";
}
$resultMessage = $this->parseResult($resultMessage);
//$this->writeLog($this->resultData);
// 2014.12.02 로깅 시 주요 데이터 마스킹 처리
$this->writeLog($this->resultDataMask($this->resultData));
if ($resultMessage == "_FAIL_" || $resultMessage == "CNSPAY_41") {
$this->resultData["ResultCode"] = "JL41";
$this->resultData["ResultMsg"] = "응답전문이 없습니다.";
return "_FAIL_";
}
return "_TRUE_";
} catch (Exception $ex) {
$this->writeLog("requestAction() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
// 2014.12.02 결과 배열 마스킹
private function resultDataMask($strLogText) {
$arrMask = array();
if (is_array($strLogText)) {
foreach (array_keys($strLogText) as $key) {
$k = str_replace("\n", "", trim($key));
$arrMask[$k] = $this->requestMask($k, $strLogText[$key]);
}
return $arrMask;
} else {
return str_replace("\n", "", trim($strLogText));
}
}
// 2014.12.02 주요 정보 마스킹
private function requestMask ($name, $text) {
$value = str_replace("\n", "", trim($text));
if ($value == null || strlen(trim($value)) == 0) return "";
if ($name == "X_CARDNO" || $name == "realPan" || $name == "cardNo"
|| $name == "CardBin" || $name == "CardNo") {
return $this->masking($value, 6, true, false);
} else if ($name == "BuyerName" || $name == "buyerName") {
return $this->masking($value, 1, true, false);
} else if ($name == "BuyerEmail") {
return $this->masking($value, 6, false, true);
} else if ($name == "BuyerTel" || $name == "DstAddr") {
return $this->masking($value, 5, false, false);
} else if ($name == "BuyerAddr") {
return $this->masking($value, 6, true, false);
} else if ($name == "UserIP" || $name == "MallIP" || $name == "CancelPwd"
|| $name == "mallUserID" || $name == "MallUserID"
|| $name == "CancelIP") {
return $this->masking($value, mb_strlen(iconv('euc-kr','utf-8',$value), 'utf-8'), true, true);
} else {
return $value;
}
}
// 2014.12.02 마스킹 처리
private function masking($string, $num, $isLeftOrder, $beginMasking) {
if ( $string == null )
return "";
$res = "";
$res2 = "";
$sleng = 0;
$str = iconv('euc-kr','utf-8',$string);
$n = mb_strlen($str, 'utf-8');
if ( $num >= 1 ) {
if ( $n < $num ) {
$res = $str;
} else {
if($beginMasking) {
if ($isLeftOrder) {
$res = str_repeat("*", $n);
} else {
$sleng = $num;
$res2 = mb_substr($str, $sleng, $n, 'utf-8');
for ( $j = 0; $j < $sleng; $j++ ) {
$res .= "*";
}
$res .= $res2;
}
} else {
$sleng = $num;
$res2 = mb_substr($str, 0, $sleng, 'utf-8');
for ( $j = $sleng; $j < $n; $j++ ) {
$res .= "*";
}
$res = $res2 . $res;
}
}
} else {
$res = $str;
}
return iconv('utf-8','euc-kr',$res);
}
private function requestNetCancel() {
try {
// 예기치 못한 오류인경우 망상취소 시도.
$serviceUrl = $this->cancelUrl;
$this->requestData["actionType"] = "CL0";
$this->requestData["CancelIP"] = $this->requestData["MallIP"];
if ($this->requestData["Amt"] == null) {
return "_FAIL_";
} else {
if (is_numeric($this->requestData["Amt"])) {
$this->requestData["CancelAmt"] = $this->requestData["Amt"];
} else {
$this->requestData["CancelAmt"] = parameterDecrypt($encodeKey, $this->requestData["Amt"]);
}
}
$this->requestData["CancelMsg"] = "NICE_NET_CANCEL";
$this->requestData["PartialCancelCode"] = "0";
$this->requestData["NetCancelCode"] = "1";
if ($this->getRequestData("PayMethod") == "BILL" || $this->getRequestData("PayMethod") == "KAKAOPAY") $this->requestData["PayMethod"] = "CARD";
$requestMessage = makeRequestText($this->requestData);
$resultMessage = connectToServer($serviceUrl, $this->requestData);
if ($resultMessage == "_FAIL_" || substr($resultMessage, 0, 4) == "FAIL") {
$resultMessage = connectToServer2($serviceUrl, $this->requestData, 20);
if ($resultMessage == "_FAIL_" || substr($resultMessage, 0, 4) == "FAIL") {
//$this->resultData["ResultCode"] = "JL41";
//$this->resultData["ResultMsg"] = "망상취소 오류";
return "_FAIL_";
}
}
return "_TRUE_";
} catch (Exception $ex) {
$this->writeLog("requestNetCancel() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
private function generateTID($mid, $svcCd) {
try {
$iRandom = str_pad(rand(0, 9999), 4, "0", STR_PAD_LEFT);
return $mid.$this->getSvcCd($svcCd)."01".date("ymdHis").$iRandom;
} catch (Exception $ex) {
$this->writeLog("generateTID() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
private function getSvcCd($svcCd) {
try {
if ($svcCd == "CARD" || $svcCd == "BILL" || $svcCd == "KAKAOPAY") {
return "01";
} else if ($svcCd == "BANK") {
return "02";
} else if ($svcCd == "VBANK") {
return "03";
} else if ($svcCd == "CELLPHONE") {
return "05";
} else if ($svcCd == "MOBILE_BILLING") {
return "05";
} else if ($svcCd == "MOBILE_BILL") {
return "05";
}
return "00";
} catch (Exception $ex) {
$this->writeLog("getSvcCd() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
private function setActionType($type, $paymethod) {
try {
if ($type == null) return "CNSPAY_10";
$builder = $this->ActionUrl;
if ($type == "CL0") {
$builder = $builder."/lite/cancelProcess.jsp";
} else if ($type == "CI0") {
$builder = $builder."/lite/tidInfoProcess.jsp";
} else if ($type == "PY0") {
if ($paymethod == "CASHRCPT") { // 현금영수증인경우
$builder = $builder."/lite/cashReceiptProcess.jsp";
} else if ($paymethod == "BILL") {
$builder = $builder."/lite/billingProcess.jsp";
} else if ($paymethod == "BILLKEY") {
$builder = $builder."/lite/billkeyProcess.jsp";
} else if ($paymethod == "ESCROW") {
$builder = $builder."/lite/escrowProcess.jsp";
} else if ($paymethod == "MOBILE_AUTH") {
$builder = $builder."/lite/mobileAuth.jsp";
} else if ($paymethod == "MOBILE_BILL") {
$builder = $builder."/lite/mobileBill.jsp";
} else if ($paymethod == "MOBILE_BILLING") {
$builder = $builder."/lite/mobileBillingProcess.jsp";
} else if ($paymethod == "MOBILE_AUTH_REQ") {
$builder = $builder."/lite/mobileConfirmRequest.jsp";
} else if ($paymethod == "MOBILE_AUTH_RES") {
$builder = $builder."/lite/mobileConfirmResult.jsp";
} else if ($paymethod == "CARD_ARS") {
$builder = $builder."/lite/cardArsProcess.jsp";
} else if ($paymethod == "MOBILE_AUTH_NS") {
$builder = $builder."/lite/mobileAuth_NS.jsp";
} else if ($paymethod == "OM_SUB_INS") {
$builder = $builder."/lite/payproxy/subMallSetProcess.jsp";
} else if ($paymethod == "OM_SUB_PAY") {
$builder = $builder."/lite/payproxy/subMallIcheProcess.jsp";
} else if ($paymethod == "LOTTE_POINT") {
$builder = $builder."/api/checkLottePoint.jsp";
} else if ($paymethod == "HPBILLKEY") {
$builder = $builder."/lite/hpBillkeyProcess.jsp";
} else if ($paymethod == "HPCARD_AUTH") {
$builder = $builder."/lite/hpCardAuthProcess.jsp";
} else if ($paymethod == "HPCARD_BILLKEY") {
$builder = $builder."/lite/hpCardBillkeyProcess.jsp";
} else {
$builder = $builder."/lite/payProcess.jsp";
}
}
return $builder;
} catch (Exception $ex) {
$this->writeLog("setActionType() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
private function makeRequestText($reqData) {
try {
$strParameter = "";
foreach (array_keys($reqData) as $key) {
$strParameter = $strParameter.$key."=".urlencode($reqData[$key])."&";
}
$strParameter = substr($strParameter, 0, strlen($strParameter) - 1);
return $strParameter;
} catch (Exception $ex) {
$this->writeLog("makeRequestText() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
private function connectToServer($urlStr, $reqData) {
try {
return $this->connectToServer2($urlStr, $reqData, 15);
} catch (Exception $ex) {
$this->writeLog("connectToServer() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
private function connectToServer2($urlStr, $reqData, $timeout) {
try {
// php에 cURL 모듈 설치 필요(리눅스 - curl.so, 윈도우 - php_curl.dll 확장모듈 필요)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlStr); //접속할 URL 주소
//curl_setopt($ch, CURLOPT_PORT, 6464); //접속할 port, 주소에 있으므로 설정하지 않음
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 인증서 체크같은데 true 시 안되는 경우가 많다.
//curl_setopt($ch, CURLOPT_SSLVERSION, 3); // SSL 버젼 (https 접속시에 필요, 기본값으로 해야하므로 설정하지 않음)
curl_setopt($ch, CURLOPT_HEADER, 0); // 헤더 출력 여부
curl_setopt($ch, CURLOPT_POST, 1); // Post Get 접속 여부
curl_setopt($ch, CURLOPT_POSTFIELDS, $reqData); // Post 값 Get 방식처럼적는다.
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); // TimeOut 값
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 결과값을 받을것인지
curl_setopt($ch, CURLOPT_USERAGENT, $this->phpVersion); // 버전
$result = curl_exec($ch);
$errcode = curl_error($ch);
if ($errcode != "") $result = $errcode;
//$errcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//if ($errcode != 200) $result = $errcode;
curl_close($ch);
return $result;
} catch (Exception $ex) {
$this->writeLog("connectToServer2() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
private function parseResult($resultMessage) {
try {
if ($resultMessage == null) return "CNSPAY_41";
$parsedArr = explode("|", $resultMessage);
foreach ($parsedArr as $valueArr) {
$posit = strpos($valueArr, "=");
$key = substr($valueArr, 0, $posit);
$value = substr($valueArr, $posit + 1);
$this->resultData[$key] = $value;
}
return "_TRUE_";
} catch (Exception $ex) {
$this->writeLog("parseResult() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function writeLog($strLogText) {
$log_string = "";
if (is_array($strLogText)) {
$log_string = "[".date("Y/m/d H:i:s")."] \r\n";
foreach (array_keys($strLogText) as $key) {
$log_string = $log_string." [".$key."] => ".$strLogText[$key]."\r\n";
}
} else {
$log_string = "[".date("Y/m/d H:i:s")."] ".$strLogText."\r\n";
}
$log_filenm = $this->LogPath.date("Ymd")."_CNSpay.log";
$log_file = fopen($log_filenm, "a");
if($log_file == false) return;
flock($log_file, LOCK_EX);
//fwrite($log_file, $log_string);
fputs($log_file, $log_string);
fflush($log_file);
flock($log_file, LOCK_UN);
fclose($log_file);
}
public function makeDateString($sDate) {
try {
if ($sDate == null) return "";
$strValue = "";
if (strlen($sDate) == 12) {
$strValue = $strValue."20".substr($sDate, 0, 2)."-";
$strValue = $strValue.substr($sDate, 2, 2)."-";
$strValue = $strValue.substr($sDate, 4, 2). " ";
$strValue = $strValue.substr($sDate, 6, 2).":";
$strValue = $strValue.substr($sDate, 8, 2).":";
$strValue = $strValue.substr($sDate, 10, 2);
} else if (strlen($sDate) == 14) {
$strValue = $strValue.substr($sDate, 0, 4)."-";
$strValue = $strValue.substr($sDate, 4, 2)."-";
$strValue = $strValue.substr($sDate, 6, 2)." ";
$strValue = $strValue.substr($sDate, 8, 2).":";
$strValue = $strValue.substr($sDate, 10, 2).":";
$strValue = $strValue.substr($sDate, 12, 2);
} else if (strlen($sDate) == 8) {
$strValue = $strValue.substr($sDate, 0, 4)."-";
$strValue = $strValue.substr($sDate, 4, 2)."-";
$strValue = $strValue.substr($sDate, 6, 2);
} else {
$strValue = $sDate;
}
return $strValue;
} catch (Exception $ex) {
writeLog("makeDateString() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function makeHashInputString($salt) {
$result = "";
for($count = 0;$count < strlen($salt)/2;$count++) {
$temp0 = substr($salt, 2*$count, 2);
$temp1 = hexdec($temp0);
$temp3 = reset(unpack("l", pack("l", $temp1 +0xffffff00)));
$temp4 = pack('C*', $temp3);
$result = $result.$temp4;
}
return $result;
}
}
?>

View File

@ -0,0 +1,381 @@
<?php
/**
* 2014.12.02 1) 불필요한 로깅 삭제, 2) check key array
*/
// error_reporting(E_ALL);
// ini_set("display_errors", 1);
class kmpayFunc {
private $LogPath = "";
private $phpVersion = "";
public function kmpayFunc($LogDir) {
if (substr($LogDir, strlen($LogDir) - 1) == "/") {
$LogDir = substr($LogDir, 0, strlen($LogDir) - 1);
}
@mkdir($LogDir);
$this->LogPath = $LogDir."/";
}
public function setPhpVersion($version) {
$this->phpVersion = $version;
}
public function parameterEncrypt($key, $plainText) {
try {
$encryptText = "";
$iv = "";
if ($key == null || $plainText == null || $key == "" || $plainText == "" || strlen($key) < 16) {
return "";
} else {
$iv = substr($key, 0, 16);
$encryptText = $this->AESCBCPKCS5($plainText, $key, $iv, "enc", "yes");
}
return $encryptText;
} catch (Exception $ex) {
$this->writeLog("parameterEncrypt() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function parameterDecrypt($key, $EncryptText) {
try {
$decryptText = "";
$iv = "";
if ($key == null || $EncryptText == null || $key == "" || $EncryptText == "" || strlen($key) < 16) {
return "1";
} else {
$iv = substr($key, 0, 16);
$decryptText = $this->AESCBCPKCS5($EncryptText, $key, $iv, "dec", "yes");
}
return $decryptText;
} catch (Exception $ex) {
$this->writeLog("parameterDecrypt() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function PKCS5Pad($text, $blocksize = 16) {
try {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text.str_repeat(chr($pad), $pad);
} catch (Exception $ex) {
$this->writeLog("PKCS5Pad() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function PKCS5UnPad($text) {
try {
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text)) return $text;
if (!strspn($text, chr($pad), strlen($text) - $pad)) return $text;
return substr($text, 0, -1 * $pad);
} catch (Exception $ex) {
$this->writeLog("PKCS5UnPad() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function encrypt($iv, $key, $str) {
try {
$td = mcrypt_module_open("rijndael-128", "", "cbc", "");
@mcrypt_generic_init($td, $key, $iv);
$encrypted = @mcrypt_generic($td, $this->PKCS5Pad($str));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $encrypted;
} catch (Exception $ex) {
$this->writeLog("encrypt() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function decrypt($iv, $key, $code) {
try {
$td = mcrypt_module_open("rijndael-128", "", "cbc", "");
@mcrypt_generic_init($td, $key, $iv);
$decrypted = @mdecrypt_generic($td, $code);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $this->PKCS5UnPad($decrypted);
} catch (Exception $ex) {
$this->writeLog("decrypt() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function AESCBCPKCS5($source_data, $key, $iv, $mode="enc", $base64="yes") {
try {
if ($mode == "dec") {
if ($base64 == "yes") return $this->decrypt($iv, $key, base64_decode($source_data));
else return $this->decrypt($iv, $key, $source_data);
}
else {
if ($base64 == "yes") return base64_encode($this->encrypt($iv, $key, $source_data));
else return $this->encrypt($iv, $key, $source_data);
}
} catch (Exception $ex) {
$this->writeLog("AESCBCPKCS5() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function connMPayDLP($urlStr, $mid, $encryptStr) {
try {
// php에 cURL 모듈 설치 필요(리눅스 - curl.so, 윈도우 - php_curl.dll 확장모듈 필요)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlStr); //접속할 URL 주소
//curl_setopt($ch, CURLOPT_PORT, 12443); //접속할 port, 주소에 있으므로 설정하지 않음
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 인증서 체크같은데 true 시 안되는 경우가 많다.
//curl_setopt($ch, CURLOPT_SSLVERSION, 3); // SSL 버젼 (https 접속시에 필요, 기본값으로 해야하므로 설정하지 않음)
curl_setopt($ch, CURLOPT_HEADER, 0); // 헤더 출력 여부
curl_setopt($ch, CURLOPT_POST, 1); // Post Get 접속 여부
curl_setopt($ch, CURLOPT_POSTFIELDS, array("k" => $mid, "v" => $encryptStr)); // Post 값 Get 방식처럼적는다.
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // TimeOut 값
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 결과값을 받을것인지
curl_setopt($ch, CURLOPT_USERAGENT, $this->phpVersion); // 버전
$result = curl_exec($ch);
$errcode = curl_error($ch);
if ($errcode != "") $result = $errcode;
//$errcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//if ($errcode != 200) $result = $errcode;
curl_close($ch);
return $result;
} catch (Exception $ex) {
$this->writeLog("connMPayDLP() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function writeLog($strLogText) {
$log_string = "";
if (is_array($strLogText)) {
$log_string = "[".date("Y/m/d H:i:s")."] \r\n";
foreach (array_keys($strLogText) as $key) {
$log_string = $log_string." [".$key."] => ".$strLogText[$key]."\r\n";
}
} else {
$log_string = "[".date("Y/m/d H:i:s")."] ".$strLogText."\r\n";
}
$log_filenm = $this->LogPath.date("Ymd")."_KMpay.log";
$log_file = fopen($log_filenm, "a");
if($log_file == false) return;
flock($log_file, LOCK_EX);
//fwrite($log_file, $log_string);
fputs($log_file, $log_string);
fflush($log_file);
flock($log_file, LOCK_UN);
fclose($log_file);
}
}
class JsonString {
private $LogPath = "";
private $strValues = array();
public function JsonString($LogDir) {
if (substr($LogDir, strlen($LogDir) - 1) == "/") {
$LogDir = substr($LogDir, 0, strlen($LogDir) - 1);
}
@mkdir($LogDir);
$this->LogPath = $LogDir."/";
}
public function setValue($key, $value) {
try {
$this->strValues[$key] = $value;
return "_TRUE_";
} catch (Exception $ex) {
$this->writeLog("setValue() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function getValue($key) {
try {
if (!in_array($key, array_keys($this->strValues))) return "";
return $this->strValues[$key];
} catch (Exception $ex) {
$this->writeLog("getValue() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function getArrayValue() {
try {
return $this->strValues;
} catch (Exception $ex) {
$this->writeLog("getArrayValue() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function setJsonString($strJsonString) {
try {
$strJsonString = substr($strJsonString, 2, strlen($strJsonString) - 4);
$strItems = explode("\",\"", $strJsonString);
foreach ($strItems as $strItem) {
$strValue = explode("\":\"", $strItem);
$this->setValue($strValue[0], $strValue[1]);
}
return "_TRUE_";
} catch (Exception $ex) {
$this->writeLog("setJsonString() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function getJsonString() {
try {
$strJsonString = "{";
foreach (array_keys($this->strValues) as $key) {
$strJsonString = $strJsonString."\"".$key."\":";
// 2014.11.25 str_replace 추가
$strJsonString = $strJsonString."\"". str_replace(array("\\", "\""), array("\\\\", "\\\""), $this->strValues[$key])."\",";
}
$strJsonString = substr($strJsonString, 0, strlen($strJsonString)-1)."}";
return $strJsonString;
} catch (Exception $ex) {
$this->writeLog("getJsonString() Exception Code ".$ex->getCode()." : ".$ex->getMessage()." in ".$ex->getFile()." on line ".$ex->getLine());
return "_FAIL_";
}
}
public function writeLog($strLogText) {
$log_string = "";
if (is_array($strLogText)) {
$log_string = "[".date("Y/m/d H:i:s")."] \r\n";
foreach (array_keys($strLogText) as $key) {
$log_string = $log_string." [".$key."] => ".$strLogText[$key]."\r\n";
}
} else {
$log_string = "[".date("Y/m/d H:i:s")."] ".$strLogText."\r\n";
}
$log_filenm = $this->LogPath.date("Ymd")."_KMpayLog.log";
$log_file = fopen($log_filenm, "a");
if($log_file == false) return;
flock($log_file, LOCK_EX);
//fwrite($log_file, $log_string);
fputs($log_file, $log_string);
fflush($log_file);
flock($log_file, LOCK_UN);
fclose($log_file);
}
}
class KMPayDataValidator {
public $resultValid = "";
public function KMPayDataValidator($value) {
$this->resultValid = $this->validator($value);
}
// 2014.12.02 추가 (check key in array)
private function getValueFromArray($arr, $key) {
if(array_key_exists($key, $arr)) {
return $arr[$key];
} else {
return "";
}
}
// 2014.12.02 수정 (getValueFromArray 사용)
private function validator($value) {
//필수정보
$prType = $this->getValueFromArray($value, "PR_TYPE");
$merchantID = $this->getValueFromArray($value, "MERCHANT_ID");
$channelType = $this->getValueFromArray($value, "channelType");
$merchantTxnNum = $this->getValueFromArray($value, "MERCHANT_TXN_NUM");
$productName = $this->getValueFromArray($value, "PRODUCT_NAME");
$amount = $this->getValueFromArray($value, "AMOUNT");
$currency = $this->getValueFromArray($value, "CURRENCY");
$returnUrl = $this->getValueFromArray($value, "RETURN_URL");
//추가정보
$cardMerchantNum = $this->getValueFromArray($value, "CARD_MERCHANT_NUM");
$supplyAmt = $this->getValueFromArray($value, "SUPPLY_AMT");
$goodsVat = $this->getValueFromArray($value, "GOODS_VAT");
$serviceAmt = $this->getValueFromArray($value, "SERVICE_AMT");
$cancelTime = $this->getValueFromArray($value, "CANCEL_TIME");
$fixedInt = $this->getValueFromArray($value, "FIXED_INT");
$certifiedFlag = $this->getValueFromArray($value, "CERTIFIED_FLAG");
$offerPeriodFlag = $this->getValueFromArray($value, "OFFER_PERIOD_FLAG");
$offerPeriod = $this->getValueFromArray($value, "OFFER_PERIOD");
if (strlen($certifiedFlag) == 0) {
$certifiedFlag = "N";
}
if (strlen($supplyAmt) == 0) {
$supplyAmt = "0";
}
if (strlen($goodsVat) == 0) {
$goodsVat = "0";
}
if (strlen($cancelTime) == 0) {
$cancelTime = "1440";
}
//필수
if (strlen($prType) == 0) {
return "USER_ERROR_CODE,804,결제요청타입은 필수입력사항 입니다.";
}
else if ($prType != "MPM" && $prType != "WPM") {
return "USER_ERROR_CODE,805,잘못된 결제요청타입 입니다.";
}
if (strlen($merchantID) == 0) {
return "USER_ERROR_CODE,806,가맹점 ID 필수입력사항 입니다.";
}
else if (strlen($merchantID) > 38) {
return "USER_ERROR_CODE,808,가맹점 ID의 제한 길이가 초과 되었습니다.";
}
if (strlen($merchantTxnNum) == 0) {
return "USER_ERROR_CODE,823,가맹점 거래번호는 필수입력사항 입니다.";
}
else if (strlen($merchantTxnNum) > 40) {
return "USER_ERROR_CODE,824,가맹점 거래번호의 제한 길이가 초과 되었습니다.";
}
if (strlen($productName) == 0) {
return "USER_ERROR_CODE,809,상품명은 필수입력사항 입니다.";
}
else if (strlen($productName) > 200) {
return "USER_ERROR_CODE,810,상품명은 영문 200자 이내입니다.";
}
if (strlen($amount) == 0) {
return "USER_ERROR_CODE,811,상품금액은 필수입력사항 입니다.";
}
else if (!is_numeric($amount)){
return "USER_ERROR_CODE,812,상품금액은 숫자형입니다.";
}
if (strlen($currency) == 0) {
return "USER_ERROR_CODE,813,거래통화는 필수입력사항 입니다.";
}
if ($certifiedFlag == "CN") {
//웹결제에서는 필수체크 안함
}
else if (strlen($certifiedFlag) == 0) {
return "USER_ERROR_CODE,830,결제승인결과전송URL은 필수입력사항 입니다.";
}
if (strlen($cardMerchantNum) > 0 && !is_numeric($cardMerchantNum)) {
return "USER_ERROR_CODE,814,카드 가맹점 번호는 숫자형입니다.";
}
if (strlen($supplyAmt) > 0 && !is_numeric($supplyAmt)) {
return "USER_ERROR_CODE,815,공급가액은 숫자형입니다.";
}
if (strlen($goodsVat) > 0 && !is_numeric($goodsVat)) {
return "USER_ERROR_CODE,816,부가세는 숫자형입니다.";
}
if (strlen($serviceAmt) > 0 && !is_numeric($serviceAmt)) {
return "USER_ERROR_CODE,817,봉사료는 숫자형입니다.";
}
if (strlen($cancelTime) > 0 && !is_numeric($cancelTime)) {
return "USER_ERROR_CODE,818,결제취소시간(분)은 숫자형입니다.";
}
if (strlen($fixedInt) == 0) {
// 정상
}
else if (!is_numeric($fixedInt)) {
return "USER_ERROR_CODE,820,고정할부개월이 잘못되었습니다.";
}
else if (!((0 <= intval($fixedInt) && intval($fixedInt) <= 24) || $fixedInt == "36")) {
return "USER_ERROR_CODE,820,고정할부개월이 잘못되었습니다.";
}
if ($certifiedFlag != "N" && $certifiedFlag != "CN") {
return "USER_ERROR_CODE,831,가맹점 인증 구분값은 N 혹은 CN 입니다";
}
return "";
}
}
?>

View File

@ -0,0 +1,21 @@
<?php
include_once('./_common.php');
include_once(G5_LIB_PATH.'/json.lib.php');
include(G5_SHOP_PATH.'/kakaopay/incKakaopayCommon.php');
include(G5_SHOP_PATH.'/kakaopay/lgcns_CNSpay.php');
$Amt = (int)preg_replace('#[^0-9]#', '', $_POST['Amt']);
$ediDate = trim($_POST['ediDate']);
////////위변조 처리/////////
//결제요청용 키값
$cnspay_lib = new CnsPayWebConnector($LogDir);
$md_src = $ediDate.$MID.$Amt;
$salt = hash("sha256",$merchantKey.$md_src,false);
$hash_input = $cnspay_lib->makeHashInputString($salt);
$hash_calc = hash("sha256", $hash_input, false);
$hash_String = base64_encode($hash_calc);
die(json_encode(array('hash_String' => $hash_String, 'error' => '')));
?>

View File

@ -0,0 +1,110 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
if($is_kakaopay_use) {
?>
<script src="<?php echo ($CnsPayDealRequestUrl) ?>/dlp/scripts/lib/easyXDM.min.js" type="text/javascript"></script>
<script src="<?php echo ($CnsPayDealRequestUrl) ?>/dlp/scripts/lib/json3.min.js" type="text/javascript"></script>
<link href="https://pg.cnspay.co.kr:443/dlp/css/kakaopayDlp.css" rel="stylesheet" type="text/css" />
<!-- DLP창에 대한 KaKaoPay Library -->
<script type="text/javascript" src="<?php echo ($CNSPAY_WEB_SERVER_URL) ?>/js/dlp/client/kakaopayDlpConf.js" charset="utf-8"></script>
<script type="text/javascript" src="<?php echo ($CNSPAY_WEB_SERVER_URL) ?>/js/dlp/client/kakaopayDlp.min.js" charset="utf-8"></script>
<script type="text/javascript">
/**
cnspay 를 통해 결제를 시작합니다.
*/
function cnspay(frm) {
if(document.getElementById("od_settle_kakaopay").checked){
// TO-DO : 가맹점에서 해줘야할 부분(TXN_ID)과 KaKaoPay DLP 호출 API
// 결과코드가 00(정상처리되었습니다.)
if(frm.resultCode.value == '00') {
// TO-DO : 가맹점에서 해줘야할 부분(TXN_ID)과 KaKaoPay DLP 호출 API
kakaopayDlp.setTxnId(frm.txnId.value);
kakaopayDlp.setChannelType('WPM', 'TMS');
kakaopayDlp.addRequestParams({ MOBILE_NUM : frm.od_hp.value});
kakaopayDlp.callDlp('kakaopay_layer', frm, submitFunc);
} else {
alert('[RESULT_CODE] : ' + frm.resultCode.value + '\n[RESULT_MSG] : ' + frm.resultMsg.value);
}
}
}
function makeHashData(frm) {
var result = true;
$.ajax({
url: g5_url+"/shop/kakaopay/makehashdata.php",
type: "POST",
data: {
Amt : frm.good_mny.value,
ediDate : frm.EdiDate.value
},
dataType: "json",
async: false,
cache: false,
success: function(data) {
if(data.error == "") {
frm.EncryptData.value = data.hash_String;
} else {
alert(data.error);
result = false;
}
}
});
return result;
}
function getTxnId(frm) {
if(makeHashData(frm)) {
frm.Amt.value = frm.good_mny.value;
frm.BuyerEmail.value = frm.od_email.value;
frm.BuyerName.value = frm.od_name.value;
$.ajax({
url: g5_url+"/shop/kakaopay/getTxnId.php",
type: "POST",
data: $("#kakaopay_request input").serialize(),
dataType: "json",
async: false,
cache: false,
success: function(data) {
frm.resultCode.value = data.resultCode;
frm.resultMsg.value = data.resultMsg;
frm.txnId.value = data.txnId;
frm.prDt.value = data.prDt;
cnspay(frm);
},
error: function(data) {
console.log(data);
}
});
}
}
var submitFunc = function cnspaySubmit(data){
if(data.RESULT_CODE === '00') {
// 부인방지토큰은 기본적으로 name="NON_REP_TOKEN"인 input박스에 들어가게 되며, 아래와 같은 방법으로 꺼내서 쓸 수도 있다.
// 해당값은 가군인증을 위해 돌려주는 값으로서, 가맹점과 카카오페이 양측에서 저장하고 있어야 한다.
// var temp = data.NON_REP_TOKEN;
document.forderform.submit();
} else if(data.RESLUT_CODE === 'KKP_SER_002') {
// X버튼 눌렀을때의 이벤트 처리 코드 등록
alert('[RESULT_CODE] : ' + data.RESULT_CODE + '\n[RESULT_MSG] : ' + data.RESULT_MSG);
} else {
alert('[RESULT_CODE] : ' + data.RESULT_CODE + '\n[RESULT_MSG] : ' + data.RESULT_MSG);
}
};
</script>
<?php
}
?>

View File

@ -0,0 +1,33 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
if($is_kakaopay_use) {
$remoteaddr = $_SERVER['REMOTE_ADDR'];
$serveraddr = $_SERVER['SERVER_ADDR'];
?>
<div id="kakaopay_request">
<input type="hidden" name="merchantTxnNum" value="<?php echo $od_id; ?>">
<input type="hidden" name="GoodsName" value="<?php echo $goods; ?>">
<input type="hidden" name="Amt" value="<?php echo $tot_price; ?>">
<input type="hidden" name="GoodsCnt" value="<?php echo ($goods_count + 1); ?>">
<input type="hidden" name="BuyerEmail" value="">
<input type="hidden" name="BuyerName" value="">
<input type="hidden" name="prType" value="WPM">
<input type="hidden" name="channelType" value="4">
<input type="hidden" name="TransType" value="0">
<input type="hidden" name="resultCode" value="" id="resultCode">
<input type="hidden" name="resultMsg" value="" id="resultMsg">
<input type="hidden" name="txnId" value="" id="txnId">
<input type="hidden" name="prDt" value=""id="prDt">
<input type="hidden" name="SPU" value="">
<input type="hidden" name="SPU_SIGN_TOKEN" value="">
<input type="hidden" name="MPAY_PUB" value="">
<input type="hidden" name="NON_REP_TOKEN" value="">
<input type="hidden" name="EdiDate" value="<?php echo($ediDate); ?>">
<input type="hidden" name="EncryptData" value="">
</div>
<?php
}
?>

View File

@ -0,0 +1,6 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
?>
<!-- TODO : LayerPopup의 Target DIV 생성 -->
<div id="kakaopay_layer" style="display: none"></div>

View File

@ -53,9 +53,14 @@ $s_cart_id = $tmp_cart_id;
$order_action_url = G5_HTTPS_SHOP_URL.'/orderformupdate.php';
require_once('./settle_'.$default['de_pg_service'].'.inc.php');
require_once('./settle_kakaopay.inc.php');
// 결제대행사별 코드 include (스크립트 등)
require_once('./'.$default['de_pg_service'].'/orderform.1.php');
if($is_kakaopay_use) {
require_once('./kakaopay/orderform.1.php');
}
?>
<form name="forderform" id="forderform" method="post" action="<?php echo $order_action_url; ?>" onsubmit="return forderform_check(this);" autocomplete="off">
@ -298,6 +303,10 @@ require_once('./'.$default['de_pg_service'].'/orderform.1.php');
<?php
// 결제대행사별 코드 include (결제대행사 정보 필드)
require_once('./'.$default['de_pg_service'].'/orderform.2.php');
if($is_kakaopay_use) {
require_once('./kakaopay/orderform.2.php');
}
?>
<!-- 주문하시는 분 입력 시작 { -->
@ -579,11 +588,18 @@ require_once('./'.$default['de_pg_service'].'/orderform.1.php');
$escrow_title = "에스크로 ";
}
if ($default['de_bank_use'] || $default['de_vbank_use'] || $default['de_iche_use'] || $default['de_card_use'] || $default['de_hp_use'] || $default['de_easy_pay_use']) {
if ($is_kakaopay_use || $default['de_bank_use'] || $default['de_vbank_use'] || $default['de_iche_use'] || $default['de_card_use'] || $default['de_hp_use'] || $default['de_easy_pay_use']) {
echo '<fieldset id="sod_frm_paysel">';
echo '<legend>결제방법 선택</legend>';
}
// 카카오페이
if($is_kakaopay_use) {
$multi_settle++;
echo '<input type="radio" id="od_settle_kakaopay" name="od_settle_case" value="KAKAOPAY" '.$checked.'> <label for="od_settle_kakaopay">KAKAOPAY</label>'.PHP_EOL;
$checked = '';
}
// 무통장입금 사용
if ($default['de_bank_use']) {
$multi_settle++;
@ -705,6 +721,10 @@ require_once('./'.$default['de_pg_service'].'/orderform.1.php');
<?php
// 결제대행사별 코드 include (주문버튼)
require_once('./'.$default['de_pg_service'].'/orderform.3.php');
if($is_kakaopay_use) {
require_once('./kakaopay/orderform.3.php');
}
?>
</form>
@ -956,7 +976,7 @@ $(function() {
$("#settle_bank").show();
});
$("#od_settle_iche,#od_settle_card,#od_settle_vbank,#od_settle_hp,#od_settle_easy_pay").bind("click", function() {
$("#od_settle_iche,#od_settle_card,#od_settle_vbank,#od_settle_hp,#od_settle_easy_pay,#od_settle_kakaopay").bind("click", function() {
$("#settle_bank").hide();
});
@ -1324,6 +1344,12 @@ function forderform_check(f)
calculate_tax();
<?php } ?>
// 카카오페이 지불
if(settle_method == "KAKAOPAY") {
getTxnId(f);
return false;
}
// pay_method 설정
<?php if($default['de_pg_service'] == 'kcp') { ?>
f.site_cd.value = f.def_site_cd.value;

View File

@ -403,22 +403,43 @@ else if ($od_settle_case == "간편결제")
if($od_misu == 0)
$od_status = '입금';
}
else if ($od_settle_case == "KAKAOPAY")
{
include G5_SHOP_PATH.'/kakaopay/kakaopay_result.php';
$od_tno = $tno;
$od_app_no = $app_no;
$od_receipt_price = $amount;
$od_receipt_point = $i_temp_point;
$od_receipt_time = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/", "\\1-\\2-\\3 \\4:\\5:\\6", $app_time);
$od_bank_account = $card_name;
$pg_price = $amount;
$od_misu = $i_price - $od_receipt_price;
if($od_misu == 0)
$od_status = '입금';
}
else
{
die("od_settle_case Error!!!");
}
$od_pg = $default['de_pg_service'];
if($od_settle_case == 'KAKAOPAY')
$od_pg = 'KAKAOPAY';
// 주문금액과 결제금액이 일치하는지 체크
if($tno) {
if((int)$order_price !== (int)$pg_price) {
$cancel_msg = '결제금액 불일치';
switch($default['de_pg_service']) {
switch($od_pg) {
case 'lg':
include G5_SHOP_PATH.'/lg/xpay_cancel.php';
break;
case 'inicis':
include G5_SHOP_PATH.'/inicis/inipay_cancel.php';
break;
case 'KAKAOPAY':
break;
default:
include G5_SHOP_PATH.'/kcp/pp_ax_hub_cancel.php';
break;
@ -450,7 +471,6 @@ if($default['de_tax_flag_use']) {
$od_free_mny = (int)$_POST['comm_free_mny'];
}
$od_pg = $default['de_pg_service'];
$od_email = get_email_address($od_email);
$od_name = clean_xss_tags($od_name);
$od_tel = clean_xss_tags($od_tel);
@ -531,13 +551,15 @@ $result = sql_query($sql, false);
if(!$result) {
if($tno) {
$cancel_msg = '주문정보 입력 오류';
switch($default['de_pg_service']) {
switch($od_pg) {
case 'lg':
include G5_SHOP_PATH.'/lg/xpay_cancel.php';
break;
case 'inicis':
include G5_SHOP_PATH.'/inicis/inipay_cancel.php';
break;
case 'KAKAOPAY':
break;
default:
include G5_SHOP_PATH.'/kcp/pp_ax_hub_cancel.php';
break;
@ -548,7 +570,7 @@ if(!$result) {
$error = 'order';
include G5_SHOP_PATH.'/ordererrormail.php';
die('<p>고객님의 주문 정보를 처리하는 중 오류가 발생해서 주문이 완료되지 않았습니다.</p><p>'.strtoupper($default['de_pg_service']).'를 이용한 전자결제(신용카드, 계좌이체, 가상계좌 등)은 자동 취소되었습니다.');
die('<p>고객님의 주문 정보를 처리하는 중 오류가 발생해서 주문이 완료되지 않았습니다.</p><p>'.strtoupper($od_pg).'를 이용한 전자결제(신용카드, 계좌이체, 가상계좌 등)은 자동 취소되었습니다.');
}
// 장바구니 상태변경
@ -570,13 +592,15 @@ $result = sql_query($sql, false);
if(!$result) {
if($tno) {
$cancel_msg = '주문상태 변경 오류';
switch($default['de_pg_service']) {
switch($od_pg) {
case 'lg':
include G5_SHOP_PATH.'/lg/xpay_cancel.php';
break;
case 'inicis':
include G5_SHOP_PATH.'/inicis/inipay_cancel.php';
break;
case 'KAKAOPAY':
break;
default:
include G5_SHOP_PATH.'/kcp/pp_ax_hub_cancel.php';
break;
@ -590,7 +614,7 @@ if(!$result) {
// 주문삭제
sql_query(" delete from {$g5['g5_shop_order_table']} where od_id = '$od_id' ");
die('<p>고객님의 주문 정보를 처리하는 중 오류가 발생해서 주문이 완료되지 않았습니다.</p><p>'.strtoupper($default['de_pg_service']).'를 이용한 전자결제(신용카드, 계좌이체, 가상계좌 등)은 자동 취소되었습니다.');
die('<p>고객님의 주문 정보를 처리하는 중 오류가 발생해서 주문이 완료되지 않았습니다.</p><p>'.strtoupper($od_pg).'를 이용한 전자결제(신용카드, 계좌이체, 가상계좌 등)은 자동 취소되었습니다.');
}
// 회원이면서 포인트를 사용했다면 테이블에 사용을 추가

View File

@ -0,0 +1,9 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
$is_kakaopay_use = false;
if($default['de_kakaopay_mid'] && $default['de_kakaopay_key'] && $default['de_kakaopay_enckey'] && $default['de_kakaopay_hashkey'] && $default['de_kakaopay_cancelpwd']) {
$is_kakaopay_use = true;
require_once(G5_SHOP_PATH.'/kakaopay/incKakaopayCommon.php');
}
?>