From e784186b0f11afede4eb6673b7177b08f91c1b2e Mon Sep 17 00:00:00 2001 From: whitedot Date: Mon, 7 Sep 2026 05:42:46 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20SIRK=20=EC=A0=84=EC=9A=A9=20=EC=B9=B4?= =?UTF-8?q?=EC=B9=B4=EC=98=A4=ED=8E=98=EC=9D=B4=20=EC=97=B0=EB=8F=99=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=EC=99=80=20=EA=B8=B0=EC=A1=B4=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=20=EC=A7=80=EC=9B=90=20=EC=A0=88=EC=B0=A8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 전용 신규 결제와 자동 취소를 차단하고 기존 주문 조회 및 실제 PG 취소 확인 후 수동 정리를 지원한다. 기존 DB와 일반 PG 경로를 보존하고 5.6.37 전환 및 사후지원 절차를 문서화한다. 검증: 변경 PHP 문법, SIRK 요청 차단, 설치 스키마 및 쇼핑몰 후설치 검사 통과. 실제 PG 결제·취소 검증은 별도 진행한다. --- README.md | 1 + adm/css/admin.css | 2 - adm/shop_admin/configform.php | 69 +------- adm/shop_admin/configformupdate.php | 15 -- adm/shop_admin/inorderformupdate.php | 5 +- adm/shop_admin/orderform.php | 16 +- adm/shop_admin/orderformcartupdate.php | 18 +- adm/shop_admin/orderpartcancel.php | 4 + adm/shop_admin/orderpartcancelupdate.php | 4 + common.php | 1 - docs/sirk-kakaopay-retirement.md | 44 +++++ install/gnuboard5shop.sql | 5 - mobile/shop/kcp/orderform.1.php | 4 +- mobile/shop/orderform.sub.php | 33 +--- mobile/shop/orderformupdate.php | 25 +-- mobile/shop/orderinquiryview.php | 4 +- shop/ajax.orderdatasave.php | 4 + shop/cancel_pg.inc.php | 7 +- shop/kakaopay/_common.php | 2 - shop/kakaopay/incKakaopayCommon.php | 58 ------ shop/kakaopay/inicis_kk_return.php | 85 +-------- shop/kakaopay/kakaopay_cancel.php | 87 +-------- shop/kakaopay/kakaopay_result.php | 28 --- shop/kakaopay/makesignature.php | 42 +---- shop/kakaopay/mobile_orderform.1.php | 130 -------------- shop/kakaopay/mobile_pay_approval.php | 204 +-------------------- shop/kakaopay/mobile_pay_result.php | 40 ----- shop/kakaopay/mobile_pay_return.php | 5 +- shop/kakaopay/mobile_settle_common.php | 5 +- shop/kakaopay/orderform.1.php | 179 ------------------- shop/kakaopay/orderform.2.php | 19 -- shop/kakaopay/orderform.3.php | 2 - shop/kakaopay/orderpartcancel.inc.php | 62 +------ shop/kakaopay/pc_pay_result.php | 214 ----------------------- shop/kakaopay/retired.php | 13 ++ shop/orderform.sub.php | 31 +--- shop/orderformupdate.php | 27 +-- shop/orderinquirycancel.php | 4 + shop/orderinquiryview.php | 4 +- shop/settle_kakaopay.inc.php | 7 +- theme/basic/shop/orderinquiryview.php | 4 +- 41 files changed, 161 insertions(+), 1352 deletions(-) create mode 100644 docs/sirk-kakaopay-retirement.md delete mode 100644 shop/kakaopay/_common.php delete mode 100644 shop/kakaopay/incKakaopayCommon.php delete mode 100644 shop/kakaopay/kakaopay_result.php delete mode 100644 shop/kakaopay/mobile_orderform.1.php delete mode 100644 shop/kakaopay/mobile_pay_result.php delete mode 100644 shop/kakaopay/orderform.1.php delete mode 100644 shop/kakaopay/orderform.2.php delete mode 100644 shop/kakaopay/orderform.3.php delete mode 100644 shop/kakaopay/pc_pay_result.php create mode 100644 shop/kakaopay/retired.php diff --git a/README.md b/README.md index f860d687d..bed8d0eb2 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,7 @@ php bin/check-runtime-ddl.php ## 문서 및 지원 +- [5.6.37 SIRK 전용 카카오페이 연동 종료 및 기존 거래 지원](docs/sirk-kakaopay-retirement.md) - [그누보드5 공식 페이지](https://sir.kr/main/g5/) - [그누보드5 공식 매뉴얼](https://sir.kr/manuals/g5/1) - [그누보드5 Q&A](https://sir.kr/questions?s_tag=%EA%B7%B8%EB%88%84%EB%B3%B4%EB%93%9C5) diff --git a/adm/css/admin.css b/adm/css/admin.css index 9877286db..7431fc089 100644 --- a/adm/css/admin.css +++ b/adm/css/admin.css @@ -696,7 +696,6 @@ a.scf_pgreg {display:inline-block;margin:5px 0 0;padding:5px 10px;background:#22 a.kcp_btn {display:inline-block;margin:5px 0 0;padding:5px 10px;background:#226C8B;color:#fff;font-weight:normal;text-decoration:none} a.lg_btn{display:inline-block;margin:5px 0 0;padding:5px 10px;background:#ED008C;color:#fff;font-weight:normal;text-decoration:none} a.kg_btn{display:inline-block;margin:5px 0 0;padding:5px 10px;background:#4A2C7C;color:#fff;font-weight:normal;text-decoration:none} -a.kakao_btn{display:inline-block;margin:5px 0 0;padding:5px 10px;background:#FDDC2F;color:#3B1E1E;font-weight:normal;text-decoration:none} a.naver_btn {display:inline-block;margin:5px 0 0;padding:5px 10px;background:#00C73C;color:#fff;font-weight:normal;text-decoration:none} a.nicepay_btn{display:inline-block;margin:5px 0 0;padding:5px 10px;background:#0057bf;color:#fff;font-weight:normal;text-decoration:none} @@ -740,7 +739,6 @@ ul.de_pg_tab li.tab-current a{background:#2CC185;color:#fff} .lg_info_fld th{background-color:#FFF4FA} .lg_info_fld_v2 th{background-color:#ffe8f5} .inicis_info_fld th{background-color:#F6F1FF} -.kakao_info_fld th{background-color:#FFFCED} .naver_info_fld th{background-color:#F3FFF3} .nicepay_info_fld th{background-color:#d1e6ff} diff --git a/adm/shop_admin/configform.php b/adm/shop_admin/configform.php index 0e2ec2133..b6c295e8e 100644 --- a/adm/shop_admin/configform.php +++ b/adm/shop_admin/configform.php @@ -31,11 +31,15 @@ if( function_exists('pg_setting_check') ){ pg_setting_check(true); } -if(!$default['de_kakaopay_cancelpwd']){ - $default['de_kakaopay_cancelpwd'] = '1111'; -} ?> + +
+

5.6.37부터 SIRK 전용 카카오페이 연동을 지원하지 않습니다. 기존 거래는 이니시스 상점관리자에서 승인·취소 내역을 확인해 주십시오.

+

기존 이용 고객 지원: 김민섭 minsup@sir.kr

