From 3e75ccea65a37e863c00bf3a79cdca1a1d3d17f9 Mon Sep 17 00:00:00 2001 From: thisgun Date: Fri, 29 May 2026 06:14:21 +0000 Subject: [PATCH] =?UTF-8?q?NHN=20KCP=20=ED=9C=B4=EB=8C=80=ED=8F=B0=20?= =?UTF-8?q?=EB=B3=B8=EC=9D=B8=ED=99=95=EC=9D=B8(api=5Fv2)=20=EB=B2=84?= =?UTF-8?q?=EC=A0=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adm/config_form.php | 31 ++- config.php | 3 + extend/version.extend.php | 2 +- js/certify.js | 13 ++ .../member/basic/member_cert_refresh.skin.php | 4 + .../skin/member/basic/password_lost.skin.php | 4 + .../skin/member/basic/register_form.skin.php | 4 + .../social/social_register_member.skin.php | 4 + plugin/kcpcert_v2/_common.php | 3 + plugin/kcpcert_v2/find_kcpcert_result.php | 104 ++++++++++ plugin/kcpcert_v2/kcpcert_config.php | 35 ++++ plugin/kcpcert_v2/kcpcert_form.php | 59 ++++++ plugin/kcpcert_v2/kcpcert_result.php | 105 ++++++++++ plugin/kcpcert_v2/lib/Crypto.php | 54 ++++++ plugin/kcpcert_v2/lib/kcp_api.php | 183 ++++++++++++++++++ .../member/basic/member_cert_refresh.skin.php | 4 + skin/member/basic/password_lost.skin.php | 4 + skin/member/basic/register_form.skin.php | 4 + skin/social/social_register_member.skin.php | 4 + .../member/basic/member_cert_refresh.skin.php | 4 + .../skin/member/basic/password_lost.skin.php | 4 + .../skin/member/basic/register_form.skin.php | 4 + .../member/basic/member_cert_refresh.skin.php | 4 + .../skin/member/basic/password_lost.skin.php | 4 + .../skin/member/basic/register_form.skin.php | 4 + 25 files changed, 640 insertions(+), 8 deletions(-) create mode 100644 plugin/kcpcert_v2/_common.php create mode 100644 plugin/kcpcert_v2/find_kcpcert_result.php create mode 100644 plugin/kcpcert_v2/kcpcert_config.php create mode 100644 plugin/kcpcert_v2/kcpcert_form.php create mode 100644 plugin/kcpcert_v2/kcpcert_result.php create mode 100644 plugin/kcpcert_v2/lib/Crypto.php create mode 100644 plugin/kcpcert_v2/lib/kcp_api.php diff --git a/adm/config_form.php b/adm/config_form.php index 4312a7001..5f9574925 100644 --- a/adm/config_form.php +++ b/adm/config_form.php @@ -415,10 +415,10 @@ if (!isset($config['cf_cert_use_seed'])) { sql_query($sql, false); } if (!isset($config['cf_cert_kcp_enckey'])) { - $sql = "ALTER TABLE `{$g5['config_table']}` + $sql = "ALTER TABLE `{$g5['config_table']}` ADD COLUMN `cf_cert_kcp_enckey` VARCHAR(100) NOT NULL DEFAULT '' AFTER `cf_cert_kcp_cd`; "; sql_query($sql, false); - + $config['cf_cert_kcp_enckey'] = ''; } @@ -1068,7 +1068,24 @@ if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) { + +
+ NHN KCP 휴대폰 본인확인(api_v2) 사용 시,
+ NHN KCP 상점관리자 > 부가서비스 > 휴대폰본인확인 > 연동방식 설정 에서 신규 연동방식(V2) 사용여부를 ‘사용’ 으로 변경해야 정상 동작합니다. +
+ @@ -1104,16 +1121,16 @@ if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) { - 서비스에 가입되어 있지 않다면, 본인확인 서비스 신청페이지에서 서비스 신청 후 사이트코드를 발급 받으실 수 있습니다.') ?> - SM - NHN KCP 휴대폰 본인확인 서비스 신청페이지 + NHN KCP 휴대폰 본인확인(api_v2)은 KCP에서 발급받은 5자리 사이트코드를 그대로 입력해 주십시오.
서비스에 가입되어 있지 않다면, 본인확인 서비스 신청페이지에서 서비스 신청 후 사이트코드를 발급 받으실 수 있습니다.') ?> + SM + NHN KCP 휴대폰 본인확인 서비스 신청페이지 - NHN_KCP 상점관리자 > 기술관리센터 > 인증센터 > 가맹점 인증키관리 에서 인증키 발급 후에 인증키 정보를 입력') ?> - NHN KCP 상점관리자 + 기술관리센터 > 인증센터 > 가맹점 인증키관리 에서 인증키를 발급받아 입력해 주십시오.
NHN KCP 휴대폰 본인확인(api_v2)도 이 인증키 값을 사용합니다.') ?> + NHN KCP 상점관리자 diff --git a/config.php b/config.php index d0e8d1aba..f8f7dd4e3 100644 --- a/config.php +++ b/config.php @@ -64,6 +64,7 @@ define('G5_MOBILE_DIR', 'mobile'); define('G5_OKNAME_DIR', 'okname'); define('G5_KCPCERT_DIR', 'kcpcert'); +define('G5_KCPCERT_V2_DIR', 'kcpcert_v2'); define('G5_INICERT_DIR', 'inicert'); define('G5_LGXPAY_DIR', 'lgxpay'); @@ -103,6 +104,7 @@ define('G5_PLUGIN_URL', G5_URL.'/'.G5_PLUGIN_DIR); define('G5_EDITOR_URL', G5_PLUGIN_URL.'/'.G5_EDITOR_DIR); define('G5_OKNAME_URL', G5_PLUGIN_URL.'/'.G5_OKNAME_DIR); define('G5_KCPCERT_URL', G5_PLUGIN_URL.'/'.G5_KCPCERT_DIR); +define('G5_KCPCERT_V2_URL', G5_PLUGIN_URL.'/'.G5_KCPCERT_V2_DIR); define('G5_INICERT_URL', G5_PLUGIN_URL.'/'.G5_INICERT_DIR); define('G5_LGXPAY_URL', G5_PLUGIN_URL.'/'.G5_LGXPAY_DIR); define('G5_SNS_URL', G5_PLUGIN_URL.'/'.G5_SNS_DIR); @@ -123,6 +125,7 @@ define('G5_EDITOR_PATH', G5_PLUGIN_PATH.'/'.G5_EDITOR_DIR); define('G5_OKNAME_PATH', G5_PLUGIN_PATH.'/'.G5_OKNAME_DIR); define('G5_KCPCERT_PATH', G5_PLUGIN_PATH.'/'.G5_KCPCERT_DIR); +define('G5_KCPCERT_V2_PATH', G5_PLUGIN_PATH.'/'.G5_KCPCERT_V2_DIR); define('G5_INICERT_PATH', G5_PLUGIN_PATH.'/'.G5_INICERT_DIR); define('G5_LGXPAY_PATH', G5_PLUGIN_PATH.'/'.G5_LGXPAY_DIR); diff --git a/extend/version.extend.php b/extend/version.extend.php index 3eb926b64..086d5a9cc 100644 --- a/extend/version.extend.php +++ b/extend/version.extend.php @@ -5,4 +5,4 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 // 예) https://도메인/css/default.css?ver=220620 // 예) https://도메인/js/common.js?ver=220620 define('G5_CSS_VER', '2303229'); -define('G5_JS_VER', '2304171'); +define('G5_JS_VER', '2605291'); diff --git a/js/certify.js b/js/certify.js index a28e55526..b047cce21 100644 --- a/js/certify.js +++ b/js/certify.js @@ -64,6 +64,19 @@ function certify_win_open(type, url, event) { var AUTH_POP = window.open(url,'auth_popup', winopts + position); } } + else if(type == 'kcp_v2-hp') + { + var width = 410; + var height = 500; + + var leftpos = screen.width / 2 - ( width / 2 ); + var toppos = screen.height / 2 - ( height / 2 ); + + var winopts = "width=" + width + ", height=" + height + ", toolbar=no,status=no,statusbar=no,menubar=no,scrollbars=no,resizable=no"; + var position = ",left=" + leftpos + ", top=" + toppos; + var AUTH_POP = window.open(url, 'auth_popup', winopts + position); + if (AUTH_POP) AUTH_POP.focus(); + } else if(type == 'lg-hp') { diff --git a/mobile/skin/member/basic/member_cert_refresh.skin.php b/mobile/skin/member/basic/member_cert_refresh.skin.php index 162eb7b7b..bddcd9471 100644 --- a/mobile/skin/member/basic/member_cert_refresh.skin.php +++ b/mobile/skin/member/basic/member_cert_refresh.skin.php @@ -121,6 +121,10 @@ if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipi $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/mobile/skin/member/basic/password_lost.skin.php b/mobile/skin/member/basic/password_lost.skin.php index f33b720c9..6278d8eba 100644 --- a/mobile/skin/member/basic/password_lost.skin.php +++ b/mobile/skin/member/basic/password_lost.skin.php @@ -92,6 +92,10 @@ $(function() { $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/mobile/skin/member/basic/register_form.skin.php b/mobile/skin/member/basic/register_form.skin.php index 11c2232cf..9972caabf 100644 --- a/mobile/skin/member/basic/register_form.skin.php +++ b/mobile/skin/member/basic/register_form.skin.php @@ -428,6 +428,10 @@ if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipi $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/mobile/skin/social/social_register_member.skin.php b/mobile/skin/social/social_register_member.skin.php index 4401f3473..82d79f39e 100644 --- a/mobile/skin/social/social_register_member.skin.php +++ b/mobile/skin/social/social_register_member.skin.php @@ -357,6 +357,10 @@ $email_msg = $is_exists_email ? '등록할 이메일이 중복되었습니다. $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/plugin/kcpcert_v2/_common.php b/plugin/kcpcert_v2/_common.php new file mode 100644 index 000000000..0ea0af001 --- /dev/null +++ b/plugin/kcpcert_v2/_common.php @@ -0,0 +1,3 @@ +get_cert_data($reg_cert_key, $ordr_idxx); + +if ($cert['res_cd'] !== '0000') { + alert_close('본인확인 결과조회 실패 ('.$cert['res_cd'].' : '.$cert['res_msg'].')'); +} + +$phone_no = trim($cert['phone_no']); +$user_name = trim($cert['user_name']); +$birth_day = trim($cert['birth_day']); +$sex_code = trim($cert['sex_code']); +$ci = trim($cert['ci']); +$di = trim($cert['di']); + +if (!$phone_no || !$user_name || !$birth_day || !$ci || !$di) { + alert_close('정상적인 인증이 아닙니다. 올바른 방법으로 이용해 주세요.'); +} + +$phone_no = hyphen_hp_number($phone_no); +$mb_dupinfo = $di; +$md5_ci = md5($ci.$ci); +$sql_dupinfo = sql_real_escape_string($mb_dupinfo); +$sql_md5_ci = sql_real_escape_string($md5_ci); + +$row = sql_fetch("select mb_id from {$g5['member_table']} where mb_id <> '{$member['mb_id']}' and mb_dupinfo = '{$sql_md5_ci}'"); +if (empty($row['mb_id'])) { + $row = sql_fetch("select mb_id from {$g5['member_table']} where mb_id <> '{$member['mb_id']}' and mb_dupinfo = '{$sql_dupinfo}'"); + if (empty($row['mb_id'])) { + alert_close('인증하신 정보로 가입된 회원정보가 없습니다.'); + } +} else { + $mb_dupinfo = $md5_ci; +} + +$cert_type = 'hp'; +$md5_cert_no = md5($reg_cert_key); +$hash_data = md5($user_name.$cert_type.$birth_day.$phone_no.$md5_cert_no); + +$adult_day = date('Ymd', strtotime('-19 years', G5_SERVER_TIME)); +$adult = ((int)$birth_day <= (int)$adult_day) ? 1 : 0; + +set_session('ss_cert_type', $cert_type); +set_session('ss_cert_no', $md5_cert_no); +set_session('ss_cert_hash', $hash_data); +set_session('ss_cert_adult', $adult); +set_session('ss_cert_birth', $birth_day); +set_session('ss_cert_sex', ($sex_code == '01' ? 'M' : 'F')); +set_session('ss_cert_dupinfo', $mb_dupinfo); +set_session('ss_cert_mb_id', $row['mb_id']); +?> +
+ +
+ + 기본환경설정에서 V1 모듈을 선택해 주세요.', G5_URL); +} +if (!extension_loaded('openssl') || !function_exists('hash_pbkdf2') || !extension_loaded('curl')) { + alert('KCP 휴대폰 본인확인 V2 모듈에 필요한 PHP 확장(openssl/curl/hash_pbkdf2)이 활성화되어 있지 않습니다.', G5_URL); +} + +$web_siteid = ''; + +if ($config['cf_cert_use'] == 2) { + $site_cd = isset($config['cf_cert_kcp_cd']) ? trim($config['cf_cert_kcp_cd']) : ''; + if (strlen($site_cd) === 3) { + $site_cd = 'SM'.$site_cd; + } + $kcp_enc_key = isset($config['cf_cert_kcp_enckey']) ? $config['cf_cert_kcp_enckey'] : ''; + $cert_reg_url = 'https://cert.kcp.co.kr/api/reg/certDataReg.do'; + $cert_dec_url = 'https://cert.kcp.co.kr/api/query/getCertData.do'; +} else if ($config['cf_cert_use'] == 1) { + $site_cd = 'AO7F3'; + $kcp_enc_key = 'c2a22fa3ebe4698075bcac6b433d52e351c881b02fb83488d4283a43385b1f8e'; + $cert_reg_url = 'https://testcert.kcp.co.kr/api/reg/certDataReg.do'; + $cert_dec_url = 'https://testcert.kcp.co.kr/api/query/getCertData.do'; +} else { + $site_cd = $kcp_enc_key = $cert_reg_url = $cert_dec_url = ''; +} + +if (!$site_cd || !$kcp_enc_key) { + alert('KCP 휴대폰 본인확인 V2 사이트코드 또는 ENC_KEY 가 설정되지 않았습니다.\n관리자 > 기본환경설정에서 입력해 주세요.', G5_URL); +} + +require_once G5_KCPCERT_V2_PATH.'/lib/Crypto.php'; +require_once G5_KCPCERT_V2_PATH.'/lib/kcp_api.php'; diff --git a/plugin/kcpcert_v2/kcpcert_form.php b/plugin/kcpcert_v2/kcpcert_form.php new file mode 100644 index 000000000..dd454877c --- /dev/null +++ b/plugin/kcpcert_v2/kcpcert_form.php @@ -0,0 +1,59 @@ +trade_reg($ordr_idxx, $result_url, $web_siteid); + +if ($reg['res_cd'] !== '0000' || !$reg['call_url'] || !$reg['reg_cert_key']) { + $err = '본인확인 거래등록에 실패했습니다.\n('.$reg['res_cd'].' : '.$reg['res_msg'].')'; + alert_close($err); +} + +set_session('ss_kcp_v2_reg_cert_key', $reg['reg_cert_key']); +set_session('ss_kcp_v2_ordr_idxx', $ordr_idxx); +set_session('ss_kcp_v2_page_type', $page_type); +?> + + + + + + + +휴대폰 본인확인 + + +
+ + +
+ + + diff --git a/plugin/kcpcert_v2/kcpcert_result.php b/plugin/kcpcert_v2/kcpcert_result.php new file mode 100644 index 000000000..49b0545dd --- /dev/null +++ b/plugin/kcpcert_v2/kcpcert_result.php @@ -0,0 +1,105 @@ +get_cert_data($reg_cert_key, $ordr_idxx); + +if ($cert['res_cd'] !== '0000') { + alert_close('본인확인 결과조회 실패 ('.$cert['res_cd'].' : '.$cert['res_msg'].')'); +} + +$phone_no = trim($cert['phone_no']); +$user_name = trim($cert['user_name']); +$birth_day = trim($cert['birth_day']); +$sex_code = trim($cert['sex_code']); +$ci = trim($cert['ci']); +$di = trim($cert['di']); + +if (!$phone_no || !$user_name || !$birth_day || !$ci || !$di) { + alert_close('정상적인 인증이 아닙니다. 올바른 방법으로 이용해 주세요.'); +} + +$phone_no = hyphen_hp_number($phone_no); +$mb_dupinfo = md5($ci.$ci); +$sql_dupinfo = sql_real_escape_string($mb_dupinfo); + +if (!empty($member['mb_certify']) && !empty($member['mb_dupinfo']) && strlen($member['mb_dupinfo']) != 64) { + if ($member['mb_dupinfo'] != $mb_dupinfo) { + alert_close('해당 계정은 이미 다른명의로 본인인증 되어있는 계정입니다.'); + } +} + +$sql = " select mb_id from {$g5['member_table']} where mb_id <> '{$member['mb_id']}' and mb_dupinfo = '{$sql_dupinfo}' "; +$row = sql_fetch($sql); +if (!empty($row['mb_id'])) { + alert_close("입력하신 본인확인 정보로 가입된 내역이 존재합니다.\\n회원아이디 : ".$row['mb_id']); +} + +$cert_type = 'hp'; +$md5_cert_no = md5($reg_cert_key); +$hash_data = md5($user_name.$cert_type.$birth_day.$phone_no.$md5_cert_no); + +$adult_day = date('Ymd', strtotime('-19 years', G5_SERVER_TIME)); +$adult = ((int)$birth_day <= (int)$adult_day) ? 1 : 0; + +set_session('ss_cert_type', $cert_type); +set_session('ss_cert_no', $md5_cert_no); +set_session('ss_cert_hash', $hash_data); +set_session('ss_cert_adult', $adult); +set_session('ss_cert_birth', $birth_day); +set_session('ss_cert_sex', ($sex_code == '01' ? 'M' : 'F')); +set_session('ss_cert_dupinfo', $mb_dupinfo); +?> + + base64_encode($e), + "rv" => base64_encode($s), + ); + } + + public static function decryptJson($enc, $rv, $key, $site) + { + $s = base64_decode($rv); + + $k = self::x($key, $s); + $v = self::x($site, $s); + + $i = substr($v, 0, 16); + + return self::z(base64_decode($enc), $k, $i); + } + } +} diff --git a/plugin/kcpcert_v2/lib/kcp_api.php b/plugin/kcpcert_v2/lib/kcp_api.php new file mode 100644 index 000000000..30c64d173 --- /dev/null +++ b/plugin/kcpcert_v2/lib/kcp_api.php @@ -0,0 +1,183 @@ +site_cd = $site_cd; + $this->enc_key = $enc_key; + $this->reg_url = $reg_url; + $this->dec_url = $dec_url; + } + + public function trade_reg($ordr_idxx, $ret_url, $web_siteid = '', $opt1 = '', $opt2 = '', $opt3 = '') + { + $payload = array( + 'site_cd' => $this->site_cd, + 'ordr_idxx' => $ordr_idxx, + 'Ret_URL' => $ret_url, + 'web_siteid' => $web_siteid, + 'param_opt_1' => $opt1, + 'param_opt_2' => $opt2, + 'param_opt_3' => $opt3, + ); + + $req_json = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + if ($req_json === false) { + return array( + 'res_cd' => 'JSON_ERROR', + 'res_msg' => 'KCP 거래등록 요청 데이터를 생성할 수 없습니다.', + 'call_url' => '', + 'reg_cert_key' => '', + ); + } + + $enc = Crypto_KCP_V2::encryptJson($req_json, $this->enc_key, $this->site_cd); + if (empty($enc['encData']) || empty($enc['rv'])) { + return array( + 'res_cd' => 'ENCRYPT_ERROR', + 'res_msg' => 'KCP 거래등록 요청 데이터를 암호화할 수 없습니다.', + 'call_url' => '', + 'reg_cert_key' => '', + ); + } + + $headers = array( + 'Content-Type: application/json', + 'site_cd: '.$this->site_cd, + 'rv: '.$enc['rv'], + ); + + $body = $this->http_post($this->reg_url, $enc['encData'], $headers); + if ($body === false || $body === '') { + return array( + 'res_cd' => 'HTTP_ERROR', + 'res_msg' => $this->last_error ? $this->last_error : 'KCP 거래등록 API 응답이 없습니다.', + 'call_url' => '', + 'reg_cert_key' => '', + ); + } + + $res = json_decode($body, true); + if (!is_array($res)) { + return array( + 'res_cd' => 'JSON_ERROR', + 'res_msg' => 'KCP 거래등록 API 응답을 해석할 수 없습니다.', + 'call_url' => '', + 'reg_cert_key' => '', + ); + } + + return array( + 'res_cd' => isset($res['res_cd']) ? $res['res_cd'] : '', + 'res_msg' => isset($res['res_msg']) ? $res['res_msg'] : '', + 'call_url' => isset($res['call_url']) ? $res['call_url'] : '', + 'reg_cert_key' => isset($res['reg_cert_key']) ? $res['reg_cert_key'] : '', + ); + } + + public function get_cert_data($reg_cert_key, $ordr_idxx) + { + $req_json = json_encode(array( + 'reg_cert_key' => $reg_cert_key, + 'ordr_idxx' => $ordr_idxx, + ), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + if ($req_json === false) { + return array('res_cd' => 'JSON_ERROR', 'res_msg' => 'KCP 본인확인 결과조회 요청 데이터를 생성할 수 없습니다.'); + } + + $headers = array( + 'Content-Type: application/json', + 'site_cd: '.$this->site_cd, + ); + + $body = $this->http_post($this->dec_url, $req_json, $headers); + if ($body === false || $body === '') { + return array( + 'res_cd' => 'HTTP_ERROR', + 'res_msg' => $this->last_error ? $this->last_error : 'KCP 본인확인 결과조회 API 응답이 없습니다.', + ); + } + + $res = json_decode($body, true); + if (!is_array($res)) { + return array('res_cd' => 'JSON_ERROR', 'res_msg' => 'KCP 본인확인 결과조회 API 응답을 해석할 수 없습니다.'); + } + + $res_cd = isset($res['res_cd']) ? $res['res_cd'] : ''; + $res_msg = isset($res['res_msg']) ? $res['res_msg'] : ''; + + if ($res_cd !== '0000') { + return array('res_cd' => $res_cd, 'res_msg' => $res_msg); + } + + $enc_cert_data = isset($res['enc_cert_data']) ? $res['enc_cert_data'] : ''; + $rv = isset($res['rv']) ? $res['rv'] : ''; + + $plain = Crypto_KCP_V2::decryptJson($enc_cert_data, $rv, $this->enc_key, $this->site_cd); + if ($plain === false || $plain === '') { + return array('res_cd' => 'DECRYPT_ERROR', 'res_msg' => 'KCP 본인확인 결과 데이터를 복호화할 수 없습니다.'); + } + + $dec = json_decode($plain, true); + if (!is_array($dec)) { + return array('res_cd' => 'JSON_ERROR', 'res_msg' => 'KCP 본인확인 복호화 데이터를 해석할 수 없습니다.'); + } + + return array( + 'res_cd' => $res_cd, + 'res_msg' => $res_msg, + 'phone_no' => isset($dec['phone_no']) ? $dec['phone_no'] : '', + 'user_name' => isset($dec['user_name']) ? $dec['user_name'] : '', + 'birth_day' => isset($dec['birth_day']) ? $dec['birth_day'] : '', + 'comm_id' => isset($dec['comm_id']) ? $dec['comm_id'] : '', + 'sex_code' => isset($dec['sex_code']) ? $dec['sex_code'] : '', + 'local_code' => isset($dec['local_code']) ? $dec['local_code'] : '', + 'ci' => isset($dec['CI']) ? $dec['CI'] : (isset($dec['ci']) ? $dec['ci'] : ''), + 'di' => isset($dec['DI']) ? $dec['DI'] : (isset($dec['di']) ? $dec['di'] : ''), + 'ci_url' => isset($dec['CI_URL']) ? urldecode($dec['CI_URL']) : '', + 'di_url' => isset($dec['DI_URL']) ? urldecode($dec['DI_URL']) : '', + ); + } + + private function http_post($url, $body, $headers) + { + $this->last_error = ''; + + $ch = curl_init($url); + if (!$ch) { + $this->last_error = 'cURL 초기화에 실패했습니다.'; + return false; + } + + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + curl_setopt($ch, CURLOPT_POSTFIELDS, $body); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + $resp = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + if ($resp === false) { + $this->last_error = 'KCP API 통신 실패: '.curl_error($ch); + } else if ($http_code && ($http_code < 200 || $http_code >= 300)) { + $this->last_error = 'KCP API HTTP 오류: '.$http_code; + } + curl_close($ch); + + if ($this->last_error) { + return false; + } + + return $resp; + } + } +} diff --git a/skin/member/basic/member_cert_refresh.skin.php b/skin/member/basic/member_cert_refresh.skin.php index 6ed192978..08f33847a 100644 --- a/skin/member/basic/member_cert_refresh.skin.php +++ b/skin/member/basic/member_cert_refresh.skin.php @@ -117,6 +117,10 @@ if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipi $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/skin/member/basic/password_lost.skin.php b/skin/member/basic/password_lost.skin.php index 04f12ce71..956894e0b 100644 --- a/skin/member/basic/password_lost.skin.php +++ b/skin/member/basic/password_lost.skin.php @@ -92,6 +92,10 @@ $(function() { $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/skin/member/basic/register_form.skin.php b/skin/member/basic/register_form.skin.php index 678c67cb2..9a597272d 100644 --- a/skin/member/basic/register_form.skin.php +++ b/skin/member/basic/register_form.skin.php @@ -440,6 +440,10 @@ $(function() { $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/skin/social/social_register_member.skin.php b/skin/social/social_register_member.skin.php index 8539af452..aa1bc7558 100644 --- a/skin/social/social_register_member.skin.php +++ b/skin/social/social_register_member.skin.php @@ -354,6 +354,10 @@ $email_msg = $is_exists_email ? '등록할 이메일이 중복되었습니다. $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/theme/basic/mobile/skin/member/basic/member_cert_refresh.skin.php b/theme/basic/mobile/skin/member/basic/member_cert_refresh.skin.php index 19e6d5686..d45519ebc 100644 --- a/theme/basic/mobile/skin/member/basic/member_cert_refresh.skin.php +++ b/theme/basic/mobile/skin/member/basic/member_cert_refresh.skin.php @@ -121,6 +121,10 @@ if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipi $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/theme/basic/mobile/skin/member/basic/password_lost.skin.php b/theme/basic/mobile/skin/member/basic/password_lost.skin.php index 04f12ce71..956894e0b 100644 --- a/theme/basic/mobile/skin/member/basic/password_lost.skin.php +++ b/theme/basic/mobile/skin/member/basic/password_lost.skin.php @@ -92,6 +92,10 @@ $(function() { $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/theme/basic/mobile/skin/member/basic/register_form.skin.php b/theme/basic/mobile/skin/member/basic/register_form.skin.php index 76e6f7a0d..543adcdfa 100644 --- a/theme/basic/mobile/skin/member/basic/register_form.skin.php +++ b/theme/basic/mobile/skin/member/basic/register_form.skin.php @@ -427,6 +427,10 @@ if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipi $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/theme/basic/skin/member/basic/member_cert_refresh.skin.php b/theme/basic/skin/member/basic/member_cert_refresh.skin.php index 6ed192978..08f33847a 100644 --- a/theme/basic/skin/member/basic/member_cert_refresh.skin.php +++ b/theme/basic/skin/member/basic/member_cert_refresh.skin.php @@ -117,6 +117,10 @@ if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipi $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/theme/basic/skin/member/basic/password_lost.skin.php b/theme/basic/skin/member/basic/password_lost.skin.php index 04f12ce71..956894e0b 100644 --- a/theme/basic/skin/member/basic/password_lost.skin.php +++ b/theme/basic/skin/member/basic/password_lost.skin.php @@ -92,6 +92,10 @@ $(function() { $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp'; diff --git a/theme/basic/skin/member/basic/register_form.skin.php b/theme/basic/skin/member/basic/register_form.skin.php index 9173ca313..923561fbe 100644 --- a/theme/basic/skin/member/basic/register_form.skin.php +++ b/theme/basic/skin/member/basic/register_form.skin.php @@ -440,6 +440,10 @@ $(function() { $cert_url = G5_KCPCERT_URL.'/kcpcert_form.php'; $cert_type = 'kcp-hp'; break; + case 'kcp_v2': + $cert_url = G5_KCPCERT_V2_URL.'/kcpcert_form.php'; + $cert_type = 'kcp_v2-hp'; + break; case 'lg': $cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php'; $cert_type = 'lg-hp';