Files
firstgarden-web-gnu/shop/kakaopay/lgcns_KMpay.php

384 lines
17 KiB
PHP

<?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) {
if($key == 'MERCHANT_ID')
continue;
$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 "";
}
}
?>