+
+ +
@@ -780,46 +784,6 @@ if(!$default['de_kakaopay_cancelpwd']){ > - - - - 카카오페이 서비스신청하기 - - - - SIRK - - - - - - 상점정보 > 계약정보 > 부가정보의 웹결제 signkey생성 조회 버튼 클릭, 팝업창에서 생성 버튼 클릭 후 해당 값을 입력합니다."); ?> - - - - - - - - - - - - - - - - KG 이니시스의 SIRK****** 아이디를 받은 상점만 해당됩니다.", 50); ?> - > - - - - - - - - -
NICEPAY 신청하기 @@ -2005,26 +1969,7 @@ if($default['de_iche_use'] || $default['de_vbank_use'] || $default['de_hp_use'] } } - // 카카오페이의 경우 log 디렉토리 체크 - if($default['de_kakaopay_mid'] && $default['de_kakaopay_key'] && $default['de_kakaopay_enckey'] && $default['de_kakaopay_hashkey'] && $default['de_kakaopay_cancelpwd']) { - $log_path = G5_SHOP_PATH.'/kakaopay/log'; - if(!is_dir($log_path)) { - echo ''.PHP_EOL; - } else { - if(!is_writable($log_path)) { - echo ''.PHP_EOL; - } else { - if( function_exists('check_log_folder') && is_writable($log_path) ){ - check_log_folder($log_path); - } - } - } - } } diff --git a/adm/shop_admin/configformupdate.php b/adm/shop_admin/configformupdate.php index f3f263cad..9d404ef3a 100644 --- a/adm/shop_admin/configformupdate.php +++ b/adm/shop_admin/configformupdate.php @@ -189,11 +189,6 @@ $check_sanitize_keys = array( 'de_inicis_cartpoint_use', //KG이니시스 신용카드 포인트 결제 'de_nicepay_mid', //NICEPAY 상점아이디 'de_nicepay_key', //NICEPAY 상점키 -'de_kakaopay_mid', //카카오페이 상점MID -'de_kakaopay_key', //카카오페이 상점키 -'de_kakaopay_enckey', //카카오페이 상점 EncKey -'de_kakaopay_hashkey', //카카오페이 상점 HashKey -'de_kakaopay_cancelpwd', //카카오페이 결제취소 비밀번호 'de_naverpay_mid', //네이버페이 가맹점 아이디 'de_naverpay_cert_key', //네이버페이 가맹점 인증키 'de_naverpay_button_key', //네이버페이 버튼 인증키 @@ -300,11 +295,6 @@ if($de_pg_service == 'kcp' && ! $de_card_test && ($de_iche_use || $de_vbank_use alert('NHN KCP SITE KEY를 입력해 주십시오.'); } -if( $de_kakaopay_enckey && ($de_pg_service === 'inicis' || $de_inicis_lpay_use || $de_inicis_kakaopay_use) ){ - - $warning_msg = 'KG 이니시스 결제 또는 L.pay 또는 KG이니시스 카카오페이를 사용시 결제모듈 중복문제로 카카오페이를 활성화 할수 없습니다. \\n\\n카카오페이 사용을 비활성화 합니다.'; - $de_kakaopay_enckey = ''; -} // // 영카트 default @@ -481,11 +471,6 @@ $sql = " update {$g5['g5_shop_default_table']} de_hp_use = '{$de_hp_use}', de_escrow_use = '{$de_escrow_use}', de_tax_flag_use = '{$de_tax_flag_use}', - de_kakaopay_mid = '{$de_kakaopay_mid}', - de_kakaopay_key = '{$de_kakaopay_key}', - de_kakaopay_enckey = '{$de_kakaopay_enckey}', - de_kakaopay_hashkey = '{$de_kakaopay_hashkey}', - de_kakaopay_cancelpwd = '{$de_kakaopay_cancelpwd}', de_member_reg_coupon_use = '{$de_member_reg_coupon_use}', de_member_reg_coupon_term = '{$de_member_reg_coupon_term}', de_member_reg_coupon_price = '{$de_member_reg_coupon_price}', diff --git a/adm/shop_admin/inorderformupdate.php b/adm/shop_admin/inorderformupdate.php index 06504776c..02b611cfc 100644 --- a/adm/shop_admin/inorderformupdate.php +++ b/adm/shop_admin/inorderformupdate.php @@ -30,6 +30,9 @@ if($w == 'd') { // 주문정보 $data = unserialize(base64_decode($od['dt_data'])); +if (isset($data['od_settle_case']) && $data['od_settle_case'] === 'KAKAOPAY') { + alert('SIRK 전용 카카오페이 미완료 주문은 결제 상태를 이니시스에서 확인한 뒤 사후지원 담당자에게 문의해 주십시오.'); +} $data_od_cp_id = isset($data['od_cp_id']) ? safe_replace_regex($data['od_cp_id'], 'cp_id') : ''; $data_sc_cp_id = isset($data['sc_cp_id']) ? safe_replace_regex($data['sc_cp_id'], 'cp_id') : ''; @@ -210,8 +213,6 @@ if($default['de_tax_flag_use']) { } $od_pg = $default['de_pg_service']; -if($data['od_settle_case'] == 'KAKAOPAY') - $od_pg = 'KAKAOPAY'; $od_email = get_email_address($data['od_email']); $od_name = addslashes(clean_xss_tags($data['od_name'])); diff --git a/adm/shop_admin/orderform.php b/adm/shop_admin/orderform.php index 0c9673ec7..6ba8c8b6f 100644 --- a/adm/shop_admin/orderform.php +++ b/adm/shop_admin/orderform.php @@ -239,6 +239,13 @@ if ($is_nicepay_vbank_pg_cancel) { + +
+

SIRK 전용 카카오페이의 자동 취소 지원이 종료되었습니다. 이니시스 상점관리자에서 전체·부분취소를 처리한 뒤 주문 상태와 환불금액을 정리해 주십시오. 이 화면의 상태 변경은 PG 취소를 수행하지 않습니다.

+

기존 이용 고객 지원: 김민섭 minsup@sir.kr

