결제가 갑자기 안됩니다. KCP는 크롬패치만 하면 http라도 상관이 없나요?
본문
영카트 기본으로 이니시스 사용중인 쇼핑몰이 크롬(모바일)에서 결제가 안되고 로그인이 풀리면서 "장바구니가 비었습니다"라고 떠서 크롬80 패치를 하고 SSL보안 인증서를 설치하는 잘 되더군요.
한달 전에 도움받고^^ 잘 마무리하였습니다.
근데 아미나빌더를 사용하고 KCP를 사용하는 쇼핑몰이 있는데 어제부터 똑같은 부분으로 결제가 안되더군요.
아미나빌더 1.8.15 / 그누보드 5.3.2.8 / 영카트 5.3.2.8
common.php파일에서 https://sir.kr/co_notice/1299 에 나와있는 패치를 진행하였습니다.
그런데 그대로 "장바구니가 비었습니다"라고 뜨던데 KCP는 http를 사용하면서도 크롬패치만 하면 되는게 아닌가 싶었는데 KCP도 https(SSL)를 설치해야되는지. 아님 아미나빌더는 common.php 파일말고 다른 부분을 패치해야하나요?
문뜩 궁금한 것이 http를 사용하는 영카트는 크롬이슈로 결제가 안될건데 제가 쇼핑몰을 둘러보면 http로 사용하는 쇼핑몰이 많더라고요.
그래서 KCP는 https 안해도 되나해서 질문해봅니다.
아마 임대몰이라서 될듯하고 영카트는 다들 https로 바꾼 게 아닌가 생각도 됩니다.
결론은 SSL설치는 안했고 크롬80이슈 common.php 패치만 진행하였는데 안되네요 ㅠㅜ.
lib/common.lib.php 변경부분
common.php 변경부분
// SESSION 설정
//------------------------------------------------------------------------------
@ini_set("session.use_trans_sid", 0); // PHPSESSID를 자동으로 넘기지 않음
@ini_set("url_rewriter.tags",""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.)
session_save_path(G5_SESSION_PATH);
if (isset($SESSION_CACHE_LIMITER))
@session_cache_limiter($SESSION_CACHE_LIMITER);
else
@session_cache_limiter("no-cache, must-revalidate");
ini_set("session.cache_expire", 180); // 세션 캐쉬 보관시간 (분)
ini_set("session.gc_maxlifetime", 10800); // session data의 garbage collection 존재 기간을 지정 (초)
ini_set("session.gc_probability", 1); // session.gc_probability는 session.gc_divisor와 연계하여 gc(쓰레기 수거) 루틴의 시작 확률을 관리합니다. 기본값은 1입니다. 자세한 내용은 session.gc_divisor를 참고하십시오.
ini_set("session.gc_divisor", 100); // session.gc_divisor는 session.gc_probability와 결합하여 각 세션 초기화 시에 gc(쓰레기 수거) 프로세스를 시작할 확률을 정의합니다. 확률은 gc_probability/gc_divisor를 사용하여 계산합니다. 즉, 1/100은 각 요청시에 GC 프로세스를 시작할 확률이 1%입니다. session.gc_divisor의 기본값은 100입니다.
session_set_cookie_params(0, '/');
ini_set("session.cookie_domain", G5_COOKIE_DOMAIN);
if( ! class_exists('XenoPostToForm') ){
class XenoPostToForm
{
public static function check() {
return !isset($_COOKIE['PHPSESSID']) && count($_POST) && ((isset($_SERVER['HTTP_REFERER']) && !preg_match('~^https://'.preg_quote($_SERVER['HTTP_HOST'], '~').'/~', $_SERVER['HTTP_REFERER']) || (! $_SERVER['HTTP_REFERER'] && isset($_POST['P_NOTI'])) ));
return !isset($_COOKIE['PHPSESSID']) && count($_POST) && ((isset($_SERVER['HTTP_REFERER']) && !preg_match('~^https://'.preg_quote($_SERVER['HTTP_HOST'], '~').'/~', $_SERVER['HTTP_REFERER']) || ! isset($_SERVER['HTTP_REFERER']) ));
}
public static function submit($posts) {
echo '<html><head><meta charset="UTF-8"></head><body>';
echo '<form id="f" name="f" method="post">';
echo self::makeInputArray($posts);
echo '</form>';
echo '<script>';
echo 'document.f.submit();';
echo '</script></body></html>';
exit;
}
public static function makeInputArray($posts) {
$res = array();
foreach($posts as $k => $v) {
$res[] = self::makeInputArray_($k, $v);
}
return implode('', $res);
}
private static function makeInputArray_($k, $v) {
if(is_array($v)) {
$res = array();
foreach($v as $i => $j) {
$res[] = self::makeInputArray_($k.'['.htmlspecialchars($i).']', $j);
}
return implode('', $res);
}
return '<input type="hidden" name="'.$k.'" value="'.htmlspecialchars($v).'" />';
}
}
}
if( !function_exists('shop_check_is_pay_page') ){
function shop_check_is_pay_page(){
$shop_dir = 'shop';
$mobile_dir = G5_MOBILE_DIR;
// PG 결제사의 리턴페이지 목록들
$pg_checks_pages = array(
$shop_dir.'/inicis/INIStdPayReturn.php', // 영카트 5.2.9.5 이하에서 사용됨, 그 이상버전에서는 파일 삭제됨
$shop_dir.'/inicis/inistdpay_return.php', // 영카트 5.2.9.6 이상에서 사용됨
$mobile_dir.'/'.$shop_dir.'/inicis/pay_return.php',
$mobile_dir.'/'.$shop_dir.'/inicis/pay_approval.php',
$shop_dir.'/lg/returnurl.php',
$mobile_dir.'/'.$shop_dir.'/lg/returnurl.php',
$mobile_dir.'/'.$shop_dir.'/lg/xpay_approval.php',
);
$server_script_name = str_replace('\\', '/', $_SERVER['SCRIPT_NAME']);
// PG 결제사의 리턴페이지이면
foreach( $pg_checks_pages as $pg_page ){
if( preg_match('~'.preg_quote($pg_page).'$~i', $server_script_name) ){
return true;
}
}
return false;
}
}
// PG 결제시에 세션이 없으면 내 호출페이지를 다시 호출하여 쿠키 PHPSESSID를 살려내어 세션값을 정상적으로 불러오게 합니다.
// 위와 같이 코드를 전부 한페이지에 넣은 이유는 이전 버전 사용자들이 패치시 어려울수 있으므로 한페이지에 코드를 다 넣었습니다.
if(XenoPostToForm::check()) {
if ( shop_check_is_pay_page() ){ // PG 결제 리턴페이지에서만 사용
XenoPostToForm::submit($_POST); // session_start(); 하기 전에
}
}
//==============================================================================
// 공용 변수
//------------------------------------------------------------------------------
// 기본환경설정
// 기본적으로 사용하는 필드만 얻은 후 상황에 따라 필드를 추가로 얻음
$config = sql_fetch(" select * from {$g5['config_table']} ");
// 본인인증 또는 쇼핑몰 사용시에만 secure; SameSite=None 로 설정합니다.
if( $config['cf_cert_use'] || (defined('G5_YOUNGCART_VER') && G5_YOUNGCART_VER) ) {
// Chrome 80 버전부터 아래 이슈 대응
if(!function_exists('session_start_samesite')) {
function session_start_samesite($options = array())
{
$res = @session_start($options);
// IE 브라우저 또는 엣지브라우저 일때는 secure; SameSite=None 을 설정하지 않습니다.
if( preg_match('/Edge/i', $_SERVER['HTTP_USER_AGENT']) || preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT']) || preg_match('~Trident/7.0(; Touch)?; rv:11.0~',$_SERVER['HTTP_USER_AGENT']) ){
return $res;
}
$headers = headers_list();
krsort($headers);
foreach ($headers as $header) {
if (!preg_match('~^Set-Cookie: PHPSESSID=~', $header)) continue;
$header = preg_replace('~; secure(; HttpOnly)?$~', '', $header) . '; secure; SameSite=None';
header($header, false);
break;
}
return $res;
}
}
session_start_samesite();
} else {
@session_start();
}
//==============================================================================