+ +
+ @@ -1018,7 +1025,7 @@ if ($is_nicepay_vbank_pg_cancel) { 0) { ?> 개인결제추가 - 0 && ($od['od_settle_case'] == '신용카드' || $od['od_settle_case'] == '계좌이체' || $od['od_settle_case'] == 'KAKAOPAY' || ($od['od_pg'] == 'nicepay' && $od['od_settle_case'] == '간편결제'))) { ?> + 0 && ($od['od_settle_case'] == '신용카드' || $od['od_settle_case'] == '계좌이체' || $od['od_settle_case'] == 'KAKAOPAY' || ($od['od_pg'] == 'nicepay' && $od['od_settle_case'] == '간편결제'))) { ?> 부분취소 목록 @@ -1455,16 +1462,13 @@ function form_submit(f) var msg = ""; - + if(status == "취소" || status == "반품" || status == "품절") { var $ct_chk = $("input[name^=ct_chk]"); var chk_cnt = $ct_chk.length; var chked_cnt = $ct_chk.filter(":checked").length; - - var cancel_pg = "카카오페이"; - var cancel_pg = "PG사의 "; - + // 체크하지 않은 나머지 품목이 모두 취소류 상태이면 이번 처리로 주문 전체가 취소된다. var remain_active_cnt = $ct_chk.not(":checked").filter(function() { diff --git a/adm/shop_admin/orderformcartupdate.php b/adm/shop_admin/orderformcartupdate.php index de72c36b7..94ceee6ea 100644 --- a/adm/shop_admin/orderformcartupdate.php +++ b/adm/shop_admin/orderformcartupdate.php @@ -29,6 +29,16 @@ if (in_array($ct_status, $status_normal) || in_array($ct_status, $status_cancel) alert('변경할 상태가 올바르지 않습니다.'); } +// SIRK 주문은 PG 취소를 호출하지 않고, 실제 취소를 확인한 운영자만 로컬 상태를 정리한다. +if (in_array($ct_status, $status_cancel, true)) { + $sirk_order = sql_fetch(" select od_pg from {$g5['g5_shop_order_table']} where od_id = '" . sql_escape_string($od_id) . "' "); + if (isset($sirk_order['od_pg']) && $sirk_order['od_pg'] === 'KAKAOPAY') { + if ($pg_cancel || empty($_POST['sirk_cancel_confirmed'])) { + alert('SIRK 전용 카카오페이는 이니시스 상점관리자에서 실제 취소 여부를 확인한 뒤 주문 상태만 변경해 주십시오.'); + } + } +} + // INIpay PRO 전체취소는 로컬 상품상태를 바꾸기 전에 PG 취소를 먼저 확정한다. // PG 취소 실패 후에도 주문만 취소되어 가상계좌 입금이 남는 상태를 방지한다. $inicis_pro_cancel_preprocessed = false; @@ -455,12 +465,8 @@ if (in_array($ct_status, $status_cancel)) { break; case 'KAKAOPAY': - include_once(G5_SHOP_PATH.'/settle_kakaopay.inc.php'); - $_REQUEST['TID'] = $od['od_tno']; - $_REQUEST['Amt'] = $od['od_receipt_price']; - $_REQUEST['CancelMsg'] = '쇼핑몰 운영자 승인 취소'; - $_REQUEST['PartialCancelCode'] = 0; - include G5_SHOP_PATH.'/kakaopay/kakaopay_cancel.php'; + $pg_res_cd = 'SIRK_RETIRED'; + $pg_res_msg = 'SIRK 전용 카카오페이는 이니시스 상점관리자에서 취소해 주십시오.'; break; default: include_once(G5_SHOP_PATH.'/settle_kcp.inc.php'); diff --git a/adm/shop_admin/orderpartcancel.php b/adm/shop_admin/orderpartcancel.php index 93a09bc18..3037d7dd0 100644 --- a/adm/shop_admin/orderpartcancel.php +++ b/adm/shop_admin/orderpartcancel.php @@ -12,6 +12,10 @@ $od = sql_fetch($sql); if(! (isset($od['od_id']) && $od['od_id'])) alert_close('주문정보가 존재하지 않습니다.'); +if ($od['od_pg'] === 'KAKAOPAY') { + alert_close('SIRK 전용 카카오페이의 자동 취소 지원이 종료되었습니다. 이니시스 상점관리자에서 실제 취소 후 주문 상태와 환불금액을 확인해 주십시오.'); +} + if($od['od_pg'] == 'inicis' && $od['od_settle_case'] == '계좌이체') alert_close('KG이니시스는 신용카드만 부분취소가 가능합니다.'); diff --git a/adm/shop_admin/orderpartcancelupdate.php b/adm/shop_admin/orderpartcancelupdate.php index e86dae80e..4ffb4f0c6 100644 --- a/adm/shop_admin/orderpartcancelupdate.php +++ b/adm/shop_admin/orderpartcancelupdate.php @@ -27,6 +27,10 @@ if(! (isset($od['od_id']) && $od['od_id'])) if($od['od_settle_case'] == '계좌이체' && substr($od['od_receipt_time'], 0, 10) >= G5_TIME_YMD) alert_close('실시간 계좌이체건의 부분취소 요청은 결제일 익일에 가능합니다.'); +if ($od['od_pg'] === 'KAKAOPAY') { + alert_close('SIRK 전용 카카오페이의 자동 취소 지원이 종료되었습니다. 이니시스 상점관리자에서 실제 취소 후 주문 상태와 환불금액을 확인해 주십시오.'); +} + // 금액비교 $od_misu = abs($od['od_misu']); diff --git a/common.php b/common.php index 759f83ef8..831dd8188 100644 --- a/common.php +++ b/common.php @@ -334,7 +334,6 @@ if( !function_exists('shop_check_is_pay_page') ){ $mobile_dir.'/'.$shop_dir.'/lg/returnurl.php', $mobile_dir.'/'.$shop_dir.'/lg/xpay_approval.php', $mobile_dir.'/'.$shop_dir.'/kcp/order_approval_form.php', - $shop_dir.'/kakaopay/inicis_kk_return.php', // 이니시스 카카오페이 (SIRK 로 시작하는 아이디 전용) $plugin_dir."/inicert/ini_result.php", // 이니시스 간편인증 모듈 2021-09-10 http <-> https 간 세션 공유 문제로 인해 추가 $plugin_dir."/inicert/ini_find_result.php", // 이니시스 간편인증 모듈 2021-09-10 http <-> https 간 세션 공유 문제로 인해 추가 ); diff --git a/docs/sirk-kakaopay-retirement.md b/docs/sirk-kakaopay-retirement.md new file mode 100644 index 000000000..42ab40639 --- /dev/null +++ b/docs/sirk-kakaopay-retirement.md @@ -0,0 +1,44 @@ +# SIRK 전용 카카오페이 연동 종료와 기존 고객 지원 + +## 적용 범위 + +적용 예정 버전은 **5.6.37**이다. `SIRK`로 시작하는 KG이니시스 카카오페이 전용 MID와 주문의 `od_pg = 'KAKAOPAY'` 경로를 정리한다. 일반 KG이니시스/INIpay PRO, NHN KCP, NICEPAY 등 PG에 포함된 카카오페이는 계속 사용할 수 있다. + +기존 이용 고객 사후지원 담당은 **김민섭(minsup@sir.kr)**이다. 실제 고객 안내·거래 확인·지원 완료 여부는 배포 담당자가 별도로 기록한다. 이 문서 작성이나 코드 변경만으로 고객 안내가 완료된 것은 아니다. + +## 변경 내용 + +- 쇼핑몰설정의 전용 MID·웹결제 사인키·키패스워드·사용 여부·숨겨진 HashKey 입력과 저장을 제거한다. 기존 전용 설정이 남아 있는 사이트에는 종료와 지원 연락처를 안내한다. +- PC·모바일 주문서에서 전용 결제 선택지를 제거하고, 이전 주문서의 POST와 임시 주문 저장도 서버에서 차단한다. +- 전용 서명·승인 요청 코드를 제거한다. 이전 결제창의 서명·승인·반환·통보 URL은 HTTP 410과 종료 안내를 반환하며, PG 요청이나 DB 변경, 통보 성공 응답을 수행하지 않는다. 서명 URL은 오류 JSON을 반환한다. +- 기존 주문 조회·매출 표시·영수증 표시는 유지한다. 구매자 자동 취소와 관리자 자동 전체·부분취소는 지원 안내로 차단한다. 다른 PG의 기본 분기로 넘기지 않는다. +- 운영자가 실제 PG 취소를 확인한 경우에만 주문관리의 확인 항목을 체크하고 상품 상태를 취소·반품·품절로 정리할 수 있다. 이 동작은 PG 취소나 환불금액의 자동 반영을 수행하지 않는다. +- 신규 설치 SQL에서 전용 설정 컬럼 5개를 제외한다. 기존 DB의 컬럼·설정값·주문·임시 주문·결제 로그는 삭제하지 않는다. `de_kakaopay_iniapi_key`를 추가하거나 다른 인증키로 치환하지 않는다. +- `shop/settle_kakaopay.inc.php`는 이전 테마의 초기화 include 호환을 위해 비활성화 상태만 반환한다. 자동 취소 경로의 이전 파일도 실패 안내용으로 유지한다. 결제용 내부 폼·결과 파일은 제거하므로 커스텀 테마의 직접 참조는 배포 전에 정리한다. + +## 배포 전 진행 중 거래 정리 + +1. 담당자가 기존 이용 고객에게 적용 버전과 실제 배포 시각, 지원 연락처를 안내하고 현재 사용 여부와 취소 처리 방식을 확인한다. +2. 전용 결제를 사용 중인 사이트는 배포 전 점검 시간을 잡고, 주문 접수 점검으로 새 주문서 진입과 신규 결제 시작을 막는다. 기존 승인·반환 URL은 점검 차단 대상에서 제외한다. 기존 코드에서는 사용 설정을 끄면 진행 중 승인도 차단되므로, 거래 정리 전에 전용 사용 설정부터 해제하지 않는다. 이미 열린 결제창은 별도로 확인한다. +3. 이 단계에서는 기존 승인·반환 경로를 유지한다. 진행 중 결제의 종료를 기다리고 이니시스 거래내역과 쇼핑몰 주문·임시 주문·결제 로그를 대조한다. 고정된 대기 시간만으로 완료됐다고 판단하지 않는다. +4. PG 승인만 있고 주문이 없는 거래, 처리 중 취소, 미확인 반환 요청이 있으면 담당자가 먼저 해결한다. 미완료 주문의 자동 복구는 종료 버전에서 차단하므로 배포 전에 정리하거나 담당자 지원 대상으로 명시한다. +5. 진행 중 거래가 정리된 것을 확인하고 DB·설정·소스를 백업한 뒤 종료 버전을 배포한다. 고객별 배포·안내·미해결 거래 여부를 기록한다. +6. 배포 후에도 이전 URL 요청이 도착하면 성공 처리하지 않는다. 재결제를 유도하지 않고 담당자가 PG 승인 여부를 확인해 주문 누락·중복 결제를 처리한다. + +고객의 운영 상황을 확인하지 않은 상태에서 종료 코드를 먼저 배포하면 진행 중 거래의 주문 반영이 중단될 수 있다. 배포 전 확인이 끝나지 않은 고객은 일정을 조정한다. + +## 기존 거래 취소·부분취소 지원 + +1. 운영자가 거래 당시의 SIRK MID로 이니시스 상점관리자에 접속하고 주문번호·거래번호·승인금액·기존 취소금액을 대조한다. 이미 취소된 건을 다시 취소하지 않는다. +2. 해당 거래의 전체 또는 부분취소 가능 여부를 확인해 처리한다. 상점관리자에서 처리할 수 없는 건은 사후지원 담당자가 KG이니시스와 확인한다. +3. 이니시스의 실제 완료 상태·취소금액·잔액을 확인한다. 쇼핑몰 로그의 `cancel`이나 주문 상태만으로 PG 취소 완료를 판단하지 않는다. +4. 쇼핑몰 주문관리에서 실제 취소 확인 항목을 체크한 뒤 해당 상품의 상태를 정리한다. 상태 변경만으로 PG 취소가 실행되거나 환불금액이 입력되지는 않는다. +5. 주문관리의 결제취소/환불 금액에 PG에서 확인한 **누적 환불금액**을 반영하고 미수금·잔액을 대조한다. 상점메모에 처리 시각·금액·담당자·PG 확인 결과를 기록한다. +6. 부분취소는 선택 상품과 세금·배송비·쿠폰 처리 범위를 함께 확인한다. 주문 상태 변경에 따른 재고 복원·포인트 환급과 실제 지급 내역도 대조하여 중복 처리하지 않는다. +7. 구매자에게 완료 결과를 안내한다. 주문·임시 주문·로그는 확인 자료로 보존하며, 인증키·개인정보·거래 식별정보를 공개 이슈나 변경 기록에 게시하지 않는다. + +## 검증과 지원 기록 + +`php bin/check-sirk-retirement.php`로 이전 결제·취소 요청의 차단, PG 성공 오인 방지, 잔여 참조와 설정 제거를 검사한다. 신규 설치 SQL 변경 후에는 마이그레이션 스키마 검사와 쇼핑몰 설치 검사를 함께 수행한다. + +배포 담당자는 고객별로 안내 일시, 적용 버전/시각, 진행 중 거래 확인 결과, 실제 취소 경로, 지원 상태와 후속 담당자를 비공개로 관리한다. 테스트 결제·실거래 확인과 고객 안내는 코드 검사와 구분해서 기록한다. diff --git a/install/gnuboard5shop.sql b/install/gnuboard5shop.sql index 76ff86b48..27526b8ad 100644 --- a/install/gnuboard5shop.sql +++ b/install/gnuboard5shop.sql @@ -384,11 +384,6 @@ 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_naverpay_mid` varchar(255) NOT NULL DEFAULT '', `de_naverpay_cert_key` varchar(255) NOT NULL DEFAULT '', `de_naverpay_button_key` varchar(255) NOT NULL DEFAULT '', diff --git a/mobile/shop/kcp/orderform.1.php b/mobile/shop/kcp/orderform.1.php index 06bf875f6..4b5fac859 100644 --- a/mobile/shop/kcp/orderform.1.php +++ b/mobile/shop/kcp/orderform.1.php @@ -1,8 +1,8 @@ - -
@@ -561,16 +554,10 @@ if($is_kakaopay_use) { $escrow_title = "에스크로 "; } - 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'] || is_inicis_simple_pay()) { + 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'] || is_inicis_simple_pay()) { echo '
    '; } - // 카카오페이 - if($is_kakaopay_use) { - $multi_settle++; - echo '
  • '.PHP_EOL; - $checked = ''; - } // 무통장입금 사용 if ($default['de_bank_use']) { @@ -794,9 +781,6 @@ if($is_kakaopay_use) { require_once(G5_MSHOP_PATH.'/kcp/easypay_form.2.php'); } - if($is_kakaopay_use) { - require_once(G5_SHOP_PATH.'/kakaopay/orderform.2.php'); - } ?> @@ -1087,7 +1068,7 @@ $(function() { $("#show_pay_btn").css("display", "inline"); }); - $("#od_settle_iche,#od_settle_card,#od_settle_vbank,#od_settle_hp,#od_settle_easy_pay,#od_settle_kakaopay,#od_settle_samsungpay,#od_settle_nhnkcp_payco,#od_settle_nhnkcp_naverpay,#od_settle_nhnkcp_naverpay_money,#od_settle_nhnkcp_kakaopay,#od_settle_inicislpay,#od_settle_inicis_kakaopay").bind("click", function() { + $("#od_settle_iche,#od_settle_card,#od_settle_vbank,#od_settle_hp,#od_settle_easy_pay,#od_settle_samsungpay,#od_settle_nhnkcp_payco,#od_settle_nhnkcp_naverpay,#od_settle_nhnkcp_naverpay_money,#od_settle_nhnkcp_kakaopay,#od_settle_inicislpay,#od_settle_inicis_kakaopay").bind("click", function() { $("#settle_bank").hide(); $("#show_req_btn").css("display", "inline"); $("#show_pay_btn").css("display", "none"); @@ -1326,16 +1307,6 @@ function pay_approval() } } - // 카카오페이 지불 - if(settle_method == "KAKAOPAY") { - - pf.SupplyAmt.value = parseInt(pf.comm_tax_mny.value) + parseInt(pf.comm_free_mny.value); - pf.GoodsVat.value = parseInt(pf.comm_vat_mny.value); - - pf.good_mny.value = f.good_mny.value; - getTxnId(pf); - return false; - } var form_order_method = ''; diff --git a/mobile/shop/orderformupdate.php b/mobile/shop/orderformupdate.php index 34bea95c6..10da3f72a 100644 --- a/mobile/shop/orderformupdate.php +++ b/mobile/shop/orderformupdate.php @@ -1,5 +1,11 @@ 이 주문의 취소·환불은 쇼핑몰 고객센터에 문의해 주십시오.

    '; + } elseif ($custom_cancel) { ?> diff --git a/shop/ajax.orderdatasave.php b/shop/ajax.orderdatasave.php index 4dfcb2081..9e877e4ce 100644 --- a/shop/ajax.orderdatasave.php +++ b/shop/ajax.orderdatasave.php @@ -15,6 +15,10 @@ sql_query($sql); */ $od_settle_case = isset($_POST['od_settle_case']) ? clean_xss_tags($_POST['od_settle_case'], 1, 1) : ''; +if ($od_settle_case === 'KAKAOPAY') { + die('이 결제 방식은 더 이상 지원하지 않습니다. 다른 결제수단을 선택해 주십시오.'); +} + // 저장되는 원본에도 정제한 값을 반영한다. $_POST['od_settle_case'] = $od_settle_case; diff --git a/shop/cancel_pg.inc.php b/shop/cancel_pg.inc.php index 17e832657..d57181241 100644 --- a/shop/cancel_pg.inc.php +++ b/shop/cancel_pg.inc.php @@ -22,11 +22,8 @@ switch($od_pg) { include G5_SHOP_PATH.'/nicepay/cancel_process.php'; break; case 'KAKAOPAY': - $_REQUEST['TID'] = $tno; - $_REQUEST['Amt'] = $amount; - $_REQUEST['CancelMsg'] = $cancel_msg; - $_REQUEST['PartialCancelCode'] = 0; - include G5_SHOP_PATH.'/kakaopay/kakaopay_cancel.php'; + $pg_res_cd = 'SIRK_RETIRED'; + $pg_res_msg = 'SIRK 전용 카카오페이는 이니시스 상점관리자에서 취소해 주십시오.'; break; default: include G5_SHOP_PATH.'/kcp/pp_ax_hub_cancel.php'; diff --git a/shop/kakaopay/_common.php b/shop/kakaopay/_common.php deleted file mode 100644 index c7ed3c4ee..000000000 --- a/shop/kakaopay/_common.php +++ /dev/null @@ -1,2 +0,0 @@ -()\[\]\{\}]/i", "", strip_tags($_POST['orderNumber'])) : 0; -$session_order_num = get_session('ss_order_id'); - -if( !$orderNumber ){ - alert("주문번호가 없습니다."); -} - -$sql = " select * from {$g5['g5_shop_order_data_table']} where od_id = '$orderNumber' "; -$row = sql_fetch($sql); - -if( empty($row) ){ - alert("임시 주문정보가 저장되지 않았습니다."); -} - -if ( base64_encode(base64_decode($row['dt_data'], true)) === $row['dt_data']){ - $data = unserialize(base64_decode($row['dt_data'])); -} else { - $data = unserialize($row['dt_data']); -} - -$params = array(); -$var_datas = array(); - -foreach($data as $key=>$value) { - if(is_array($value)) { - foreach($value as $k=>$v) { - $_POST[$key][$k] = $params[$key][$k] = addslashes(clean_xss_tags(strip_tags(stripslashes($v)))); - } - } else { - $_POST[$key] = $params[$key] = addslashes(clean_xss_tags(strip_tags(stripslashes($value)))); - } -} - -if(isset($data['pp_id']) && $data['pp_id']) { //개인결제 - - foreach($params as $key=>$value){ - - if( in_array($key, array('pp_name', 'pp_email', 'pp_hp', 'pp_settle_case')) ){ - - $var_datas[$key] = $value; - - $$key = $value; - } - - } - - include_once(G5_SHOP_PATH.'/personalpayformupdate.php'); - -} else { //상점주문 - - foreach($params as $key=>$value){ - - if( in_array($key, array('od_price', 'od_name', 'od_tel', 'od_hp', 'od_email', 'od_memo', 'od_settle_case', 'max_temp_point', 'od_temp_point', 'od_bank_account', 'od_deposit_name', 'od_test', 'od_ip', 'od_zip', 'od_addr1', 'od_addr2', 'od_addr3', 'od_addr_jibeon', 'od_b_name', 'od_b_tel', 'od_b_hp', 'od_b_addr1', 'od_b_addr2', 'od_b_addr3', 'od_b_addr_jibeon', 'od_b_zip', 'od_send_cost', 'od_send_cost2', 'od_hope_date')) ){ - - $var_datas[$key] = $value; - - $$key = $value; - } - - } - - $od_send_cost = (int) $_POST['od_send_cost']; - $od_send_cost2 = (int) $_POST['od_send_cost2']; - - include_once(G5_SHOP_PATH.'/orderformupdate.php'); -} \ No newline at end of file +// 이전 결제창의 요청을 성공 처리하지 않고 종료 안내를 반환한다. +require dirname(__FILE__) . '/retired.php'; diff --git a/shop/kakaopay/kakaopay_cancel.php b/shop/kakaopay/kakaopay_cancel.php index cdb3800f3..e83972af8 100644 --- a/shop/kakaopay/kakaopay_cancel.php +++ b/shop/kakaopay/kakaopay_cancel.php @@ -1,85 +1,6 @@ isset($default['de_kakaopay_iniapi_key']) ? $default['de_kakaopay_iniapi_key'] : '', - 'mid' => $default['de_kakaopay_mid'], - 'paymethod' => 'Card', - 'tid' => $tno, - 'msg' => $cancel_msg // 취소사유 - ); - - $response = inicis_tid_cancel($args); - $result = json_decode($response, true); - - if (isset($result['resultCode'])) { - if ($result['resultCode'] != '00') { - $pg_res_cd = $result['resultCode']; - $pg_res_msg = $result['resultMsg']; - } - } else { - $pg_res_cd = ''; - $pg_res_msg = 'curl 로 데이터를 받지 못했습니다.'; - } -} \ No newline at end of file +// 이전 호출부가 남아 있어도 PG 취소 성공으로 처리하지 않는다. +$pg_res_cd = 'SIRK_RETIRED'; +$pg_res_msg = 'SIRK 전용 카카오페이의 자동 취소 지원이 종료되었습니다. 이니시스 상점관리자에서 실제 취소 후 주문 상태와 환불금액을 확인해 주십시오.'; diff --git a/shop/kakaopay/kakaopay_result.php b/shop/kakaopay/kakaopay_result.php deleted file mode 100644 index ee0508a2e..000000000 --- a/shop/kakaopay/kakaopay_result.php +++ /dev/null @@ -1,28 +0,0 @@ - '올바른 방법으로 이용해 주십시오.'))); -} - -$orderNumber = get_session('ss_order_id'); -$price = preg_replace('#[^0-9]#', '', $_POST['price']); - -if (strlen($price) < 1) { - die(json_encode(array('error' => '가격이 올바르지 않습니다.'))); -} - -// -//################################### -// 2. 가맹점 확인을 위한 signKey를 해시값으로 변경 (SHA-256방식 사용) -//################################### -$mKey = hash("sha256", $default['de_kakaopay_key']); - -/* - //*** 위변조 방지체크를 signature 생성 *** - oid, price, timestamp 3개의 키와 값을 - key=value 형식으로 하여 '&'로 연결한 하여 SHA-256 Hash로 생성 된값 - ex) oid=INIpayTest_1432813606995&price=819000×tamp=2012-02-01 09:19:04.004 - * key기준 알파벳 정렬 - * timestamp는 반드시 signature생성에 사용한 timestamp 값을 timestamp input에 그대로 사용하여야함 - */ -$params = "oid=" . $orderNumber . "&price=" . $price . "×tamp=" . $timestamp; -$sign = hash("sha256", $params); - -die(json_encode(array('error'=>'', 'mKey'=>$mKey, 'timestamp'=>$timestamp, 'sign'=>$sign))); +header('HTTP/1.1 410 Gone'); +header('Content-Type: application/json; charset=utf-8'); +header('Cache-Control: no-store'); +echo json_encode(array('error' => '이 결제 방식은 더 이상 지원하지 않습니다. 다른 결제수단을 선택해 주십시오.')); +exit; diff --git a/shop/kakaopay/mobile_orderform.1.php b/shop/kakaopay/mobile_orderform.1.php deleted file mode 100644 index 1b4c86ced..000000000 --- a/shop/kakaopay/mobile_orderform.1.php +++ /dev/null @@ -1,130 +0,0 @@ - - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    - - \ No newline at end of file diff --git a/shop/kakaopay/mobile_pay_approval.php b/shop/kakaopay/mobile_pay_approval.php index de3e3c55b..183eb0b63 100644 --- a/shop/kakaopay/mobile_pay_approval.php +++ b/shop/kakaopay/mobile_pay_approval.php @@ -1,203 +1,3 @@ $it_stock_qty) - $error .= "{$row['ct_option']} 의 재고수량이 부족합니다. 현재고수량 : $it_stock_qty 개\\n\\n"; - } - - if($i == 0) - alert('장바구니가 비어 있습니다.', G5_SHOP_URL.'/cart.php'); - - if ($error != "") - { - $error .= "결제진행이 중단 되었습니다."; - alert($error, G5_SHOP_URL.'/cart.php'); - } -} - -if($_REQUEST['P_STATUS'] != '00') { - alert('오류 : '.iconv_utf8($_REQUEST['P_RMESG1']).' 코드 : '.$_REQUEST['P_STATUS'], $page_return_url); -} else { - $post_data = array( - 'P_MID' => $default['de_kakaopay_mid'], - 'P_TID' => $_REQUEST['P_TID'] - ); - - $ch = curl_init(); - curl_setopt($ch, CURLOPT_PORT, 443); - curl_setopt($ch, CURLOPT_URL, $p_req_url); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $return = curl_exec($ch); - - if(!$return) - alert('KG이니시스와 통신 오류로 결제등록 요청을 완료하지 못했습니다.\\n결제등록 요청을 다시 시도해 주십시오.', $page_return_url); - - // 결과를 배열로 변환 - parse_str($return, $ret); - $PAY = array_map('trim', $ret); - $PAY = array_map('strip_tags', $PAY); - $PAY = array_map('get_search_string', $PAY); - - if($PAY['P_STATUS'] != '00') - alert('오류 : '.iconv_utf8($PAY['P_RMESG1']).' 코드 : '.$PAY['P_STATUS'], $page_return_url); - - // TID, AMT 를 세션으로 주문완료 페이지 전달 - $hash = md5($PAY['P_TID'].$PAY['P_MID'].$PAY['P_AMT']); - set_session('P_TID', $PAY['P_TID']); - set_session('P_AMT', $PAY['P_AMT']); - set_session('P_HASH', $hash); -} - -$params = array(); - -//개인결제 -if(isset($data['pp_id']) && !empty($data['pp_id'])) { - // 개인결제 정보 - $pp_check = false; - $sql = " select * from {$g5['g5_shop_personalpay_table']} where pp_id = '{$PAY['P_OID']}' and pp_tno = '{$PAY['P_TID']}' and pp_use = '1' "; - $pp = sql_fetch($sql); - - if( !$pp['pp_tno'] && $data['pp_id'] == $oid ){ - $res_cd = $PAY['P_STATUS']; - $pp_id = $oid; - - $exclude = array('res_cd', 'P_HASH', 'P_TYPE', 'P_AUTH_DT', 'P_VACT_BANK', 'LGD_PAYKEY', 'pp_id', 'good_mny', 'pp_name', 'pp_email', 'pp_hp', 'pp_settle_case'); - - foreach($data as $key=>$v) { - if( !in_array($key, $exclude) ){ - $_POST[$key] = $params[$key] = clean_xss_tags(strip_tags($v)); - } - } - - $good_mny = $PAY['P_AMT']; - $pp_name = addslashes(clean_xss_tags($data['pp_name'])); - $pp_email = addslashes(clean_xss_tags($data['pp_email'])); - $pp_hp = addslashes(clean_xss_tags($data['pp_hp'])); - $pp_settle_case = addslashes(clean_xss_tags($data['pp_settle_case'])); - - $_POST['P_HASH'] = $hash; - $_POST['P_AUTH_NO'] = $PAY['P_AUTH_NO']; - $_POST['pp_id'] = $PAY['P_OID']; - $_POST['good_mny'] = $PAY['P_AMT']; - - $_POST['P_TYPE'] = $PAY['P_TYPE']; - $_POST['P_AUTH_DT'] = $PAY['P_AUTH_DT']; - $_POST['P_AUTH_NO'] = $PAY['P_AUTH_NO']; - $_POST['P_HPP_CORP'] = isset($PAY['P_HPP_CORP']) ? $PAY['P_HPP_CORP'] : ''; - $_POST['P_APPL_NUM'] = isset($PAY['P_APPL_NUM']) ? $PAY['P_APPL_NUM'] : ''; - $_POST['P_VACT_NUM'] = isset($PAY['P_VACT_NUM']) ? $PAY['P_VACT_NUM'] : ''; - $_POST['P_VACT_NAME'] = isset($PAY['P_VACT_NAME']) ? iconv_utf8($PAY['P_VACT_NAME']) : ''; - $_POST['P_VACT_BANK'] = (isset($PAY['P_VACT_BANK_CODE']) && isset($BANK_CODE[$PAY['P_VACT_BANK_CODE']])) ? $BANK_CODE[$PAY['P_VACT_BANK_CODE']] : ''; - $_POST['P_CARD_ISSUER'] = (isset($PAY['P_CARD_ISSUER_CODE']) && isset($CARD_CODE[$PAY['P_CARD_ISSUER_CODE']])) ? $CARD_CODE[$PAY['P_CARD_ISSUER_CODE']] : ''; - $_POST['P_UNAME'] = iconv_utf8($PAY['P_UNAME']); - - include_once( G5_MSHOP_PATH.'/personalpayformupdate.php' ); - } - -} else { - // 상점 결제 - $exclude = array('res_cd', 'P_HASH', 'P_TYPE', 'P_AUTH_DT', 'P_VACT_BANK', 'P_AUTH_NO'); - - foreach($data as $key=>$value) { - if(!empty($exclude) && in_array($key, $exclude)) - continue; - - if(is_array($value)) { - foreach($value as $k=>$v) { - $_POST[$key][$k] = $params[$key][$k] = clean_xss_tags(strip_tags($v)); - } - } else { - $_POST[$key] = $params[$key] = clean_xss_tags(strip_tags($value)); - } - } - - $res_cd = $_POST['res_cd'] = $PAY['P_STATUS']; - $P_HASH = $_POST['P_HASH'] = $hash; - $P_TYPE = $_POST['P_TYPE'] = $PAY['P_TYPE']; - $P_AUTH_DT = $_POST['P_AUTH_DT'] = $PAY['P_AUTH_DT']; - $P_AUTH_NO = $_POST['P_AUTH_NO'] = $PAY['P_AUTH_NO']; - $P_HPP_CORP = $_POST['P_HPP_CORP'] = isset($PAY['P_HPP_CORP']) ? $PAY['P_HPP_CORP'] : ''; - $P_APPL_NUM = $_POST['P_APPL_NUM'] = isset($PAY['P_APPL_NUM']) ? $PAY['P_APPL_NUM'] : ''; - $P_VACT_NUM = $_POST['P_VACT_NUM'] = isset($PAY['P_VACT_NUM']) ? $PAY['P_VACT_NUM'] : ''; - $P_VACT_NAME = $_POST['P_VACT_NAME'] = isset($PAY['P_VACT_NAME']) ? iconv_utf8($PAY['P_VACT_NAME']) : ''; - $P_VACT_BANK = $_POST['P_VACT_BANK'] = (isset($PAY['P_VACT_BANK_CODE']) && isset($BANK_CODE[$PAY['P_VACT_BANK_CODE']])) ? $BANK_CODE[$PAY['P_VACT_BANK_CODE']] : ''; - $P_CARD_ISSUER = $_POST['P_CARD_ISSUER'] = (isset($PAY['P_CARD_ISSUER_CODE']) && isset($CARD_CODE[$PAY['P_CARD_ISSUER_CODE']])) ? $CARD_CODE[$PAY['P_CARD_ISSUER_CODE']] : ''; - $P_UNAME = $_POST['P_UNAME'] = iconv_utf8($PAY['P_UNAME']); - - $check_keys = array('od_name', 'od_tel', 'od_pwd', 'od_hp', 'od_zip', 'od_addr1', 'od_addr2', 'od_addr3', 'od_addr_jibeon', 'od_email', 'ad_default', 'ad_subject', 'od_hope_date', 'od_b_name', 'od_b_tel', 'od_b_hp', 'od_b_zip', 'od_b_addr1', 'od_b_addr2', 'od_b_addr3', 'od_b_addr_jibeon', 'od_memo', 'od_settle_case', 'max_temp_point', 'od_temp_point', 'od_send_cost', 'od_send_cost2', 'od_bank_account', 'od_deposit_name', 'od_test', 'od_ip'); - - foreach($check_keys as $key){ - $$key = isset($params[$key]) ? $params[$key] : ''; - } - - include_once( G5_MSHOP_PATH.'/orderformupdate.php' ); -} -exit; \ No newline at end of file +// 이전 결제창의 요청을 성공 처리하지 않고 종료 안내를 반환한다. +require dirname(__FILE__) . '/retired.php'; diff --git a/shop/kakaopay/mobile_pay_result.php b/shop/kakaopay/mobile_pay_result.php deleted file mode 100644 index 5f49a5ed6..000000000 --- a/shop/kakaopay/mobile_pay_result.php +++ /dev/null @@ -1,40 +0,0 @@ - - -', 10); -?> - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - \ No newline at end of file diff --git a/shop/kakaopay/orderform.2.php b/shop/kakaopay/orderform.2.php deleted file mode 100644 index 6d27e6445..000000000 --- a/shop/kakaopay/orderform.2.php +++ /dev/null @@ -1,19 +0,0 @@ - - -
    - - - - - - - - -
    - - isset($default['de_kakaopay_iniapi_key']) ? $default['de_kakaopay_iniapi_key'] : '', - 'mid' => $default['de_kakaopay_mid'], - 'paymethod' => get_type_inicis_paymethod($od['od_settle_case']), - 'tid' => $od['od_tno'], - 'msg' => $od['od_id'].' '.$mod_memo, - 'price' => $price, - 'confirmPrice' => $confirm_price, - 'tax' => $tax, - 'taxFree' => $taxfree -); - -$response = inicis_tid_cancel($args, true); // KG 이니시스 부분취소일 경우 inicis_tid_cancel 함수 2번째 인자값을 true로 -$result = json_decode($response, true); - -if (isset($result['resultCode']) && $result['resultCode'] == '00') { - // 환불금액기록 - $tno = $result['prtcTid']; - $re_price = $result['prtcPrice']; - - $sql = " update {$g5['g5_shop_order_table']} - set od_refund_price = od_refund_price + '$re_price', - od_shop_memo = concat(od_shop_memo, \"$mod_memo\") - where od_id = '{$od['od_id']}' - and od_tno = '$tno' "; - sql_query($sql); - - // 미수금 등의 정보 업데이트 - $info = get_order_info($od_id); - - $sql = " update {$g5['g5_shop_order_table']} - set od_misu = '{$info['od_misu']}', - od_tax_mny = '{$info['od_tax_mny']}', - od_vat_mny = '{$info['od_vat_mny']}', - od_free_mny = '{$info['od_free_mny']}' - where od_id = '$od_id' "; - sql_query($sql); - } else { - if (isset($result['resultCode'])){ - alert($result['resultMsg'].' 코드 : '.$result['resultCode']); - } else { - alert('curl 오류로 부분환불에 실패했습니다.'); - } - } \ No newline at end of file +alert('SIRK 전용 카카오페이의 자동 취소 지원이 종료되었습니다. 이니시스 상점관리자에서 실제 취소 후 주문 상태와 환불금액을 확인해 주십시오.'); +exit; diff --git a/shop/kakaopay/pc_pay_result.php b/shop/kakaopay/pc_pay_result.php deleted file mode 100644 index f32823b4a..000000000 --- a/shop/kakaopay/pc_pay_result.php +++ /dev/null @@ -1,214 +0,0 @@ -makeHash(signKey, "sha256"); // 가맹점 확인을 위한 signKey를 해시값으로 변경 (SHA-256방식 사용) - $mKey = hash("sha256", $signKey); - - //##################### - // 2.signature 생성 - //##################### - $signParam['authToken'] = $authToken; // 필수 - $signParam['timestamp'] = $timestamp; // 필수 - // signature 데이터 생성 (모듈에서 자동으로 signParam을 알파벳 순으로 정렬후 NVP 방식으로 나열해 hash) - $signature = $util->makeSignature($signParam); - - - //##################### - // 3.API 요청 전문 생성 - //##################### - $authMap['mid'] = $default['de_kakaopay_mid']; // 필수 - $authMap['authToken'] = $authToken; // 필수 - $authMap['signature'] = $signature; // 필수 - $authMap['timestamp'] = $timestamp; // 필수 - $authMap['charset'] = $charset; // default=UTF-8 - $authMap['format'] = $format; // default=XML - //if(null != notiUrl && notiUrl.length() > 0){ - // authMap.put("notiUrl" ,notiUrl); - //} - - - try { - - $httpUtil = new HttpClient(); - - //##################### - // 4.API 통신 시작 - //##################### - - $authResultString = ""; - if ($httpUtil->processHTTP($authUrl, $authMap)) { - $authResultString = $httpUtil->body; - } else { - echo "Http Connect Error\n"; - echo $httpUtil->errormsg; - - throw new Exception("Http Connect Error"); - } - - //############################################################ - //5.API 통신결과 처리(***가맹점 개발수정***) - //############################################################ - - $resultMap = json_decode($authResultString, true); - - $tid = $resultMap['tid']; - $oid = preg_replace('/[^A-Za-z0-9\-_]/', '', $resultMap['MOID']); - - /************************* 결제보안 추가 2016-05-18 START ****************************/ - $secureMap['mid'] = $default['de_kakaopay_mid']; //mid - $secureMap['tstamp'] = $timestamp; //timestemp - $secureMap['MOID'] = $resultMap['MOID']; //MOID - $secureMap['TotPrice'] = $resultMap['TotPrice']; //TotPrice - - // signature 데이터 생성 - $secureSignature = $util->makeSignatureAuth($secureMap); - /************************* 결제보안 추가 2016-05-18 END ****************************/ - - $sql = " select * from {$g5['g5_shop_order_data_table']} where od_id = '$oid' "; - $row = sql_fetch($sql); - - $data = isset($row['dt_data']) ? unserialize(base64_decode($row['dt_data'])) : array(); - - if(isset($data['pp_id']) && $data['pp_id']) { - $page_return_url = G5_SHOP_URL.'/personalpayform.php?pp_id='.$data['pp_id']; - } else { - $page_return_url = G5_SHOP_URL.'/orderform.php'; - if(get_session('ss_direct')) - $page_return_url .= '?sw_direct=1'; - } - - if ((strcmp('0000', $resultMap['resultCode']) == 0) && (strcmp($secureSignature, $resultMap['authSignature']) == 0) ) { //결제보안 추가 2016-05-18 - /* * *************************************************************************** - * 여기에 가맹점 내부 DB에 결제 결과를 반영하는 관련 프로그램 코드를 구현한다. - - [중요!] 승인내용에 이상이 없음을 확인한 뒤 가맹점 DB에 해당건이 정상처리 되었음을 반영함 - 처리중 에러 발생시 망취소를 한다. - * **************************************************************************** */ - - //최종결제요청 결과 성공 DB처리 - $tno = $resultMap['tid']; - $amount = $resultMap['TotPrice']; - $app_time = $resultMap['applDate'].$resultMap['applTime']; - $pay_method = $resultMap['payMethod']; - $pay_type = $PAY_METHOD[$pay_method]; - $depositor = isset($resultMap['VACT_InputName']) ? $resultMap['VACT_InputName'] : ''; - $commid = ''; - $mobile_no = isset($resultMap['HPP_Num']) ? $resultMap['HPP_Num'] : ''; - $app_no = $resultMap['applNum']; - $card_name = $CARD_CODE[$resultMap['CARD_Code']]; - switch($pay_type) { - case '계좌이체': - $bank_name = $BANK_CODE[$resultMap['ACCT_BankCode']]; - if ($default['de_escrow_use'] == 1) - $escw_yn = 'Y'; - break; - case '가상계좌': - $bankname = $BANK_CODE[$resultMap['VACT_BankCode']]; - $account = $resultMap['VACT_Num'].' '.$resultMap['VACT_Name']; - $app_no = $resultMap['VACT_Num']; - if ($default['de_escrow_use'] == 1) - $escw_yn = 'Y'; - break; - default: - break; - } - - $inicis_pay_result = true; - - } else { - $s = '(오류코드:'.$resultMap['resultCode'].') '.$resultMap['resultMsg']; - alert($s, $page_return_url); - } - - // 수신결과를 파싱후 resultCode가 "0000"이면 승인성공 이외 실패 - // 가맹점에서 스스로 파싱후 내부 DB 처리 후 화면에 결과 표시 - // payViewType을 popup으로 해서 결제를 하셨을 경우 - // 내부처리후 스크립트를 이용해 opener의 화면 전환처리를 하세요 - //throw new Exception("강제 Exception"); - } catch (Exception $e) { - // $s = $e->getMessage() . ' (오류코드:' . $e->getCode() . ')'; - //#################################### - // 실패시 처리(***가맹점 개발수정***) - //#################################### - //---- db 저장 실패시 등 예외처리----// - $s = $e->getMessage() . ' (오류코드:' . $e->getCode() . ')'; - echo $s; - - //##################### - // 망취소 API - //##################### - - $netcancelResultString = ""; // 망취소 요청 API url(고정, 임의 세팅 금지) - if ($httpUtil->processHTTP($netCancel, $authMap)) { - $netcancelResultString = $httpUtil->body; - } else { - echo "Http Connect Error\n"; - echo $httpUtil->errormsg; - - throw new Exception("Http Connect Error"); - } - - echo "## 망취소 API 결과 ##"; - - $netcancelResultString = str_replace("<", "<", $$netcancelResultString); - $netcancelResultString = str_replace(">", ">", $$netcancelResultString); - - echo "
    ", $netcancelResultString . "
    "; - // 취소 결과 확인 - } - } else { - - //############# - // 인증 실패시 - //############# - echo "
    "; - echo "####인증실패####"; - - ob_start(); - var_dump($_REQUEST); - $debug_msg = ob_get_contents(); - ob_clean(); - - echo "
    " . strip_tags($debug_msg) . "
    "; - } -} catch (Exception $e) { - $s = $e->getMessage() . ' (오류코드:' . $e->getCode() . ')'; - echo $s; -} - -if( !$inicis_pay_result ){ - die("

    결제 에러가 일어났습니다. 에러 이유는 위와 같습니다."); -} \ No newline at end of file diff --git a/shop/kakaopay/retired.php b/shop/kakaopay/retired.php new file mode 100644 index 000000000..47bb05068 --- /dev/null +++ b/shop/kakaopay/retired.php @@ -0,0 +1,13 @@ + + +결제 지원 종료 안내 +

    결제 지원 종료 안내

    +

    이 결제 방식은 더 이상 지원하지 않습니다.

    +

    결제를 진행 중이었다면 다시 결제하지 마시고, 쇼핑몰 고객센터에 승인 여부 확인과 취소·환불을 문의해 주십시오.

    + +
    @@ -263,9 +259,6 @@ if($is_kakaopay_use) { // 결제대행사별 코드 include (결제대행사 정보 필드) require_once(G5_SHOP_PATH.'/'.$default['de_pg_service'].'/orderform.2.php'); - if($is_kakaopay_use) { - require_once(G5_SHOP_PATH.'/kakaopay/orderform.2.php'); - } ?> @@ -579,17 +572,11 @@ if($is_kakaopay_use) { $escrow_title = "에스크로
    "; } - 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'] || (empty($inicis_pro_use) && ($default['de_inicis_lpay_use'] || $default['de_inicis_kakaopay_use'])) || (!empty($inicis_pro_use) && is_inicis_simple_pay())) { + 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'] || (empty($inicis_pro_use) && ($default['de_inicis_lpay_use'] || $default['de_inicis_kakaopay_use'])) || (!empty($inicis_pro_use) && is_inicis_simple_pay())) { echo '
    '; echo '결제방법 선택'; } - // 카카오페이 - if($is_kakaopay_use) { - $multi_settle++; - echo ' '.PHP_EOL; - $checked = ''; - } // 무통장입금 사용 if ($default['de_bank_use']) { @@ -795,7 +782,7 @@ if($is_kakaopay_use) { echo '
'; } - 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'] || (empty($inicis_pro_use) && ($default['de_inicis_lpay_use'] || $default['de_inicis_kakaopay_use'])) || (!empty($inicis_pro_use) && is_inicis_simple_pay())) { + 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'] || (empty($inicis_pro_use) && ($default['de_inicis_lpay_use'] || $default['de_inicis_kakaopay_use'])) || (!empty($inicis_pro_use) && is_inicis_simple_pay())) { echo ''; } @@ -810,9 +797,6 @@ if($is_kakaopay_use) { // 결제대행사별 코드 include (주문버튼) require_once(G5_SHOP_PATH.'/'.$default['de_pg_service'].'/orderform.3.php'); - if($is_kakaopay_use) { - require_once(G5_SHOP_PATH.'/kakaopay/orderform.3.php'); - } ?> - // 카카오페이 지불 - if(settle_method == "KAKAOPAY") { - - f.SupplyAmt.value = parseInt(f.comm_tax_mny.value) + parseInt(f.comm_free_mny.value); - f.GoodsVat.value = parseInt(f.comm_vat_mny.value); - - getTxnId(f); - return false; - } var form_order_method = ''; diff --git a/shop/orderformupdate.php b/shop/orderformupdate.php index f33c51d49..bce7244da 100644 --- a/shop/orderformupdate.php +++ b/shop/orderformupdate.php @@ -1,5 +1,11 @@ 0 || $od['od_status'] != '주문' || $ct['od_count1' alert("취소할 수 있는 주문이 아닙니다.", G5_SHOP_URL."/orderinquiryview.php?od_id=$od_id&uid=$uid"); } +if ($od['od_pg'] === 'KAKAOPAY') { + alert('이 주문의 취소·환불은 쇼핑몰 고객센터에 문의해 주십시오.'); +} + // INIpay PRO 가상계좌 입금통보와 주문자 취소가 동시에 처리되지 않도록 // PG 취소부터 로컬 주문 취소 완료까지 동일 주문 잠금을 유지한다. $inicis_pro_order_lock = ''; diff --git a/shop/orderinquiryview.php b/shop/orderinquiryview.php index 20cd8ee43..59fa0416d 100644 --- a/shop/orderinquiryview.php +++ b/shop/orderinquiryview.php @@ -680,7 +680,9 @@ if($od['od_pg'] == 'lg') { 이 주문의 취소·환불은 쇼핑몰 고객센터에 문의해 주십시오.

'; + } elseif ($custom_cancel) { ?> diff --git a/shop/settle_kakaopay.inc.php b/shop/settle_kakaopay.inc.php index 7c2c2bd5a..c47018e7d 100644 --- a/shop/settle_kakaopay.inc.php +++ b/shop/settle_kakaopay.inc.php @@ -1,8 +1,5 @@ 이 주문의 취소·환불은 쇼핑몰 고객센터에 문의해 주십시오.

'; + } elseif ($custom_cancel) { ?>