Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c91b74d991 | ||
|
|
7ec4d3a66c | ||
|
|
05fe1b0cdb | ||
|
|
0242e8f1a3 | ||
|
|
4e8474f231 | ||
|
|
71209fc7c9 | ||
|
|
375a8336e8 | ||
|
|
120d2960f2 | ||
|
|
9659cceae6 | ||
|
|
7e42eb78e4 | ||
|
|
e475219115 | ||
|
|
c70260c8cf | ||
|
|
bb6ed59052 | ||
|
|
d4dddaca57 | ||
|
|
0080b199ea | ||
|
|
ebd18b6001 | ||
|
|
04a4de4923 | ||
|
|
96df43480b | ||
|
|
6571119db6 | ||
|
|
35acbfa750 | ||
|
|
d9c21ea018 | ||
|
|
68be1c1f86 | ||
|
|
ff1f6d723b | ||
|
|
bb4d345add | ||
|
|
3678b92b2f | ||
|
|
c8d51529d1 | ||
|
|
129d0ea766 | ||
|
|
d80289ff28 | ||
|
|
c4b54a6219 | ||
|
|
8e7ec335c3 | ||
|
|
5a36b2d85d | ||
|
|
2b21804111 | ||
|
|
a21f3103bb | ||
|
|
f7106379b8 | ||
|
|
f4d184979f | ||
|
|
f6ec58ca18 | ||
|
|
a0e86f2bc8 | ||
|
|
4ecacec171 | ||
|
|
913d1c66c7 | ||
|
|
42859072eb | ||
|
|
0ae67a652c | ||
|
|
516eac386f | ||
|
|
188d0e30a0 | ||
|
|
c450f8bbde | ||
|
|
b3aa81c74a | ||
|
|
11a26c82af | ||
|
|
43f626885e | ||
|
|
0b6f081f76 | ||
|
|
adbd9c3acc | ||
|
|
8fcbd2a9b1 | ||
|
|
f8c06a26cb | ||
|
|
1fd5ec46ae | ||
|
|
cbd70fbe18 | ||
|
|
bc07b8383e | ||
|
|
23c60a8ba1 | ||
|
|
abb777016d | ||
|
|
e45bd1d9e1 | ||
|
|
acdbcfd8ba | ||
|
|
1f48f6bd80 | ||
|
|
87d86d317e | ||
|
|
7fa554f396 | ||
|
|
6bc322c9d6 | ||
|
|
43fba4407d | ||
|
|
3d7fa04569 | ||
|
|
82ee3ef438 | ||
|
|
4049c6c164 | ||
|
|
f80ed3946f | ||
|
|
d7d5f26524 |
@@ -0,0 +1,50 @@
|
||||
# 저장소 작업 지침
|
||||
|
||||
## 적용 범위
|
||||
|
||||
이 문서는 저장소 루트와 모든 하위 디렉터리에 적용한다.
|
||||
|
||||
## 문서 작성 언어
|
||||
|
||||
- README, 보안 정책, 설치 안내, 개발 가이드 등 저장소 문서는 원칙적으로 한국어로 작성한다.
|
||||
- 파일명, 코드 식별자, 명령어, API 명칭, 설정값과 외부 서비스의 고유 명칭은 원문을 유지한다.
|
||||
- 영문 문서나 번역본이 별도로 필요한 경우에는 해당 작업에서 명시적으로 요청된 범위에 한해 추가한다.
|
||||
|
||||
## 커밋 메시지
|
||||
|
||||
- 커밋 메시지는 한국어로 작성한다.
|
||||
- 제목은 `<접두어>: <변경 내용>` 형식을 사용한다.
|
||||
- 접두어는 아래 권장 목록에서 변경 목적에 가장 가까운 항목을 선택한다.
|
||||
- 변경 대상을 포함해 무엇을 왜 변경했는지 알 수 있도록 구체적으로 작성한다.
|
||||
- `수정`, `업데이트`, `작업`처럼 변경 내용을 식별하기 어려운 표현만 사용하지 않는다.
|
||||
- 하나의 커밋에는 가능한 한 하나의 목적에 해당하는 변경만 포함한다.
|
||||
- 제목만으로 설명이 부족하면 본문에 변경 이유, 영향 범위와 검증 방법을 추가한다.
|
||||
- 관련 이슈가 있으면 커밋 본문이나 꼬리말에 이슈 번호를 기록한다.
|
||||
|
||||
### 권장 접두어
|
||||
|
||||
- `feat`: 새로운 기능 추가
|
||||
- `fix`: 버그 또는 잘못된 동작 수정
|
||||
- `security`: 보안 취약점 수정이나 보안 강화
|
||||
- `docs`: 문서 추가 또는 변경
|
||||
- `refactor`: 동작 변경 없는 코드 구조 개선
|
||||
- `perf`: 성능 개선
|
||||
- `test`: 테스트 추가 또는 변경
|
||||
- `build`: 빌드 시스템이나 의존성 변경
|
||||
- `ci`: CI/CD 설정이나 자동화 변경
|
||||
- `chore`: 기능과 직접 관련 없는 유지보수 작업
|
||||
- `revert`: 이전 변경 되돌리기
|
||||
|
||||
### 보안 이슈 식별자
|
||||
|
||||
- KVE, CVE 등 식별자가 부여된 보안 이슈를 조치하는 커밋은 제목에 관련 식별자를 반드시 병기한다.
|
||||
- 식별자는 `security:` 접두어 바로 뒤에 원문 그대로 작성한다.
|
||||
- 하나의 커밋이 여러 보안 이슈를 함께 조치하면 관련 식별자를 모두 병기한다.
|
||||
- 예: `security: KVE-2026-1909 모바일 KCP Windows 명령 인자 주입 차단`
|
||||
|
||||
### 작성 예시
|
||||
|
||||
- `docs: Git과 압축파일 설치 절차를 구분해 README에 안내`
|
||||
- `fix: 품목 일부 취소 시 PG 취소금액 불일치 수정`
|
||||
- `security: KVE-2026-1899 상품 정렬값 화이트리스트 검증으로 SQL 삽입 차단`
|
||||
- `refactor: 객체 캐시의 유형별 저장 키 생성 로직 분리`
|
||||
@@ -0,0 +1,78 @@
|
||||
# 그누보드5
|
||||
|
||||
그누보드5는 PHP와 MySQL 또는 MariaDB 기반의 오픈소스 CMS입니다. 게시판과 회원 관리 기능을 제공하며 쇼핑몰 솔루션 영카트를 포함합니다.
|
||||
|
||||
## 버전 확인
|
||||
|
||||
현재 소스 코드의 버전은 [`version.php`](version.php)에서 확인할 수 있습니다.
|
||||
|
||||
## 다운로드 및 설치
|
||||
|
||||
### 설치 환경
|
||||
|
||||
#### 기본 요구사항
|
||||
|
||||
- PHP 5.2.17 이상
|
||||
- 최소 요구 버전은 PHP 5.2.17이며 PHP 7.2 이상을 권장합니다.
|
||||
- MySQL 5.0 이상 또는 MySQL 5.0 이상의 기능을 지원하는 MariaDB
|
||||
- Linux 호환 운영체제
|
||||
|
||||
#### 필수 라이브러리
|
||||
|
||||
- GD Library 2.0 이상
|
||||
- iconv
|
||||
|
||||
#### 추가로 필요한 모듈 및 프로그램
|
||||
|
||||
- 글을 SNS로 복사하는 기능 사용 시
|
||||
- cURL
|
||||
- JSON
|
||||
- 영카트5 모바일 결제 사용 시
|
||||
- SOAP
|
||||
- OpenSSL
|
||||
|
||||
> SIR에서 직접 제작한 그누보드5 및 호환 프로그램은 Linux에서만 개발하고 테스트했습니다. 다른 운영체제에서의 정상 동작은 보장하지 않습니다.
|
||||
|
||||
설치 환경에 관한 자세한 내용은 [그누보드5 공식 매뉴얼](https://sir.kr/manuals/g5/1)을 확인하십시오.
|
||||
|
||||
### Git을 이용하는 방법
|
||||
|
||||
Git을 사용할 수 있는 서버에서는 [GitHub 저장소](https://github.com/gnuboard/gnuboard5)를 복제하여 설치할 수 있습니다.
|
||||
|
||||
```bash
|
||||
git clone https://github.com/gnuboard/gnuboard5.git
|
||||
cd gnuboard5
|
||||
```
|
||||
|
||||
복제한 `gnuboard5` 디렉터리를 웹 서버의 서비스 경로로 사용하거나, 서비스 경로 안에 소스 전체를 배치합니다. 이후 아래의 공통 설치 절차를 진행합니다.
|
||||
|
||||
### 압축파일을 이용하는 방법
|
||||
|
||||
1. 다음 중 한 곳에서 설치할 버전의 압축파일을 내려받습니다.
|
||||
- [GitHub Releases](https://github.com/gnuboard/gnuboard5/releases)에서 원하는 버전을 선택하고 `Source code (zip)`을 내려받습니다. `*.patch.zip` 파일은 기존 설치본을 업데이트하기 위한 패치이므로 신규 설치에는 사용하지 않습니다.
|
||||
- [SIR 그누보드5 다운로드](https://sir.kr/boards/g5_pds)에서 원하는 버전의 배포본을 내려받습니다.
|
||||
2. 내려받은 압축파일을 풉니다.
|
||||
3. 압축을 푼 디렉터리의 파일과 하위 디렉터리를 FTP, SFTP 등의 방법으로 웹 서버의 서비스 경로에 업로드합니다.
|
||||
4. 업로드가 끝나면 아래의 공통 설치 절차를 진행합니다.
|
||||
|
||||
### 공통 설치 절차
|
||||
|
||||
1. 브라우저에서 소스를 배치한 주소로 접속하여 설치 화면을 엽니다.
|
||||
2. `data` 디렉터리를 만들라는 안내가 표시되면 `config.php`가 있는 디렉터리에 `data`를 만들고 웹 서버가 쓸 수 있도록 권한을 설정합니다. 공식 매뉴얼에서는 `707` 권한을 예시로 사용합니다.
|
||||
3. 라이선스 내용을 확인하고 동의한 뒤 설치를 계속합니다.
|
||||
4. MySQL 또는 MariaDB 접속 정보와 최고관리자 정보를 입력합니다.
|
||||
5. 설치 완료 화면을 확인한 뒤 생성한 최고관리자 계정으로 로그인합니다.
|
||||
|
||||
> 기존 사이트에 재설치하면 데이터가 삭제될 수 있습니다. 진행하기 전에 파일과 데이터베이스를 백업하십시오.
|
||||
|
||||
## 문서 및 지원
|
||||
|
||||
- [그누보드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)
|
||||
|
||||
보안 취약점 신고 방법은 [`SECURITY.md`](SECURITY.md)를 확인하십시오.
|
||||
|
||||
## 라이선스
|
||||
|
||||
라이선스 전문과 적용 조건은 [`LICENSE.txt`](LICENSE.txt)를 확인하십시오.
|
||||
|
||||
+4
-2
@@ -1,3 +1,5 @@
|
||||
# Gnuboard5 Security Policy
|
||||
# 그누보드5 보안 정책
|
||||
|
||||
Please ask [https://sir.kr/security/.](https://sir.kr/co_qa)
|
||||
그누보드5에서 보안 취약점을 발견한 경우 악용 가능한 상세 내용을 공개 GitHub 이슈에 게시하지 마십시오.
|
||||
|
||||
취약점 정보와 재현 방법은 [SIR 보안 취약점 신고 게시판](https://sir.kr/boards/co_qa)을 통해 제보해 주십시오.
|
||||
|
||||
@@ -3,6 +3,8 @@ if (!defined('G5_USE_SHOP') || !G5_USE_SHOP) {
|
||||
return;
|
||||
}
|
||||
|
||||
global $default;
|
||||
|
||||
$menu['menu400'] = array(
|
||||
array('400000', '쇼핑몰관리', G5_ADMIN_URL . '/shop_admin/', 'shop_config'),
|
||||
array('400010', '쇼핑몰현황', G5_ADMIN_URL . '/shop_admin/', 'shop_index'),
|
||||
@@ -21,3 +23,8 @@ $menu['menu400'] = array(
|
||||
array('400750', '추가배송비관리', G5_ADMIN_URL . '/shop_admin/sendcostlist.php', 'scf_sendcost', 1),
|
||||
array('400410', '미완료주문', G5_ADMIN_URL . '/shop_admin/inorderlist.php', 'scf_inorder', 1),
|
||||
);
|
||||
|
||||
// 결제방식이 KG이니시스이고 INIpay PRO를 사용할 때만 노출한다.
|
||||
if (isset($default['de_pg_service']) && $default['de_pg_service'] === 'inicis' && !empty($default['de_inicis_pro_use'])) {
|
||||
$menu['menu400'][] = array('400420', 'KG이니시스 PRO 현황', G5_ADMIN_URL . '/shop_admin/inicisloglist.php', 'scf_inicis_log');
|
||||
}
|
||||
|
||||
+2
-2
@@ -52,8 +52,8 @@ $print_version = ($is_admin == 'super') ? 'Version ' . G5_GNUBOARD_VER : '';
|
||||
|
||||
<!-- <p>실행시간 : <?php echo get_microtime() - $begin_time; ?> -->
|
||||
|
||||
<script src="<?php echo G5_ADMIN_URL ?>/admin.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||
<script src="<?php echo G5_JS_URL ?>/jquery.anchorScroll.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||
<script src="<?php echo get_versioned_asset_url(G5_ADMIN_URL.'/admin.js'); ?>"></script>
|
||||
<script src="<?php echo get_versioned_asset_url(G5_JS_URL.'/jquery.anchorScroll.js'); ?>"></script>
|
||||
<script>
|
||||
$(function() {
|
||||
|
||||
|
||||
@@ -8,6 +8,11 @@ if ($is_admin != 'super') {
|
||||
|
||||
$sql_common = " from {$g5['auth_table']} a left join {$g5['member_table']} b on (a.mb_id=b.mb_id) ";
|
||||
|
||||
$allowed_sfl = array('a.mb_id');
|
||||
if (!in_array($sfl, $allowed_sfl)) {
|
||||
$sfl = 'a.mb_id';
|
||||
}
|
||||
|
||||
$sql_search = " where (1) ";
|
||||
if ($stx) {
|
||||
$sql_search .= " and ( ";
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ if (empty($bo_table)) {
|
||||
<script>
|
||||
var g5_admin_csrf_token_key = "<?php echo (function_exists('admin_csrf_token_key')) ? admin_csrf_token_key() : ''; ?>";
|
||||
</script>
|
||||
<script src="<?php echo G5_ADMIN_URL ?>/admin.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||
<script src="<?php echo get_versioned_asset_url(G5_ADMIN_URL.'/admin.js'); ?>"></script>
|
||||
|
||||
<div class="new_win">
|
||||
<h1><?php echo $g5['title']; ?></h1>
|
||||
|
||||
@@ -62,6 +62,12 @@ if ($check_captcha) {
|
||||
}
|
||||
}
|
||||
|
||||
// 저장·검증 전에 경로를 먼저 정규화하여, 검증 이후 경로가 달라지지 않도록 한다.
|
||||
if (function_exists('filter_input_include_path')) {
|
||||
$bo_include_head = filter_input_include_path($bo_include_head);
|
||||
$bo_include_tail = filter_input_include_path($bo_include_tail);
|
||||
}
|
||||
|
||||
if ($file = $bo_include_head) {
|
||||
$file_ext = pathinfo($file, PATHINFO_EXTENSION);
|
||||
|
||||
@@ -86,9 +92,12 @@ if (!is_include_path_check($bo_include_tail, 1)) {
|
||||
alert('하단 파일 경로에 포함시킬수 없는 문자열이 있습니다.');
|
||||
}
|
||||
|
||||
if (function_exists('filter_input_include_path')) {
|
||||
$bo_include_head = filter_input_include_path($bo_include_head);
|
||||
$bo_include_tail = filter_input_include_path($bo_include_tail);
|
||||
if ($bo_include_head && function_exists('is_content_include_allowed') && !is_content_include_allowed($bo_include_head)) {
|
||||
alert('상단 파일 경로로 사용할 수 없는 위치입니다.');
|
||||
}
|
||||
|
||||
if ($bo_include_tail && function_exists('is_content_include_allowed') && !is_content_include_allowed($bo_include_tail)) {
|
||||
alert('하단 파일 경로로 사용할 수 없는 위치입니다.');
|
||||
}
|
||||
|
||||
$board_path = G5_DATA_PATH . '/file/' . $bo_table;
|
||||
|
||||
@@ -12,6 +12,11 @@ if ($is_admin != "super") {
|
||||
$sql_search .= " and (a.gr_id = b.gr_id and b.gr_admin = '{$member['mb_id']}') ";
|
||||
}
|
||||
|
||||
$allowed_sfl = array('bo_table', 'bo_subject', 'a.gr_id');
|
||||
if (!in_array($sfl, $allowed_sfl)) {
|
||||
$sfl = 'bo_table';
|
||||
}
|
||||
|
||||
if ($stx) {
|
||||
$sql_search .= " and ( ";
|
||||
switch ($sfl) {
|
||||
|
||||
@@ -20,6 +20,11 @@ if ($is_admin != 'super') {
|
||||
$sql_search .= " and (gr_admin = '{$member['mb_id']}') ";
|
||||
}
|
||||
|
||||
$allowed_sfl = array('gr_subject', 'gr_id', 'gr_admin');
|
||||
if (!in_array($sfl, $allowed_sfl)) {
|
||||
$sfl = 'gr_subject';
|
||||
}
|
||||
|
||||
if ($stx) {
|
||||
$sql_search .= " and ( ";
|
||||
switch ($sfl) {
|
||||
|
||||
@@ -42,7 +42,7 @@ for ($i = 0; $i < $chk_count; $i++) {
|
||||
} elseif ($act_button == '선택삭제') {
|
||||
$row = sql_fetch(" select count(*) as cnt from {$g5['board_table']} where gr_id = '$gr_id' ");
|
||||
if ($row['cnt']) {
|
||||
alert("이 그룹에 속한 게시판이 존재하여 게시판 그룹을 삭제할 수 없습니다.\\n\\n이 그룹에 속한 게시판을 먼저 삭제하여 주십시오.", './board_list.php?sfl=gr_id&stx=' . $gr_id);
|
||||
alert("이 그룹에 속한 게시판이 존재하여 게시판 그룹을 삭제할 수 없습니다.\\n\\n이 그룹에 속한 게시판을 먼저 삭제하여 주십시오.", './board_list.php?sfl=a.gr_id&stx=' . $gr_id);
|
||||
}
|
||||
|
||||
// 그룹 삭제
|
||||
|
||||
@@ -13,6 +13,11 @@ $sql_common = " from {$g5['group_member_table']} a
|
||||
left outer join {$g5['member_table']} b on (a.mb_id = b.mb_id) ";
|
||||
$sql_search = " where gr_id = '{$gr_id}' ";
|
||||
|
||||
$allowed_sfl = array('a.mb_id');
|
||||
if (!in_array($sfl, $allowed_sfl)) {
|
||||
$sfl = 'a.mb_id';
|
||||
}
|
||||
|
||||
// 회원아이디로 검색되지 않던 오류를 수정
|
||||
if (isset($stx) && $stx) {
|
||||
$sql_search .= " and ( ";
|
||||
|
||||
+26
-17
@@ -1409,7 +1409,7 @@ if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) {
|
||||
<tr>
|
||||
<th scope="row"><label for="cf_twitter_key">트위터 컨슈머 Key</label></th>
|
||||
<td>
|
||||
<input type="text" name="cf_twitter_key" value="<?php echo get_sanitize_input($config['cf_twitter_key']); ?>" id="cf_twitter_key" class="frm_input" size="40"> <a href="https://developer.twitter.com/en/apps" target="_blank" class="btn_frmline">앱 등록하기</a>
|
||||
<input type="text" name="cf_twitter_key" value="<?php echo get_sanitize_input($config['cf_twitter_key']); ?>" id="cf_twitter_key" class="frm_input" size="40"> <a href="https://console.x.com/" target="_blank" class="btn_frmline">앱 등록하기</a>
|
||||
</td>
|
||||
<th scope="row"><label for="cf_twitter_secret">트위터 컨슈머 Secret</label></th>
|
||||
<td>
|
||||
@@ -1419,7 +1419,7 @@ if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) {
|
||||
<tr>
|
||||
<th scope="row"><label for="cf_google_clientid">구글 Client ID</label></th>
|
||||
<td>
|
||||
<input type="text" name="cf_google_clientid" value="<?php echo get_sanitize_input($config['cf_google_clientid']); ?>" id="cf_google_clientid" class="frm_input" size="40"> <a href="https://console.developers.google.com" target="_blank" class="btn_frmline">앱 등록하기</a>
|
||||
<input type="text" name="cf_google_clientid" value="<?php echo get_sanitize_input($config['cf_google_clientid']); ?>" id="cf_google_clientid" class="frm_input" size="40"> <a href="https://console.cloud.google.com/auth/clients" target="_blank" class="btn_frmline">앱 등록하기</a>
|
||||
</td>
|
||||
<th scope="row"><label for="cf_google_secret">구글 Client Secret</label></th>
|
||||
<td>
|
||||
@@ -1435,7 +1435,7 @@ if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) {
|
||||
<tr>
|
||||
<th scope="row"><label for="cf_kakao_rest_key">카카오 REST API 키</label></th>
|
||||
<td>
|
||||
<input type="text" name="cf_kakao_rest_key" value="<?php echo get_sanitize_input($config['cf_kakao_rest_key']); ?>" id="cf_kakao_rest_key" class="frm_input" size="40"> <a href="https://developers.kakao.com/product/kakaoLogin" target="_blank" class="btn_frmline">앱 등록하기</a>
|
||||
<input type="text" name="cf_kakao_rest_key" value="<?php echo get_sanitize_input($config['cf_kakao_rest_key']); ?>" id="cf_kakao_rest_key" class="frm_input" size="40"> <a href="https://developers.kakao.com/console/app" target="_blank" class="btn_frmline">앱 등록하기</a>
|
||||
</td>
|
||||
<th scope="row"><label for="cf_kakao_client_secret">카카오 Client Secret</label></th>
|
||||
<td>
|
||||
@@ -1451,7 +1451,7 @@ if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) {
|
||||
<tr>
|
||||
<th scope="row"><label for="cf_payco_clientid">페이코 Client ID</label></th>
|
||||
<td>
|
||||
<input type="text" name="cf_payco_clientid" value="<?php echo get_sanitize_input($config['cf_payco_clientid']); ?>" id="cf_payco_clientid" class="frm_input" size="40"> <a href="https://developers.payco.com/guide" target="_blank" class="btn_frmline">앱 등록하기</a>
|
||||
<input type="text" name="cf_payco_clientid" value="<?php echo get_sanitize_input($config['cf_payco_clientid']); ?>" id="cf_payco_clientid" class="frm_input" size="40"> <a href="https://developers.payco.com/application/registView" target="_blank" class="btn_frmline">앱 등록하기</a>
|
||||
</td>
|
||||
<th scope="row"><label for="cf_payco_secret">페이코 Secret</label></th>
|
||||
<td>
|
||||
@@ -1616,17 +1616,24 @@ if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) {
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div id="config_captcha_wrap" style="display:none">
|
||||
<h2>캡챠입력</h2>
|
||||
<?php
|
||||
require_once G5_CAPTCHA_PATH . '/captcha.lib.php';
|
||||
$captcha_html = captcha_html();
|
||||
$captcha_js = chk_captcha_js();
|
||||
echo $captcha_html;
|
||||
?>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.btn_fixed_top.btn_confirm {display:flex;align-items:flex-start;gap:8px;z-index:1001}
|
||||
#config_captcha_wrap {max-width:calc(100vw - 40px);padding:10px 12px;border:1px solid #c5cbd5;border-radius:3px;background:#fff;box-shadow:0 2px 8px rgba(0,0,0,0.15);text-align:left}
|
||||
#config_captcha_wrap h2 {margin:0 0 6px;padding:0;font-size:1em;line-height:1.2;color:#3a3a3a}
|
||||
#config_captcha_wrap #mp_captcha_tooltip {margin:6px 0 0;color:#e8180c}
|
||||
</style>
|
||||
|
||||
<div class="btn_fixed_top btn_confirm">
|
||||
<div id="config_captcha_wrap" style="display:none">
|
||||
<h2>캡챠입력</h2>
|
||||
<?php
|
||||
require_once G5_CAPTCHA_PATH . '/captcha.lib.php';
|
||||
$captcha_html = captcha_html();
|
||||
$captcha_js = chk_captcha_js();
|
||||
echo $captcha_html;
|
||||
?>
|
||||
</div>
|
||||
|
||||
<input type="submit" value="확인" class="btn_submit btn" accesskey="s">
|
||||
</div>
|
||||
|
||||
@@ -1731,7 +1738,6 @@ if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) {
|
||||
if(isChanged){
|
||||
$wrap.show();
|
||||
if(! is_invisible_recaptcha) {
|
||||
$wrap.css("margin-top","1em");
|
||||
if(! $("#"+tooptipid).length){ $children.after($p_text) }
|
||||
}
|
||||
} else {
|
||||
@@ -1747,8 +1753,11 @@ if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) {
|
||||
var cf_intercept_ip_val = f.cf_intercept_ip.value;
|
||||
|
||||
if (check_config_captcha_open()){
|
||||
jQuery("html, body").scrollTop(jQuery("#config_captcha_wrap").offset().top);
|
||||
|
||||
// 캡챠는 확인 버튼 옆에 고정 노출되므로 별도 이동 없이 입력란으로 포커스만 옮긴다.
|
||||
if (jQuery("#captcha_key").is(":visible")) {
|
||||
jQuery("#captcha_key").focus();
|
||||
}
|
||||
|
||||
<?php echo $captcha_js; // 캡챠 사용시 자바스크립트에서 입력된 캡챠를 검사함 ?>
|
||||
}
|
||||
|
||||
|
||||
@@ -40,6 +40,12 @@ if ($is_admin !== 'super') {
|
||||
$co_include_tail = '';
|
||||
}
|
||||
}
|
||||
// 저장·검증 전에 경로를 먼저 정규화하여, 검증 이후 경로가 달라지지 않도록 한다.
|
||||
if (function_exists('filter_input_include_path')) {
|
||||
$co_include_head = filter_input_include_path($co_include_head);
|
||||
$co_include_tail = filter_input_include_path($co_include_tail);
|
||||
}
|
||||
|
||||
$co_tag_filter_use = isset($_POST['co_tag_filter_use']) ? (int) $_POST['co_tag_filter_use'] : 1;
|
||||
$co_himg_del = (isset($_POST['co_himg_del']) && $_POST['co_himg_del']) ? 1 : 0;
|
||||
$co_timg_del = (isset($_POST['co_timg_del']) && $_POST['co_timg_del']) ? 1 : 0;
|
||||
@@ -86,6 +92,14 @@ if ($co_include_tail) {
|
||||
}
|
||||
}
|
||||
|
||||
if ($co_include_head && function_exists('is_content_include_allowed') && !is_content_include_allowed($co_include_head)) {
|
||||
alert('상단 파일 경로로 사용할 수 없는 위치입니다.');
|
||||
}
|
||||
|
||||
if ($co_include_tail && function_exists('is_content_include_allowed') && !is_content_include_allowed($co_include_tail)) {
|
||||
alert('하단 파일 경로로 사용할 수 없는 위치입니다.');
|
||||
}
|
||||
|
||||
if ($co_include_head && !is_include_path_check($co_include_head, 1)) {
|
||||
$co_include_head = '';
|
||||
$error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.';
|
||||
@@ -96,11 +110,6 @@ if ($co_include_tail && !is_include_path_check($co_include_tail, 1)) {
|
||||
$error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 하단 파일 경로에 포함시킬수 없습니다.';
|
||||
}
|
||||
|
||||
if (function_exists('filter_input_include_path')) {
|
||||
$co_include_head = filter_input_include_path($co_include_head);
|
||||
$co_include_tail = filter_input_include_path($co_include_tail);
|
||||
}
|
||||
|
||||
$co_seo_title = exist_seo_title_recursive('content', generate_seo_title($co_subject), $g5['content_table'], $co_id);
|
||||
|
||||
$sql_common = " co_include_head = '$co_include_head',
|
||||
@@ -147,6 +156,20 @@ if (function_exists('get_admin_captcha_by')) {
|
||||
g5_delete_cache_by_prefix('content-' . $co_id . '-');
|
||||
|
||||
if ($w == "" || $w == "u") {
|
||||
foreach (array('co_himg', 'co_timg') as $content_img_field) {
|
||||
if (empty($_FILES[$content_img_field]['name']) || empty($_FILES[$content_img_field]['tmp_name']))
|
||||
continue;
|
||||
|
||||
// 상단/하단 이미지 슬롯에는 이미지만 허용하고, 실행 가능한 태그가 담긴 파일은 거부한다.
|
||||
$tmp_file = $_FILES[$content_img_field]['tmp_name'];
|
||||
$is_valid_image = @getimagesize($tmp_file);
|
||||
$head_bytes = @file_get_contents($tmp_file, false, null, 0, 8192);
|
||||
|
||||
if ($is_valid_image === false || ($head_bytes !== false && preg_match('/<\?php|<\?=|<\?|<script/i', $head_bytes))) {
|
||||
alert('상단/하단 이미지에는 이미지 파일만 등록할 수 있습니다.');
|
||||
}
|
||||
}
|
||||
|
||||
if ($_FILES['co_himg']['name']) {
|
||||
$dest_path = G5_DATA_PATH . "/content/" . $co_id . "_h";
|
||||
@move_uploaded_file($_FILES['co_himg']['tmp_name'], $dest_path);
|
||||
|
||||
+4
-13
@@ -354,16 +354,7 @@ border-bottom: 5px solid black;}
|
||||
.excel-download-progress .progress-download-box a:hover { border-color: #6f809a; box-shadow: 0 2px 4px rgba(111, 128, 154, 0.15); }
|
||||
.excel-download-progress .progress-download-box a:active { box-shadow: inset 0 1px 2px rgba(0,0,0,0.1); }
|
||||
|
||||
.field-select-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); margin-top: 15px; gap: 0px 10px; padding: 10px; background-color: #f9fafb; border: 1px solid #e5e7eb; border-radius: 8px; color: #374151; }
|
||||
.field-select-form label { display: flex; align-items: center; cursor: pointer; padding: 6px 10px; border-radius: 4px; }
|
||||
.field-select-form label:hover { background-color: #f3f4f6; }
|
||||
.field-select-form input[type="checkbox"] { margin-right: 8px; transform: scale(1.2); }
|
||||
.field-separator { grid-column: 1 / -1; border-top: 1px solid #d1d5db; margin: 8px 0; }
|
||||
.selected-fields-preview { padding: 8px; background-color: #eef2f7; border: 1px solid #d1d5db; border-radius: 6px; margin: 10px 0px; color: #1f2937; display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
|
||||
.selected-fields-preview strong { padding: 4px 8px; }
|
||||
.selected-fields-preview .field-tag { background-color: #dbeafe; color: #1e40af; padding: 4px 8px; border-radius: 4px; }
|
||||
|
||||
/* 페이지 내 실행 */
|
||||
/* 페이지 내 실행 */
|
||||
.local_cmd {min-width:960px}
|
||||
.local_cmd01 {margin:0 0 10px;padding:0 }
|
||||
.local_cmd01 .cmd_tit {font-weight:bold}
|
||||
@@ -1083,8 +1074,8 @@ box-shadow: 2px 2px 3px 0px rgba(0,0,0,0.2);}
|
||||
.sevice_1 h4{width:100%;padding:0; margin:0;border-top:1px solid #ebe8e8;}
|
||||
.sevice_1 h4 a{display:inline-block;height:75px;padding:10px 0 0;width:100%}
|
||||
|
||||
.svc_card{background:url('../img/service_img1.jpg') no-repeat top center;margin-right:13px;}
|
||||
.svc_card ul li{width:33%;}
|
||||
.svc_card{background:url('../img/service_img1.jpg') no-repeat top center;margin-right:13px;width:520px;}
|
||||
.svc_card ul li{width:25%;box-sizing:border-box;}
|
||||
.svc_phone {background:url('../img/service_img2.jpg') no-repeat top center;margin-right:13px;}
|
||||
.svc_phone ul li{width:50%;}
|
||||
.svc_ipin {background:url('../img/service_img3.jpg') no-repeat top center;}
|
||||
@@ -1217,4 +1208,4 @@ input[type="text"]{max-width:200px}
|
||||
@media only screen and (max-device-width : 480px) and (orientation : portrait){
|
||||
/* Styles */
|
||||
input[type="text"]{max-width:200px}
|
||||
}
|
||||
}
|
||||
|
||||
+258
-1
@@ -374,6 +374,263 @@ if (!sql_query(" DESC `{$g5['member_auto_login_table']}` ", false)) {
|
||||
$is_check = true;
|
||||
}
|
||||
|
||||
// KG이니시스 결제 처리 현황 및 단계별 이력 테이블
|
||||
if (defined('G5_USE_SHOP') && G5_USE_SHOP) {
|
||||
$inicis_pro_config_columns = array(
|
||||
'de_inicis_pro_alert_use' => "ADD COLUMN `de_inicis_pro_alert_use` tinyint(4) NOT NULL DEFAULT '1'",
|
||||
'de_inicis_pro_reconcile_use' => "ADD COLUMN `de_inicis_pro_reconcile_use` tinyint(4) NOT NULL DEFAULT '0'",
|
||||
'de_inicis_pro_log_days' => "ADD COLUMN `de_inicis_pro_log_days` int(11) NOT NULL DEFAULT '365'",
|
||||
'de_inicis_pro_summary_days' => "ADD COLUMN `de_inicis_pro_summary_days` int(11) NOT NULL DEFAULT '1825'",
|
||||
'de_inicis_pro_monitor_at' => "ADD COLUMN `de_inicis_pro_monitor_at` datetime DEFAULT NULL",
|
||||
'de_inicis_pro_monitor_message' => "ADD COLUMN `de_inicis_pro_monitor_message` varchar(255) NOT NULL DEFAULT ''"
|
||||
);
|
||||
$inicis_pro_config_alter = array();
|
||||
foreach ($inicis_pro_config_columns as $column => $alter) {
|
||||
$column_result = sql_query(" SHOW COLUMNS FROM `{$g5['g5_shop_default_table']}` LIKE '$column' ", false);
|
||||
if (!$column_result || sql_num_rows($column_result) === 0)
|
||||
$inicis_pro_config_alter[] = $alter;
|
||||
}
|
||||
if (count($inicis_pro_config_alter)) {
|
||||
sql_query(" ALTER TABLE `{$g5['g5_shop_default_table']}` ".implode(', ', $inicis_pro_config_alter), true);
|
||||
$is_check = true;
|
||||
}
|
||||
|
||||
if (!isset($g5['g5_shop_inicis_pay_table']))
|
||||
$g5['g5_shop_inicis_pay_table'] = G5_SHOP_TABLE_PREFIX.'inicis_pay';
|
||||
if (!isset($g5['g5_shop_inicis_pay_event_table']))
|
||||
$g5['g5_shop_inicis_pay_event_table'] = G5_SHOP_TABLE_PREFIX.'inicis_pay_event';
|
||||
|
||||
if (!sql_query(" DESC `{$g5['g5_shop_inicis_pay_table']}` ", false)) {
|
||||
sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['g5_shop_inicis_pay_table']}` (
|
||||
`ip_id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`ip_oid` varchar(64) NOT NULL DEFAULT '',
|
||||
`ip_tid` varchar(80) NOT NULL DEFAULT '',
|
||||
`ip_auth_tid` varchar(80) NOT NULL DEFAULT '',
|
||||
`ip_mid` varchar(80) NOT NULL DEFAULT '',
|
||||
`ip_environment` varchar(10) NOT NULL DEFAULT '',
|
||||
`mb_id` varchar(20) NOT NULL DEFAULT '',
|
||||
`ip_amount` int(11) NOT NULL DEFAULT '0',
|
||||
`ip_pay_type` varchar(20) NOT NULL DEFAULT '',
|
||||
`ip_easy_pay` varchar(20) NOT NULL DEFAULT '',
|
||||
`ip_device` varchar(10) NOT NULL DEFAULT '',
|
||||
`ip_order_type` varchar(10) NOT NULL DEFAULT '',
|
||||
`ip_status` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_result_code` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_result_message` varchar(255) NOT NULL DEFAULT '',
|
||||
`ip_noti_status` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_noti_code` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_noti_message` varchar(255) NOT NULL DEFAULT '',
|
||||
`ip_noti_failed_count` int(11) NOT NULL DEFAULT '0',
|
||||
`ip_noti_at` datetime DEFAULT NULL,
|
||||
`ip_cancel_status` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_cancel_code` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_cancel_message` varchar(255) NOT NULL DEFAULT '',
|
||||
`ip_cancel_checked_at` datetime DEFAULT NULL,
|
||||
`ip_refund_required` tinyint(4) NOT NULL DEFAULT '0',
|
||||
`ip_vbank_due_at` datetime DEFAULT NULL,
|
||||
`ip_expired_at` datetime DEFAULT NULL,
|
||||
`ip_order_exists` tinyint(4) NOT NULL DEFAULT '0',
|
||||
`ip_approved_at` datetime DEFAULT NULL,
|
||||
`ip_ordered_at` datetime DEFAULT NULL,
|
||||
`ip_notified_at` datetime DEFAULT NULL,
|
||||
`ip_canceled_at` datetime DEFAULT NULL,
|
||||
`ip_created_at` datetime DEFAULT NULL,
|
||||
`ip_updated_at` datetime DEFAULT NULL,
|
||||
`ip_ip` varchar(45) NOT NULL DEFAULT '',
|
||||
`ip_event_count` int(11) NOT NULL DEFAULT '0',
|
||||
`ip_audit_error` tinyint(4) NOT NULL DEFAULT '0',
|
||||
`ip_alerted_at` datetime DEFAULT NULL,
|
||||
`ip_alert_key` varchar(64) NOT NULL DEFAULT '',
|
||||
`ip_pg_status` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_pg_amount` int(11) NOT NULL DEFAULT '0',
|
||||
`ip_pg_tid` varchar(80) NOT NULL DEFAULT '',
|
||||
`ip_pg_result_code` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_pg_message` varchar(255) NOT NULL DEFAULT '',
|
||||
`ip_pg_checked_at` datetime DEFAULT NULL,
|
||||
PRIMARY KEY (`ip_id`),
|
||||
UNIQUE KEY `ip_oid` (`ip_oid`),
|
||||
KEY `ip_tid` (`ip_tid`),
|
||||
KEY `ip_auth_tid` (`ip_auth_tid`),
|
||||
KEY `ip_status` (`ip_status`),
|
||||
KEY `ip_noti_status` (`ip_noti_status`),
|
||||
KEY `ip_cancel_status` (`ip_cancel_status`),
|
||||
KEY `ip_refund_required` (`ip_refund_required`),
|
||||
KEY `ip_updated_at` (`ip_updated_at`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ", true);
|
||||
$is_check = true;
|
||||
}
|
||||
|
||||
if (sql_query(" DESC `{$g5['g5_shop_inicis_pay_table']}` ", false)) {
|
||||
$inicis_pay_columns = array(
|
||||
'ip_environment' => "ADD COLUMN `ip_environment` varchar(10) NOT NULL DEFAULT '' AFTER `ip_mid`",
|
||||
'ip_easy_pay' => "ADD COLUMN `ip_easy_pay` varchar(20) NOT NULL DEFAULT '' AFTER `ip_pay_type`",
|
||||
'ip_noti_status' => "ADD COLUMN `ip_noti_status` varchar(30) NOT NULL DEFAULT '' AFTER `ip_result_message`",
|
||||
'ip_noti_code' => "ADD COLUMN `ip_noti_code` varchar(30) NOT NULL DEFAULT '' AFTER `ip_noti_status`",
|
||||
'ip_noti_message' => "ADD COLUMN `ip_noti_message` varchar(255) NOT NULL DEFAULT '' AFTER `ip_noti_code`",
|
||||
'ip_noti_failed_count' => "ADD COLUMN `ip_noti_failed_count` int(11) NOT NULL DEFAULT '0' AFTER `ip_noti_message`",
|
||||
'ip_noti_at' => "ADD COLUMN `ip_noti_at` datetime DEFAULT NULL AFTER `ip_noti_failed_count`",
|
||||
'ip_cancel_status' => "ADD COLUMN `ip_cancel_status` varchar(30) NOT NULL DEFAULT '' AFTER `ip_noti_at`",
|
||||
'ip_cancel_code' => "ADD COLUMN `ip_cancel_code` varchar(30) NOT NULL DEFAULT '' AFTER `ip_cancel_status`",
|
||||
'ip_cancel_message' => "ADD COLUMN `ip_cancel_message` varchar(255) NOT NULL DEFAULT '' AFTER `ip_cancel_code`",
|
||||
'ip_cancel_checked_at' => "ADD COLUMN `ip_cancel_checked_at` datetime DEFAULT NULL AFTER `ip_cancel_message`",
|
||||
'ip_refund_required' => "ADD COLUMN `ip_refund_required` tinyint(4) NOT NULL DEFAULT '0' AFTER `ip_cancel_checked_at`",
|
||||
'ip_vbank_due_at' => "ADD COLUMN `ip_vbank_due_at` datetime DEFAULT NULL AFTER `ip_refund_required`",
|
||||
'ip_expired_at' => "ADD COLUMN `ip_expired_at` datetime DEFAULT NULL AFTER `ip_vbank_due_at`",
|
||||
'ip_audit_error' => "ADD COLUMN `ip_audit_error` tinyint(4) NOT NULL DEFAULT '0'",
|
||||
'ip_alerted_at' => "ADD COLUMN `ip_alerted_at` datetime DEFAULT NULL",
|
||||
'ip_alert_key' => "ADD COLUMN `ip_alert_key` varchar(64) NOT NULL DEFAULT ''",
|
||||
'ip_pg_status' => "ADD COLUMN `ip_pg_status` varchar(30) NOT NULL DEFAULT ''",
|
||||
'ip_pg_amount' => "ADD COLUMN `ip_pg_amount` int(11) NOT NULL DEFAULT '0'",
|
||||
'ip_pg_tid' => "ADD COLUMN `ip_pg_tid` varchar(80) NOT NULL DEFAULT ''",
|
||||
'ip_pg_result_code' => "ADD COLUMN `ip_pg_result_code` varchar(30) NOT NULL DEFAULT ''",
|
||||
'ip_pg_message' => "ADD COLUMN `ip_pg_message` varchar(255) NOT NULL DEFAULT ''",
|
||||
'ip_pg_checked_at' => "ADD COLUMN `ip_pg_checked_at` datetime DEFAULT NULL"
|
||||
);
|
||||
$inicis_pay_alter = array();
|
||||
foreach ($inicis_pay_columns as $column => $alter) {
|
||||
$column_result = sql_query(" SHOW COLUMNS FROM `{$g5['g5_shop_inicis_pay_table']}` LIKE '$column' ", false);
|
||||
if (!$column_result || sql_num_rows($column_result) === 0)
|
||||
$inicis_pay_alter[] = $alter;
|
||||
}
|
||||
if (count($inicis_pay_alter)) {
|
||||
sql_query(" ALTER TABLE `{$g5['g5_shop_inicis_pay_table']}` ".implode(', ', $inicis_pay_alter), true);
|
||||
$is_check = true;
|
||||
}
|
||||
|
||||
if (count($inicis_pay_alter)) {
|
||||
$environment = !empty($default['de_card_test']) ? 'test' : 'live';
|
||||
sql_query(" insert ignore into `{$g5['g5_shop_inicis_pay_table']}`
|
||||
(ip_oid, ip_environment, ip_status, ip_noti_status, ip_noti_code, ip_noti_message,
|
||||
ip_noti_failed_count, ip_noti_at, ip_created_at, ip_updated_at, ip_event_count)
|
||||
select e.ip_oid, '$environment', e.pe_status, e.pe_status, e.pe_code, e.pe_message,
|
||||
sum(if(e.pe_status = 'notification_failed', 1, 0)), max(e.pe_created_at),
|
||||
min(e.pe_created_at), max(e.pe_created_at), count(*)
|
||||
from `{$g5['g5_shop_inicis_pay_event_table']}` e
|
||||
left join `{$g5['g5_shop_inicis_pay_table']}` p on p.ip_oid = e.ip_oid
|
||||
where p.ip_id is null
|
||||
and e.pe_stage = 'notification'
|
||||
group by e.ip_oid ", false);
|
||||
sql_query(" update `{$g5['g5_shop_inicis_pay_table']}`
|
||||
set ip_environment = case
|
||||
when lower(ip_mid) in ('inipaytest','iniescrow0') then 'test'
|
||||
when ip_mid <> '' then 'live'
|
||||
else '$environment'
|
||||
end
|
||||
where ip_environment = '' ", false);
|
||||
sql_query(" update `{$g5['g5_shop_inicis_pay_table']}` p
|
||||
inner join (
|
||||
select ip_oid, max(pe_id) as pe_id,
|
||||
sum(if(pe_status = 'notification_failed', 1, 0)) as fail_count
|
||||
from `{$g5['g5_shop_inicis_pay_event_table']}`
|
||||
where pe_stage = 'notification'
|
||||
group by ip_oid
|
||||
) x on x.ip_oid = p.ip_oid
|
||||
inner join `{$g5['g5_shop_inicis_pay_event_table']}` e on e.pe_id = x.pe_id
|
||||
set p.ip_noti_status = e.pe_status,
|
||||
p.ip_noti_code = e.pe_code,
|
||||
p.ip_noti_message = e.pe_message,
|
||||
p.ip_noti_failed_count = x.fail_count,
|
||||
p.ip_noti_at = e.pe_created_at ", false);
|
||||
sql_query(" update `{$g5['g5_shop_inicis_pay_table']}` p
|
||||
inner join (
|
||||
select ip_oid, max(pe_id) as pe_id
|
||||
from `{$g5['g5_shop_inicis_pay_event_table']}`
|
||||
where pe_stage = 'cancel'
|
||||
group by ip_oid
|
||||
) x on x.ip_oid = p.ip_oid
|
||||
inner join `{$g5['g5_shop_inicis_pay_event_table']}` e on e.pe_id = x.pe_id
|
||||
set p.ip_cancel_status = e.pe_status,
|
||||
p.ip_cancel_code = e.pe_code,
|
||||
p.ip_cancel_message = e.pe_message,
|
||||
p.ip_cancel_checked_at = e.pe_created_at ", false);
|
||||
sql_query(" update `{$g5['g5_shop_inicis_pay_table']}` p
|
||||
inner join `{$g5['g5_shop_inicis_pay_event_table']}` e on e.ip_oid = p.ip_oid and e.pe_stage = 'request'
|
||||
set p.ip_easy_pay = case
|
||||
when e.pe_message like '삼성페이%' then 'SAMSUNGPAY'
|
||||
when e.pe_message like 'lpay%' then 'LPAY'
|
||||
when e.pe_message like 'inicis_kakaopay%' then 'KAKAOPAY'
|
||||
when e.pe_message like '간편결제%' then 'EASYPAY'
|
||||
else p.ip_easy_pay
|
||||
end
|
||||
where p.ip_easy_pay = '' ", false);
|
||||
sql_query(" update `{$g5['g5_shop_inicis_pay_table']}`
|
||||
set ip_noti_status = case
|
||||
when ip_status = 'paid' then 'paid'
|
||||
when ip_status = 'vbank_issued' then 'vbank_issued'
|
||||
when ip_status = 'notification_received' then 'notification_received'
|
||||
else ip_noti_status
|
||||
end,
|
||||
ip_cancel_status = case
|
||||
when ip_status in ('canceled','cancel_failed','partial_canceled','partial_cancel_failed') then ip_status
|
||||
else ip_cancel_status
|
||||
end ", false);
|
||||
sql_query(" update `{$g5['g5_shop_inicis_pay_table']}` p
|
||||
inner join {$g5['g5_shop_order_table']} o on o.od_id = p.ip_oid
|
||||
set p.ip_status = 'paid_after_cancel',
|
||||
p.ip_refund_required = '1',
|
||||
p.ip_noti_status = 'paid_after_cancel',
|
||||
p.ip_noti_message = '취소 주문에 가상계좌 입금 확인'
|
||||
where p.ip_pay_type = 'VBANK'
|
||||
and p.ip_status = 'paid'
|
||||
and o.od_status = '취소'
|
||||
and o.od_receipt_price > 0 ", false);
|
||||
$inicis_pro_migrated_at = G5_TIME_YMDHIS;
|
||||
$inicis_pro_migrated_message = '기존 결제·주문 이력 대조에서 취소 후 입금 확인';
|
||||
sql_query(" insert into `{$g5['g5_shop_inicis_pay_event_table']}`
|
||||
(ip_oid, ip_tid, pe_stage, pe_status, pe_code, pe_message, pe_source, pe_ip, pe_created_at)
|
||||
select p.ip_oid, p.ip_tid, 'reconcile', 'paid_after_cancel', '',
|
||||
'".sql_escape_string($inicis_pro_migrated_message)."', 'system', '', '$inicis_pro_migrated_at'
|
||||
from `{$g5['g5_shop_inicis_pay_table']}` p
|
||||
left join `{$g5['g5_shop_inicis_pay_event_table']}` e
|
||||
on e.ip_oid = p.ip_oid and e.pe_status = 'paid_after_cancel'
|
||||
where p.ip_status = 'paid_after_cancel'
|
||||
and p.ip_refund_required = '1'
|
||||
and e.pe_id is null ", false);
|
||||
sql_query(" update `{$g5['g5_shop_inicis_pay_table']}` p
|
||||
inner join `{$g5['g5_shop_inicis_pay_event_table']}` e
|
||||
on e.ip_oid = p.ip_oid
|
||||
and e.pe_status = 'paid_after_cancel'
|
||||
and e.pe_message = '".sql_escape_string($inicis_pro_migrated_message)."'
|
||||
and e.pe_created_at = '$inicis_pro_migrated_at'
|
||||
set p.ip_event_count = p.ip_event_count + 1 ", false);
|
||||
}
|
||||
|
||||
$inicis_pay_indexes = array(
|
||||
'ip_noti_status' => "ADD KEY `ip_noti_status` (`ip_noti_status`)",
|
||||
'ip_cancel_status' => "ADD KEY `ip_cancel_status` (`ip_cancel_status`)",
|
||||
'ip_refund_required' => "ADD KEY `ip_refund_required` (`ip_refund_required`)"
|
||||
);
|
||||
foreach ($inicis_pay_indexes as $index_name => $index_sql) {
|
||||
$index_result = sql_query(" SHOW INDEX FROM `{$g5['g5_shop_inicis_pay_table']}` WHERE Key_name = '$index_name' ", false);
|
||||
if (!$index_result || sql_num_rows($index_result) === 0) {
|
||||
sql_query(" ALTER TABLE `{$g5['g5_shop_inicis_pay_table']}` $index_sql ", true);
|
||||
$is_check = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!sql_query(" DESC `{$g5['g5_shop_inicis_pay_event_table']}` ", false)) {
|
||||
sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['g5_shop_inicis_pay_event_table']}` (
|
||||
`pe_id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`ip_oid` varchar(64) NOT NULL DEFAULT '',
|
||||
`ip_tid` varchar(80) NOT NULL DEFAULT '',
|
||||
`pe_stage` varchar(30) NOT NULL DEFAULT '',
|
||||
`pe_status` varchar(30) NOT NULL DEFAULT '',
|
||||
`pe_code` varchar(30) NOT NULL DEFAULT '',
|
||||
`pe_message` varchar(255) NOT NULL DEFAULT '',
|
||||
`pe_source` varchar(10) NOT NULL DEFAULT '',
|
||||
`pe_ip` varchar(45) NOT NULL DEFAULT '',
|
||||
`pe_created_at` datetime DEFAULT NULL,
|
||||
PRIMARY KEY (`pe_id`),
|
||||
KEY `ip_oid` (`ip_oid`),
|
||||
KEY `ip_tid` (`ip_tid`),
|
||||
KEY `pe_status` (`pe_status`),
|
||||
KEY `pe_created_at` (`pe_created_at`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ", true);
|
||||
$is_check = true;
|
||||
}
|
||||
}
|
||||
|
||||
$is_check = run_replace('admin_dbupgrade', $is_check);
|
||||
|
||||
$db_upgrade_msg = $is_check ? 'DB 업그레이드가 완료되었습니다.' : '더 이상 업그레이드 할 내용이 없습니다.<br>현재 DB 업그레이드가 완료된 상태입니다.';
|
||||
@@ -386,4 +643,4 @@ $db_upgrade_msg = $is_check ? 'DB 업그레이드가 완료되었습니다.' : '
|
||||
</div>
|
||||
|
||||
<?php
|
||||
include_once ('./admin.tail.php');
|
||||
include_once ('./admin.tail.php');
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.7 KiB |
+1
-1
@@ -625,7 +625,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
|
||||
<?php for ($i = 1; $i <= 10; $i++) { ?>
|
||||
<tr>
|
||||
<th scope="row"><label for="mb_<?php echo $i ?>">여분 필드 <?php echo $i ?></label></th>
|
||||
<td colspan="3"><input type="text" name="mb_<?php echo $i ?>" value="<?php echo $mb['mb_' . $i] ?>" id="mb_<?php echo $i ?>" class="frm_input" size="30" maxlength="255"></td>
|
||||
<td colspan="3"><input type="text" name="mb_<?php echo $i ?>" value="<?php echo get_sanitize_input($mb['mb_' . $i]); ?>" id="mb_<?php echo $i ?>" class="frm_input" size="30" maxlength="255"></td>
|
||||
</tr>
|
||||
<?php } ?>
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ auth_check_menu($auth, $sub_menu, 'r');
|
||||
|
||||
$sql_common = " from {$g5['member_table']} ";
|
||||
|
||||
// $sfl 화이트리스트 검증 (KVE-2026-0340)
|
||||
$allowed_sfl = array('mb_id', 'mb_nick', 'mb_name', 'mb_level', 'mb_email', 'mb_tel', 'mb_hp', 'mb_point', 'mb_datetime', 'mb_ip', 'mb_recommend');
|
||||
if (!in_array($sfl, $allowed_sfl)) {
|
||||
$sfl = 'mb_id';
|
||||
|
||||
@@ -7,7 +7,9 @@
|
||||
define('MEMBER_EXPORT_PAGE_SIZE', 10000); // 파일당 처리할 회원 수
|
||||
define('MEMBER_EXPORT_MAX_SIZE', 300000); // 최대 처리할 회원 수
|
||||
define('MEMBER_BASE_DIR', "member_list"); // 엑셀 베이스 폴더
|
||||
define('MEMBER_BASE_DATE', date('YmdHis')); // 폴더/파일명용 날짜
|
||||
// 폴더/파일명용 날짜 - 저장 경로가 추측되지 않도록 임의 문자열을 덧붙인다.
|
||||
define('MEMBER_BASE_SALT', function_exists('get_random_token_string') ? get_random_token_string(8) : substr(md5(uniqid(mt_rand(), true)), 0, 8));
|
||||
define('MEMBER_BASE_DATE', date('YmdHis') . '_' . MEMBER_BASE_SALT);
|
||||
define('MEMBER_EXPORT_DIR', G5_DATA_PATH . "/" . MEMBER_BASE_DIR . "/" . MEMBER_BASE_DATE); // 엑셀 파일 저장 경로
|
||||
define('MEMBER_LOG_DIR', G5_DATA_PATH . "/" . MEMBER_BASE_DIR . "/" . "log"); // 로그 파일 저장 경로
|
||||
|
||||
@@ -57,18 +59,8 @@ function get_export_config($type = null)
|
||||
*/
|
||||
function get_member_export_params()
|
||||
{
|
||||
// 친구톡 양식 - 엑셀 양식에 포함할 항목
|
||||
$fieldArray = array_map('trim', explode(',', isset($_GET['fields']) ? $_GET['fields'] : ''));
|
||||
$vars = array();
|
||||
foreach ($fieldArray as $index => $field) {
|
||||
if(!empty($field)){
|
||||
$vars['var' . ($index + 1)] = $field;
|
||||
}
|
||||
}
|
||||
|
||||
$params = array(
|
||||
'page' => 1,
|
||||
'formatType' => (int)(isset($_GET['formatType']) ? $_GET['formatType'] : 1),
|
||||
'use_stx' => isset($_GET['use_stx']) ? $_GET['use_stx'] : 0,
|
||||
'stx_cond' => clean_xss_tags(isset($_GET['stx_cond']) ? $_GET['stx_cond'] : 'like'),
|
||||
'sfl' => clean_xss_tags(isset($_GET['sfl']) ? $_GET['sfl'] : ''),
|
||||
@@ -91,7 +83,6 @@ function get_member_export_params()
|
||||
'agree_date_end' => clean_xss_tags(isset($_GET['agree_date_end']) ? $_GET['agree_date_end'] : ''),
|
||||
'use_intercept' => isset($_GET['use_intercept']) ? $_GET['use_intercept'] : 0,
|
||||
'intercept' => clean_xss_tags(isset($_GET['intercept']) ? $_GET['intercept'] : 'exclude'),
|
||||
'vars' => $vars,
|
||||
);
|
||||
|
||||
// 레벨 범위 검증
|
||||
|
||||
@@ -271,7 +271,7 @@ function closePreviousEventSource() {
|
||||
}
|
||||
|
||||
// 2. FormData QueryString 변환
|
||||
function buildDownloadParams(selectedFields = []) {
|
||||
function buildDownloadParams() {
|
||||
const formData = new FormData(document.getElementById('fsearch'));
|
||||
const params = new URLSearchParams(formData);
|
||||
|
||||
@@ -281,10 +281,10 @@ function buildDownloadParams(selectedFields = []) {
|
||||
}
|
||||
|
||||
// 3. 메인 함수
|
||||
function startExcelDownload(selectedFields = []) {
|
||||
function startExcelDownload() {
|
||||
closePreviousEventSource();
|
||||
|
||||
const query = buildDownloadParams(selectedFields);
|
||||
const query = buildDownloadParams();
|
||||
showDownloadPopup();
|
||||
|
||||
eventSource = new EventSource(`member_list_exel_export.php?${query}`);
|
||||
@@ -340,32 +340,6 @@ function handlePopupCloseWithConfirm(e) {
|
||||
PopupManager.close('popupOverlay');
|
||||
}
|
||||
|
||||
// 체크박스 선택 시 최대 3개 제한 및 선택된 항목 미리보기 표시
|
||||
function bindFieldSelectEvents() {
|
||||
const fieldSelectForm = document.getElementById('fieldSelectForm');
|
||||
if (!fieldSelectForm) return;
|
||||
|
||||
fieldSelectForm.addEventListener('change', function (e) {
|
||||
if (e.target.name === 'fields') {
|
||||
const selected = fieldSelectForm.querySelectorAll('input[name="fields"]:checked');
|
||||
if (selected.length > 3) {
|
||||
alert("최대 3개까지 선택 가능합니다.");
|
||||
e.target.checked = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// 선택된 항목 표시
|
||||
const previewContainer = document.getElementById('selectedFieldsPreview');
|
||||
let spans = '<strong>선택된 항목:</strong>';
|
||||
selected.forEach(field => {
|
||||
const label = field.parentElement.textContent.trim();
|
||||
spans += `<span class="field-tag">${label}</span>`;
|
||||
});
|
||||
previewContainer.innerHTML = spans;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 엑셀 생성 및 다운로드 실행
|
||||
function handleProgressUpdate() {
|
||||
return function(e) {
|
||||
|
||||
@@ -413,7 +413,7 @@ function member_export_delete($fileList = array())
|
||||
$name = basename($file);
|
||||
|
||||
// log 폴더와 오늘 날짜로 시작하는 폴더는 제외
|
||||
if ($name === 'log' || preg_match('/^' . date('Ymd') . '\d{6}$/', $name)) continue;
|
||||
if ($name === 'log' || preg_match('/^' . date('Ymd') . '\d{6}(_[A-Za-z0-9]+)?$/', $name)) continue;
|
||||
|
||||
if (is_file($file) && pathinfo($file, PATHINFO_EXTENSION) !== 'log' && @unlink($file)) {
|
||||
$cnt++;
|
||||
|
||||
@@ -6,6 +6,11 @@ auth_check_menu($auth, $sub_menu, 'r');
|
||||
|
||||
$sql_common = " from {$g5['point_table']} po";
|
||||
|
||||
$allowed_sfl = array('mb_id', 'po_content');
|
||||
if (!in_array($sfl, $allowed_sfl)) {
|
||||
$sfl = 'mb_id';
|
||||
}
|
||||
|
||||
$sql_search = " where (1) ";
|
||||
|
||||
if ($stx) {
|
||||
|
||||
@@ -6,6 +6,11 @@ auth_check_menu($auth, $sub_menu, 'r');
|
||||
|
||||
$sql_common = " from {$g5['poll_table']} ";
|
||||
|
||||
$allowed_sfl = array('po_subject');
|
||||
if (!in_array($sfl, $allowed_sfl)) {
|
||||
$sfl = 'po_subject';
|
||||
}
|
||||
|
||||
$sql_search = " where (1) ";
|
||||
if ($stx) {
|
||||
$sql_search .= " and ( ";
|
||||
|
||||
@@ -16,6 +16,11 @@ if (isset($_POST['chk']) && is_array($_POST['chk'])) {
|
||||
}
|
||||
|
||||
$sql_common = " from {$g5['popular_table']} a ";
|
||||
$allowed_sfl = array('pp_word', 'pp_date');
|
||||
if (!in_array($sfl, $allowed_sfl)) {
|
||||
$sfl = 'pp_word';
|
||||
}
|
||||
|
||||
$sql_search = " where (1) ";
|
||||
|
||||
if ($stx) {
|
||||
|
||||
@@ -36,6 +36,12 @@ if ($board && ($qaconfig['qa_include_head'] !== $qa_include_head || $qaconfig['q
|
||||
}
|
||||
}
|
||||
|
||||
// 저장·검증 전에 경로를 먼저 정규화하여, 검증 이후 경로가 달라지지 않도록 한다.
|
||||
if (function_exists('filter_input_include_path')) {
|
||||
$qa_include_head = filter_input_include_path($qa_include_head);
|
||||
$qa_include_tail = filter_input_include_path($qa_include_tail);
|
||||
}
|
||||
|
||||
if ($qa_include_head) {
|
||||
$file_ext = pathinfo($qa_include_head, PATHINFO_EXTENSION);
|
||||
|
||||
@@ -62,9 +68,12 @@ if ($qa_include_tail && !is_include_path_check($qa_include_tail, 1)) {
|
||||
$error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 하단 파일 경로에 포함시킬수 없습니다.';
|
||||
}
|
||||
|
||||
if (function_exists('filter_input_include_path')) {
|
||||
$qa_include_head = filter_input_include_path($qa_include_head);
|
||||
$qa_include_tail = filter_input_include_path($qa_include_tail);
|
||||
if ($qa_include_head && function_exists('is_content_include_allowed') && !is_content_include_allowed($qa_include_head)) {
|
||||
alert('상단 파일 경로로 사용할 수 없는 위치입니다.');
|
||||
}
|
||||
|
||||
if ($qa_include_tail && function_exists('is_content_include_allowed') && !is_content_include_allowed($qa_include_tail)) {
|
||||
alert('하단 파일 경로로 사용할 수 없는 위치입니다.');
|
||||
}
|
||||
|
||||
// 분류에 & 나 = 는 사용이 불가하므로 2바이트로 바꾼다.
|
||||
|
||||
+7
-6
@@ -17,9 +17,10 @@ include_once('./admin.head.php');
|
||||
<h3>신용카드 전자결제 서비스<br><span>(계좌이체, 가상계좌 결제 포함)</span></h3>
|
||||
|
||||
<ul>
|
||||
<li><a href="http://sir.kr/main/service/p_pg.php" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_01.jpg" alt="KCP 신용카드 전자결제 신청하기"></a></li>
|
||||
<li><a href="http://sir.kr/main/service/lg_pg.php" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_02.jpg?v2" alt="토스페이먼츠 전자결제 신청하기"></a></li>
|
||||
<li class="last"><a href="http://sir.kr/main/service/inicis_pg.php" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_06.jpg" alt="KG 이니시스 전자결제 신청하기"></a></li>
|
||||
<li><a href="https://sir.kr/services/pg/kcp" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_01.jpg" alt="NHN KCP 신용카드 전자결제 신청하기"></a></li>
|
||||
<li><a href="https://sir.kr/services/pg/toss" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_02.jpg?v2" alt="토스페이먼츠 전자결제 신청하기"></a></li>
|
||||
<li><a href="https://sir.kr/services/pg/inicis" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_06.jpg" alt="KG 이니시스 전자결제 신청하기"></a></li>
|
||||
<li class="last"><a href="https://sir.kr/services/pg/nice" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_07.jpg" alt="나이스페이먼츠 전자결제 신청하기"></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -27,8 +28,8 @@ include_once('./admin.head.php');
|
||||
<h3>본인확인 서비스</h3>
|
||||
|
||||
<ul>
|
||||
<li><a href="http://sir.kr/main/service/p_cert.php" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_01.jpg" alt="KCP 신청하기"></a></li>
|
||||
<li><a href="http://sir.kr/main/service/inicis_cert.php" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_06.jpg" alt="KG이니시스 신청하기"></a></li>
|
||||
<li><a href="https://sir.kr/services/auth/kcp" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_01.jpg" alt="NHN KCP 휴대폰 본인확인 신청하기"></a></li>
|
||||
<li><a href="https://sir.kr/services/auth/inicis" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_06.jpg" alt="KG이니시스 본인확인 신청하기"></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -38,7 +39,7 @@ include_once('./admin.head.php');
|
||||
<h3>SMS 문자 서비스</h3>
|
||||
<p>주문이나 배송시에 상점운영자 또는 고객에게 휴대폰으로 단문메세지 (최대 한글 40자, 영문 80자)를 발송합니다.</p>
|
||||
</div>
|
||||
<div class="svc_btn2"><a href="http://icodekorea.com/res/join_company_fix_a.php?sellid=sir2" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_05.jpg" alt="아이코드 SMS 서비스 신청하기"></a></div>
|
||||
<div class="svc_btn2"><a href="https://sir.kr/services/message/icode" target="_blank"><img src="<?php echo G5_ADMIN_URL ?>/img/svc_btn_05.jpg" alt="아이코드 SMS 서비스 신청하기"></a></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -200,6 +200,7 @@ function pg_setting_check($is_print=false){
|
||||
}
|
||||
|
||||
function is_cancel_shop_pg_order($od){
|
||||
global $default;
|
||||
|
||||
$is_od_pg_cancel = false;
|
||||
|
||||
@@ -207,7 +208,7 @@ function is_cancel_shop_pg_order($od){
|
||||
$is_od_pg_cancel = true;
|
||||
}
|
||||
|
||||
if ($od['od_pg'] === 'nicepay' && in_array($od['od_settle_case'], array('계좌이체', '휴대폰'))) {
|
||||
if ($od['od_pg'] === 'nicepay' && in_array($od['od_settle_case'], array('계좌이체', '휴대폰', '가상계좌'))) {
|
||||
$is_od_pg_cancel = true;
|
||||
}
|
||||
|
||||
@@ -215,9 +216,201 @@ function is_cancel_shop_pg_order($od){
|
||||
$is_od_pg_cancel = true;
|
||||
}
|
||||
|
||||
if ($od['od_pg'] === 'inicis' && !empty($default['de_inicis_pro_use']) && !empty($od['od_tno'])
|
||||
&& in_array($od['od_settle_case'], array('신용카드', '간편결제', '가상계좌', '계좌이체', '휴대폰', '삼성페이', 'lpay', 'inicis_kakaopay'))) {
|
||||
$is_od_pg_cancel = true;
|
||||
}
|
||||
|
||||
return $is_od_pg_cancel;
|
||||
}
|
||||
|
||||
function check_order_inicis_pro_payments($run_external = true){
|
||||
include_once(G5_SHOP_PATH.'/inicis/pro/inicis_pro.lib.php');
|
||||
|
||||
// 사이트 이용 흐름에서 실행되는 경량 감시는 잠금 대기 없이 즉시 시도하고,
|
||||
// 획득하지 못하면 다른 요청이 이미 처리 중이므로 그대로 넘어간다.
|
||||
$monitor_lock = inicis_pro_lock('monitor_process', $run_external ? 10 : 0);
|
||||
if ($monitor_lock === '')
|
||||
return false;
|
||||
|
||||
check_order_inicis_pro_payments_run($run_external);
|
||||
inicis_pro_unlock($monitor_lock);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// 서버 스케줄러 없이 사이트 접속 흐름에서 실행되는 경량 감시.
|
||||
// 방문자 응답을 먼저 종료해 페이지 지연 없이 뒤에서 처리한다.
|
||||
function check_order_inicis_pro_payments_inline(){
|
||||
global $default;
|
||||
|
||||
if (empty($default['de_pg_service']) || $default['de_pg_service'] !== 'inicis' || empty($default['de_inicis_pro_use']))
|
||||
return;
|
||||
|
||||
if (function_exists('fastcgi_finish_request'))
|
||||
@fastcgi_finish_request();
|
||||
@ignore_user_abort(true);
|
||||
|
||||
check_order_inicis_pro_payments(false);
|
||||
}
|
||||
|
||||
function check_order_inicis_pro_payments_run($run_external = true){
|
||||
global $g5, $config, $default;
|
||||
|
||||
include_once(G5_SHOP_PATH.'/inicis/pro/inicis_pro.lib.php');
|
||||
include_once(G5_ADMIN_PATH.'/shop_admin/inicislog.lib.php');
|
||||
|
||||
if (!inicis_pro_audit_schema_ready()) {
|
||||
// 스키마가 준비되지 않았어도 감시 시각을 전진시켜, 사이트 접속 흐름의
|
||||
// 인라인 감시가 매 요청마다 재등록·재실행되는 것을 막는다.
|
||||
if (array_key_exists('de_inicis_pro_monitor_at', $default))
|
||||
sql_query(" update {$g5['g5_shop_default_table']}
|
||||
set de_inicis_pro_monitor_at = '".G5_TIME_YMDHIS."' ", false);
|
||||
return;
|
||||
}
|
||||
|
||||
$log_days = isset($default['de_inicis_pro_log_days']) ? (int) $default['de_inicis_pro_log_days'] : 365;
|
||||
if ($log_days >= 30) {
|
||||
inicis_pro_purge_events($log_days, 500);
|
||||
inicis_pro_purge_payloads($log_days, 200);
|
||||
}
|
||||
$summary_days = isset($default['de_inicis_pro_summary_days']) ? (int) $default['de_inicis_pro_summary_days'] : 1825;
|
||||
if ($summary_days >= 365)
|
||||
inicis_pro_purge_summaries($summary_days, 50);
|
||||
|
||||
$tables = inicis_pro_audit_tables();
|
||||
$expired_count = 0;
|
||||
$expired_result = sql_query(" select ip_oid from `{$tables['summary']}`
|
||||
where ip_status = 'request_ready'
|
||||
and ip_updated_at < date_sub(now(), interval 30 minute)
|
||||
order by ip_updated_at asc
|
||||
limit 50 ", false);
|
||||
if ($expired_result) {
|
||||
while ($expired = sql_fetch_array($expired_result)) {
|
||||
if (inicis_pro_audit_write($expired['ip_oid'], 'request', 'request_expired', array(
|
||||
'source' => 'system',
|
||||
'message' => '결제창 요청 후 인증결과가 없어 미진행으로 정리'
|
||||
)))
|
||||
$expired_count++;
|
||||
}
|
||||
}
|
||||
|
||||
$order_amount_sql = "(o.od_cart_price + o.od_send_cost + o.od_send_cost2 - o.od_cart_coupon - o.od_coupon - o.od_send_coupon - o.od_receipt_point)";
|
||||
$anomaly_sql = inicis_admin_anomaly_sql();
|
||||
$sql_from = " from `{$tables['summary']}` p
|
||||
left join {$g5['g5_shop_order_table']} o on p.ip_order_type <> 'personal' and o.od_id = p.ip_oid
|
||||
left join {$g5['g5_shop_personalpay_table']} pp on p.ip_order_type = 'personal' and pp.pp_id = p.ip_oid ";
|
||||
$sql_fields = " select p.*,
|
||||
o.od_id as order_oid, o.od_tno as order_tid, o.od_status as order_status,
|
||||
o.od_receipt_price as order_receipt_price, o.od_misu as order_misu, o.od_cancel_price as order_cancel_price,
|
||||
o.od_refund_price as order_refund_price, o.od_settle_case as order_settle_case, $order_amount_sql as order_amount,
|
||||
pp.pp_id as personal_oid, pp.pp_tno as personal_tid, pp.pp_price as personal_amount, pp.pp_receipt_price as personal_receipt_price ";
|
||||
|
||||
$recover_result = sql_query(" select ip_oid from `{$tables['summary']}`
|
||||
where ip_tid = ''
|
||||
and ip_status in ('authentication_received','approval_started','validation_failed','order_saving')
|
||||
and ip_updated_at < date_sub(now(), interval 3 minute)
|
||||
order by ip_updated_at asc
|
||||
limit 5 ", false);
|
||||
if ($recover_result) {
|
||||
while ($recover_row = sql_fetch_array($recover_result))
|
||||
inicis_pro_recover_approved_tid($recover_row['ip_oid'], 'system');
|
||||
}
|
||||
|
||||
$reconcile_count = 0;
|
||||
$reconcile_failed_count = 0;
|
||||
if ($run_external && empty($default['de_card_test']) && !empty($default['de_inicis_pro_reconcile_use']) && inicis_pro_get_iniapi_key() !== '') {
|
||||
$result = sql_query(" $sql_fields $sql_from
|
||||
where p.ip_tid <> ''
|
||||
and p.ip_updated_at < date_sub(now(), interval 3 minute)
|
||||
and (p.ip_pg_checked_at is null or p.ip_pg_checked_at < date_sub(now(), interval 1 hour))
|
||||
and (p.ip_refund_required = '1'
|
||||
or $anomaly_sql
|
||||
or (p.ip_updated_at > date_sub(now(), interval 7 day)
|
||||
and (p.ip_status in ('order_saved','paid','paid_after_cancel','vbank_issued','canceled','refund_completed')
|
||||
or p.ip_cancel_status <> '')))
|
||||
order by p.ip_refund_required desc, p.ip_updated_at asc
|
||||
limit 10 ", false);
|
||||
if ($result) {
|
||||
while ($row = sql_fetch_array($result)) {
|
||||
$inquiry = inicis_pro_inquiry($row['ip_tid'], $row['ip_oid'], $row);
|
||||
if (inicis_pro_save_inquiry($row['ip_oid'], $inquiry, 'system') && !empty($inquiry['success']))
|
||||
$reconcile_count++;
|
||||
else
|
||||
$reconcile_failed_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$anomaly_count_row = sql_fetch(" select count(*) as cnt $sql_from where $anomaly_sql ");
|
||||
$anomaly_count = isset($anomaly_count_row['cnt']) ? (int) $anomaly_count_row['cnt'] : 0;
|
||||
if ($run_external)
|
||||
$monitor_message = '미진행 '.$expired_count.'건 정리 / KG 대사 성공 '.$reconcile_count.'건, 실패 '.$reconcile_failed_count.'건 / 확인 필요 '.$anomaly_count.'건';
|
||||
else
|
||||
$monitor_message = '미진행 '.$expired_count.'건 정리 / 확인 필요 '.$anomaly_count.'건';
|
||||
if (array_key_exists('de_inicis_pro_monitor_at', $default)) {
|
||||
$monitor_set = "de_inicis_pro_monitor_at = '".G5_TIME_YMDHIS."'";
|
||||
if (isset($default['de_inicis_pro_monitor_message']))
|
||||
$monitor_set .= ", de_inicis_pro_monitor_message = '".sql_escape_string($monitor_message)."'";
|
||||
sql_query(" update {$g5['g5_shop_default_table']} set $monitor_set ", false);
|
||||
}
|
||||
|
||||
// 테스트 거래는 상세 화면에서 직접 조회하며 운영 메일에는 포함하지 않는다.
|
||||
if (!empty($default['de_card_test']))
|
||||
return;
|
||||
|
||||
if (empty($default['de_inicis_pro_alert_use']) || empty($config['cf_email_use']) || empty($config['cf_admin_email']))
|
||||
return;
|
||||
|
||||
$result = sql_query(" $sql_fields $sql_from
|
||||
where $anomaly_sql
|
||||
order by p.ip_updated_at asc
|
||||
limit 20 ", false);
|
||||
if (!$result)
|
||||
return;
|
||||
|
||||
$alert_rows = array();
|
||||
$mail_msg = '';
|
||||
while ($row = sql_fetch_array($result)) {
|
||||
if (!inicis_admin_is_anomaly($row))
|
||||
continue;
|
||||
|
||||
$alert_key = inicis_admin_alert_key($row);
|
||||
if (!empty($row['ip_alert_key']) && $row['ip_alert_key'] === $alert_key)
|
||||
continue;
|
||||
|
||||
$pg_state = !empty($row['ip_pg_checked_at'])
|
||||
? ($row['ip_pg_result_code'] === '00' ? inicis_admin_pg_status_label($row['ip_pg_status']) : '거래조회 실패')
|
||||
: '미조회';
|
||||
$mail_msg .= '<tr>'
|
||||
.'<td style="padding:6px;border:1px solid #ddd"><a href="'.G5_ADMIN_URL.'/shop_admin/inicislogview.php?oid='.urlencode($row['ip_oid']).'">'.get_text($row['ip_oid']).'</a></td>'
|
||||
.'<td style="padding:6px;border:1px solid #ddd">'.get_text(inicis_admin_status_label(inicis_admin_primary_status($row))).'</td>'
|
||||
.'<td style="padding:6px;border:1px solid #ddd">'.get_text($pg_state).'</td>'
|
||||
.'<td style="padding:6px;border:1px solid #ddd;text-align:right">'.number_format((int) $row['ip_amount']).'원</td>'
|
||||
.'</tr>';
|
||||
$alert_rows[] = array('oid' => $row['ip_oid'], 'key' => $alert_key);
|
||||
}
|
||||
|
||||
if (!count($alert_rows))
|
||||
return;
|
||||
|
||||
include_once(G5_LIB_PATH.'/mailer.lib.php');
|
||||
$content = '<p>KG이니시스 결제와 영카트 주문을 대조해야 하는 거래가 확인됐습니다.</p>'
|
||||
.'<p>자동으로 주문을 생성하거나 결제를 취소하지 않았습니다. KG이니시스 거래조회 결과와 상점관리자 거래내역을 확인한 후 조치해 주십시오.</p>'
|
||||
.'<table style="border-collapse:collapse"><thead><tr><th style="padding:6px;border:1px solid #ddd">주문번호</th><th style="padding:6px;border:1px solid #ddd">로컬 상태</th><th style="padding:6px;border:1px solid #ddd">KG 상태</th><th style="padding:6px;border:1px solid #ddd">금액</th></tr></thead><tbody>'
|
||||
.$mail_msg.'</tbody></table>';
|
||||
$sent = mailer($config['cf_admin_email_name'], $config['cf_admin_email'], $config['cf_admin_email'], '['.$config['cf_title'].'] KG이니시스 결제 확인 필요', $content, 1);
|
||||
if (!$sent)
|
||||
return;
|
||||
|
||||
foreach ($alert_rows as $alert_row) {
|
||||
sql_query(" update `{$tables['summary']}`
|
||||
set ip_alerted_at = '".G5_TIME_YMDHIS."',
|
||||
ip_alert_key = '".sql_escape_string($alert_row['key'])."'
|
||||
where ip_oid = '".sql_escape_string($alert_row['oid'])."' ", false);
|
||||
}
|
||||
}
|
||||
|
||||
function check_order_inicis_tmps(){
|
||||
global $g5, $config, $default, $member;
|
||||
|
||||
@@ -225,7 +418,9 @@ function check_order_inicis_tmps(){
|
||||
|
||||
if( ! $admin_cookie_time ){
|
||||
|
||||
if( $default['de_pg_service'] === 'inicis' && empty($default['de_card_test']) ){
|
||||
if ($default['de_pg_service'] === 'inicis' && !empty($default['de_inicis_pro_use'])) {
|
||||
check_order_inicis_pro_payments();
|
||||
} elseif( $default['de_pg_service'] === 'inicis' && empty($default['de_card_test']) ){
|
||||
$sql = " select * from {$g5['g5_shop_inicis_log_table']} where P_TID <> '' and P_TYPE in ('CARD', 'ISP', 'BANK') and P_MID <> '' and P_STATUS = '00' and is_mail_send = 0 and substr(P_AUTH_DT, 1, 14) < '".date('YmdHis', strtotime('-3 minutes', G5_SERVER_TIME))."' ";
|
||||
|
||||
$result = sql_query($sql, false);
|
||||
@@ -240,7 +435,7 @@ function check_order_inicis_tmps(){
|
||||
|
||||
$oid = $row['oid'];
|
||||
$p_tid = $row['P_TID'];
|
||||
$p_mid = strtolower($tmps['P_MID']);
|
||||
$p_mid = strtolower($row['P_MID']);
|
||||
|
||||
if( in_array($p_mid, array('iniescrow0', 'inipaytest')) ) continue;
|
||||
|
||||
|
||||
@@ -6,6 +6,11 @@ auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
$ca_include_head = isset($_POST['ca_include_head']) ? trim($_POST['ca_include_head']) : '';
|
||||
$ca_include_tail = isset($_POST['ca_include_tail']) ? trim($_POST['ca_include_tail']) : '';
|
||||
// 저장·검증 전에 경로를 먼저 정규화하여, 검증 이후 경로가 달라지지 않도록 한다.
|
||||
if( function_exists('filter_input_include_path') ){
|
||||
$ca_include_head = filter_input_include_path($ca_include_head);
|
||||
$ca_include_tail = filter_input_include_path($ca_include_tail);
|
||||
}
|
||||
$ca_id = isset($_REQUEST['ca_id']) ? preg_replace('/[^0-9a-z]/i', '', $_REQUEST['ca_id']) : '';
|
||||
|
||||
if( ! $ca_id ){
|
||||
@@ -93,6 +98,14 @@ if(!is_include_path_check($ca_include_tail, 1)) {
|
||||
alert('하단 파일 경로에 포함시킬수 없는 문자열이 있습니다.');
|
||||
}
|
||||
|
||||
if($ca_include_head && function_exists('is_content_include_allowed') && !is_content_include_allowed($ca_include_head)) {
|
||||
alert('상단 파일 경로로 사용할 수 없는 위치입니다.');
|
||||
}
|
||||
|
||||
if($ca_include_tail && function_exists('is_content_include_allowed') && !is_content_include_allowed($ca_include_tail)) {
|
||||
alert('하단 파일 경로로 사용할 수 없는 위치입니다.');
|
||||
}
|
||||
|
||||
$check_keys = array('ca_skin_dir', 'ca_mobile_skin_dir', 'ca_skin', 'ca_mobile_skin');
|
||||
|
||||
foreach( $check_keys as $key ){
|
||||
@@ -101,11 +114,6 @@ foreach( $check_keys as $key ){
|
||||
}
|
||||
}
|
||||
|
||||
if( function_exists('filter_input_include_path') ){
|
||||
$ca_include_head = filter_input_include_path($ca_include_head);
|
||||
$ca_include_tail = filter_input_include_path($ca_include_tail);
|
||||
}
|
||||
|
||||
if ($w == "u" || $w == "d")
|
||||
check_demo();
|
||||
|
||||
|
||||
@@ -207,6 +207,44 @@ if( ! isset($default['de_inicis_iniapi_key']) ){
|
||||
sql_query($sql, false);
|
||||
}
|
||||
|
||||
// KG이니시스 INIpay PRO 설정 추가
|
||||
if (!isset($default['de_inicis_pro_use'])) {
|
||||
$sql = "ALTER TABLE `{$g5['g5_shop_default_table']}`
|
||||
ADD COLUMN `de_inicis_pro_use` TINYINT(4) NOT NULL DEFAULT '0' AFTER `de_inicis_sign_key`,
|
||||
ADD COLUMN `de_inicis_hash_key` VARCHAR(255) NOT NULL DEFAULT '' AFTER `de_inicis_pro_use`; ";
|
||||
sql_query($sql, false);
|
||||
}
|
||||
|
||||
if (!isset($default['de_inicis_pro_alert_use'])) {
|
||||
sql_query("ALTER TABLE `{$g5['g5_shop_default_table']}` ADD COLUMN `de_inicis_pro_alert_use` TINYINT(4) NOT NULL DEFAULT '1'", false);
|
||||
$default['de_inicis_pro_alert_use'] = 1;
|
||||
}
|
||||
if (!isset($default['de_inicis_pro_reconcile_use'])) {
|
||||
sql_query("ALTER TABLE `{$g5['g5_shop_default_table']}` ADD COLUMN `de_inicis_pro_reconcile_use` TINYINT(4) NOT NULL DEFAULT '0'", false);
|
||||
$default['de_inicis_pro_reconcile_use'] = 0;
|
||||
}
|
||||
if (!isset($default['de_inicis_pro_log_days'])) {
|
||||
sql_query("ALTER TABLE `{$g5['g5_shop_default_table']}` ADD COLUMN `de_inicis_pro_log_days` INT(11) NOT NULL DEFAULT '365'", false);
|
||||
$default['de_inicis_pro_log_days'] = 365;
|
||||
}
|
||||
if (!isset($default['de_inicis_pro_summary_days'])) {
|
||||
sql_query("ALTER TABLE `{$g5['g5_shop_default_table']}` ADD COLUMN `de_inicis_pro_summary_days` INT(11) NOT NULL DEFAULT '1825'", false);
|
||||
$default['de_inicis_pro_summary_days'] = 1825;
|
||||
}
|
||||
if (!array_key_exists('de_inicis_pro_monitor_at', $default)) {
|
||||
sql_query("ALTER TABLE `{$g5['g5_shop_default_table']}` ADD COLUMN `de_inicis_pro_monitor_at` DATETIME DEFAULT NULL", false);
|
||||
$default['de_inicis_pro_monitor_at'] = '';
|
||||
}
|
||||
if (!isset($default['de_inicis_pro_monitor_message'])) {
|
||||
sql_query("ALTER TABLE `{$g5['g5_shop_default_table']}` ADD COLUMN `de_inicis_pro_monitor_message` VARCHAR(255) NOT NULL DEFAULT ''", false);
|
||||
$default['de_inicis_pro_monitor_message'] = '';
|
||||
}
|
||||
|
||||
// KG이니시스 INIpay PRO 결제 감사 테이블이 없으면 생성한다.
|
||||
include_once(G5_SHOP_PATH.'/inicis/pro/inicis_pro.lib.php');
|
||||
if (function_exists('inicis_pro_audit_ensure_tables'))
|
||||
inicis_pro_audit_ensure_tables();
|
||||
|
||||
// NICEPAY mid, key 추가
|
||||
if (! isset($default['de_nicepay_mid'])) {
|
||||
$sql = "ALTER TABLE `{$g5['g5_shop_default_table']}`
|
||||
@@ -879,34 +917,73 @@ if(!$default['de_kakaopay_cancelpwd']){
|
||||
<span class="sitecode">SIR</span> <input type="text" name="de_inicis_mid" value="<?php echo $default['de_inicis_mid']; ?>" id="de_inicis_mid" class="frm_input code_input" size="10" maxlength="10"> 영문소문자(숫자포함 가능)
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="pg_info_fld inicis_info_fld">
|
||||
<th scope="row"><label for="de_inicis_pro_use">KG이니시스 INIpay PRO</label></th>
|
||||
<td>
|
||||
<?php echo help("체크시 PC와 모바일에서 가장 최신 결제모듈인 KG이니시스 INIpay PRO 통합 결제창을 사용합니다. 실결제시 반드시 필수로 KG이니시스 모바일 금액위변조 Hash Key 를 입력해야 합니다."); ?>
|
||||
<input type="checkbox" name="de_inicis_pro_use" value="1" id="de_inicis_pro_use"<?php echo !empty($default['de_inicis_pro_use']) ? ' checked' : ''; ?>> <label for="de_inicis_pro_use">사용</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="pg_info_fld inicis_info_fld">
|
||||
<th scope="row"><label for="de_inicis_sign_key">KG이니시스 웹결제 사인키</label></th>
|
||||
<td>
|
||||
<?php echo help("KG이니시스에서 발급받은 웹결제 사인키를 입력합니다.\n<a href='https://iniweb.inicis.com/' target='_blank'>KG이니시스 가맹점관리자</a> > 상점정보 > 계약정보 > 부가정보의 웹결제 signkey생성 조회 버튼 클릭, 팝업창에서 생성 버튼 클릭 후 해당 값을 입력합니다."); ?>
|
||||
<?php echo help("KG이니시스에서 발급받은 웹결제 사인키를 입력합니다.\n<a href='https://iniweb.inicis.com/' target='_blank'>KG이니시스 가맹점관리자</a> > 상점정보 > 계약정보 > KEY 정보의 웹결제 signkey생성 조회 버튼 클릭, 팝업창에서 생성 버튼 클릭 후 해당 값을 입력합니다."); ?>
|
||||
<input type="text" name="de_inicis_sign_key" value="<?php echo get_sanitize_input($default['de_inicis_sign_key']); ?>" id="de_inicis_sign_key" class="frm_input" size="40" maxlength="50">
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="pg_info_fld inicis_info_fld">
|
||||
<th scope="row"><label for="de_inicis_hash_key">KG이니시스 모바일 금액위변조 Hash Key</label></th>
|
||||
<td>
|
||||
<?php echo help("<a href='https://iniweb.inicis.com/' target='_blank'>KG이니시스 가맹점관리자</a> > 상점정보 > 계약정보 > KEY 정보의 모바일 금액위변조 HashKey를 입력합니다."); ?>
|
||||
<input type="text" name="de_inicis_hash_key" value="<?php echo isset($default['de_inicis_hash_key']) ? get_sanitize_input($default['de_inicis_hash_key']) : ''; ?>" id="de_inicis_hash_key" class="frm_input" size="40" maxlength="255" autocomplete="off">
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="pg_info_fld inicis_info_fld">
|
||||
<th scope="row"><label for="de_inicis_iniapi_key">KG이니시스 INIAPI KEY</label></th>
|
||||
<td>
|
||||
<?php echo help("<a href='https://iniweb.inicis.com/' target='_blank'>KG이니시스 가맹점관리자</a> > 상점정보 > 계약정보 > 부가정보 > INIAPI key 생성 조회 하여 KEY를 여기에 입력합니다.\n이 항목은 영카트 주문에서 kg이니시스 PG 결제 취소, 부분취소, 에스크로 배송등록, 현금영수증 발급에 필요합니다."); ?>
|
||||
<?php echo help("<a href='https://iniweb.inicis.com/' target='_blank'>KG이니시스 가맹점관리자</a> > 상점정보 > 계약정보 > KEY 정보 > INIAPI key 생성 조회 하여 KEY를 여기에 입력합니다.\n이 항목은 영카트 주문에서 kg이니시스 PG 결제 취소, 부분취소, 에스크로 배송등록, 현금영수증 발급에 필요합니다."); ?>
|
||||
<input type="text" name="de_inicis_iniapi_key" value="<?php echo get_sanitize_input($default['de_inicis_iniapi_key']); ?>" id="de_inicis_iniapi_key" class="frm_input" size="30" maxlength="30">
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="pg_info_fld inicis_info_fld">
|
||||
<th scope="row"><label for="de_inicis_iniapi_iv">KG이니시스 INIAPI IV</label></th>
|
||||
<td>
|
||||
<?php echo help("<a href='https://iniweb.inicis.com/' target='_blank'>KG이니시스 가맹점관리자</a> > 상점정보 > 계약정보 > 부가정보 > INIAPI IV 생성 조회 하여 KEY를 여기에 입력합니다.\n이 항목은 영카트 주문에서 kg이니시스 현금영수증 발급에 필요합니다."); ?>
|
||||
<?php echo help("<a href='https://iniweb.inicis.com/' target='_blank'>KG이니시스 가맹점관리자</a> > 상점정보 > 계약정보 > KEY 정보 > INIAPI IV 생성 조회 하여 KEY를 여기에 입력합니다.\n이 항목은 영카트 주문에서 kg이니시스 현금영수증 발급에 필요합니다."); ?>
|
||||
<input type="text" name="de_inicis_iniapi_iv" value="<?php echo get_sanitize_input($default['de_inicis_iniapi_iv']); ?>" id="de_inicis_iniapi_iv" class="frm_input" size="30" maxlength="30">
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="pg_info_fld inicis_info_fld">
|
||||
<th scope="row">KG이니시스 PRO 운영 감시</th>
|
||||
<td>
|
||||
<?php echo help("결제 이상 알림과 미진행 거래 정리는 서버 작업 스케줄러 없이 사이트 접속 흐름에서 자동 실행됩니다. KG이니시스 INIAPI 거래대사는 관리자 접속 시 함께 실행됩니다.\n관리자 접속이 드물거나 독립 실행이 필요하면 서버 작업 스케줄러에서 5~10분 간격으로 다음 명령을 추가로 실행할 수 있습니다(선택).\nphp ".G5_SHOP_PATH."/inicis/pro/monitor.php --host=".preg_replace('/[^A-Za-z0-9.:-]/', '', isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost').((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? ' --https' : '')." --client-ip=".preg_replace('/[^0-9.]/', '', isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : '')."\n거래대사는 최근 완료 거래와 확인 필요 거래를 KG이니시스 INIAPI로 조회하며 주문 생성이나 결제 취소를 자동 실행하지 않습니다."); ?>
|
||||
<input type="checkbox" name="de_inicis_pro_alert_use" value="1" id="de_inicis_pro_alert_use"<?php echo !empty($default['de_inicis_pro_alert_use']) ? ' checked' : ''; ?>> <label for="de_inicis_pro_alert_use">이상 거래 메일 알림</label>
|
||||
|
||||
<input type="checkbox" name="de_inicis_pro_reconcile_use" value="1" id="de_inicis_pro_reconcile_use"<?php echo !empty($default['de_inicis_pro_reconcile_use']) ? ' checked' : ''; ?>> <label for="de_inicis_pro_reconcile_use">최근 완료·확인 필요 거래 자동 대사</label>
|
||||
<br>최근 감시: <?php echo !empty($default['de_inicis_pro_monitor_at']) ? get_text($default['de_inicis_pro_monitor_at']) : '실행 기록 없음'; ?>
|
||||
<?php if (!empty($default['de_inicis_pro_monitor_message'])) { ?> / <?php echo get_text($default['de_inicis_pro_monitor_message']); ?><?php } ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="pg_info_fld inicis_info_fld">
|
||||
<th scope="row"><label for="de_inicis_pro_log_days">PRO 상세 이력 보존기간</label></th>
|
||||
<td>
|
||||
<?php echo help("단계별 상세 이력과 기존 이니시스 로그의 결제 응답 payload를 설정 기간 이후 순차 삭제합니다. 결제 요약은 아래의 별도 보존기간을 적용합니다. 0은 자동 정리 안 함이며, 보존하는 경우 30~3650일로 설정하십시오."); ?>
|
||||
<input type="text" name="de_inicis_pro_log_days" value="<?php echo isset($default['de_inicis_pro_log_days']) ? (int) $default['de_inicis_pro_log_days'] : 365; ?>" id="de_inicis_pro_log_days" class="frm_input" size="6" maxlength="4"> 일
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="pg_info_fld inicis_info_fld">
|
||||
<th scope="row"><label for="de_inicis_pro_summary_days">PRO 결제 요약 보존기간</label></th>
|
||||
<td>
|
||||
<?php echo help("주문이 이미 삭제됐고 확인 또는 환불이 필요하지 않은 최종 결제 요약을 설정 기간 이후 순차 삭제합니다. 실제 주문이 남아 있거나 환불 확인이 필요한 거래는 삭제하지 않습니다. 0은 자동 정리 안 함이며, 보존하는 경우 365~3650일로 설정하십시오."); ?>
|
||||
<input type="text" name="de_inicis_pro_summary_days" value="<?php echo isset($default['de_inicis_pro_summary_days']) ? (int) $default['de_inicis_pro_summary_days'] : 1825; ?>" id="de_inicis_pro_summary_days" class="frm_input" size="6" maxlength="4"> 일
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="pg_info_fld inicis_info_fld">
|
||||
<th scope="row">
|
||||
<label for="de_samsung_pay_use">KG이니시스 삼성페이 사용</label>
|
||||
<a href="http://sir.kr/main/service/samsungpay.php" target="_blank" class="kg_btn">삼성페이 서비스신청하기</a>
|
||||
</th>
|
||||
<td>
|
||||
<?php echo help("KG이니시스와 별도로 <strong>삼성페이 사용 계약을 하신 경우</strong>에만 체크해주세요. (모바일 주문서 결제수단에 삼성페이가 노출됩니다.) <br >실결제시 반드시 결제대행사 KG이니시스 항목에 상점 아이디와 웹결제 사인키를 입력해 주세요.", 50); ?>
|
||||
<?php echo help("KG이니시스와 별도로 <strong>삼성페이 사용 계약을 하신 경우</strong>에만 체크해주세요. INIpay PRO 사용 시 PC와 모바일 주문서에 삼성페이가 노출되며 삼성페이 결제창을 직접 호출합니다. 구버전 결제에서는 모바일 주문서에만 노출됩니다.<br>실결제 시 상점 아이디와 사용 중인 결제모듈의 인증키(PRO: HashKey, 구버전: 웹결제 사인키)를 입력해 주세요.", 50); ?>
|
||||
<input type="checkbox" name="de_samsung_pay_use" value="1" id="de_samsung_pay_use"<?php echo $default['de_samsung_pay_use']?' checked':''; ?>> <label for="de_samsung_pay_use">사용</label>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -915,7 +992,7 @@ if(!$default['de_kakaopay_cancelpwd']){
|
||||
<label for="de_inicis_lpay_use">KG이니시스 L.pay 사용</label>
|
||||
</th>
|
||||
<td>
|
||||
<?php echo help("체크시 KG이니시스 L.pay를 사용합니다. <br >실결제시 반드시 결제대행사 KG이니시스 항목의 상점 정보( 아이디, 웹결제 사인키 )를 입력해 주세요.", 50); ?>
|
||||
<?php echo help("체크 시 KG이니시스 L.pay를 사용합니다. INIpay PRO에서는 주문서에서 L.pay 선택 시 L.pay 결제창을 직접 호출합니다.<br>실결제 시 상점 아이디와 사용 중인 결제모듈의 인증키(PRO: HashKey, 구버전: 웹결제 사인키)를 입력해 주세요.", 50); ?>
|
||||
<input type="checkbox" name="de_inicis_lpay_use" value="1" id="de_inicis_lpay_use"<?php echo $default['de_inicis_lpay_use']?' checked':''; ?>> <label for="de_inicis_lpay_use">사용</label>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -924,7 +1001,7 @@ if(!$default['de_kakaopay_cancelpwd']){
|
||||
<label for="de_inicis_kakaopay_use">KG이니시스 카카오페이 사용</label>
|
||||
</th>
|
||||
<td>
|
||||
<?php echo help("체크시 KG이니시스 결제의 카카오페이를 사용합니다. 주문서 결제수단에 카카오페이가 노출됩니다. <br>실결제시 반드시 결제대행사 KG이니시스 항목의 상점 정보( 아이디, 웹결제 사인키 )를 입력해 주세요.", 50); ?>
|
||||
<?php echo help("체크 시 KG이니시스 결제의 카카오페이를 사용합니다. INIpay PRO에서는 주문서에서 카카오페이 선택 시 카카오페이 결제창을 직접 호출합니다.<br>실결제 시 상점 아이디와 사용 중인 결제모듈의 인증키(PRO: HashKey, 구버전: 웹결제 사인키)를 입력해 주세요.", 50); ?>
|
||||
<input type="checkbox" name="de_inicis_kakaopay_use" value="1" id="de_inicis_kakaopay_use"<?php echo $default['de_inicis_kakaopay_use']?' checked':''; ?>> <label for="de_inicis_kakaopay_use">사용</label>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -933,7 +1010,7 @@ if(!$default['de_kakaopay_cancelpwd']){
|
||||
<label for="de_inicis_cartpoint_use">KG이니시스 신용카드 포인트 결제</label>
|
||||
</th>
|
||||
<td>
|
||||
<?php echo help("신용카드 포인트 결제에 대해 이니시스와 계약을 맺은 상점에서만 적용하는 옵션입니다.<br>체크시 pc 결제에서는 신용카드 포인트 사용 여부에 대한 팝업창에 사용 버튼과 사용안함 버튼이 표기되어 결제하는 고객의 선택여부에 따라 신용카드 포인트 결제가 가능합니다.<br >모바일에서는 신용카드 포인트 사용이 가능합니다.", 50); ?>
|
||||
<?php echo help("신용카드 포인트 결제에 대해 이니시스와 계약을 맺은 상점에서만 적용하는 구버전 결제 옵션입니다.<br>체크 시 PC 결제에서는 신용카드 포인트 사용 여부를 선택할 수 있고 모바일에서도 카드 포인트를 사용할 수 있습니다.<br>INIpay PRO에는 이 설정을 전달하지 않습니다. PRO 카드 포인트 사용은 KG이니시스에서 해당 MID의 지원 여부와 요청 규격을 확인한 후 적용해야 합니다.", 50); ?>
|
||||
<input type="checkbox" name="de_inicis_cartpoint_use" value="1" id="de_inicis_cartpoint_use"<?php echo $default['de_inicis_cartpoint_use']?' checked':''; ?>> <label for="de_inicis_cartpoint_use">사용</label>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1789,6 +1866,26 @@ function byte_check(el_cont, el_byte)
|
||||
</form>
|
||||
|
||||
<script>
|
||||
function inicis_pro_retention_check(id, min, label)
|
||||
{
|
||||
var el = document.getElementById(id);
|
||||
if (!el) return true;
|
||||
var raw = el.value.replace(/^\s+|\s+$/g, "");
|
||||
if (raw === "") return true;
|
||||
if (!/^[0-9]+$/.test(raw)) {
|
||||
alert("INIpay PRO " + label + " 보존기간은 숫자로 입력해 주십시오.");
|
||||
el.focus();
|
||||
return false;
|
||||
}
|
||||
var days = parseInt(raw, 10);
|
||||
if (days !== 0 && (days < min || days > 3650)) {
|
||||
alert("INIpay PRO " + label + " 보존기간은 0 또는 " + min + "~3650일로 설정해 주십시오.");
|
||||
el.focus();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function fconfig_check(f)
|
||||
{
|
||||
<?php echo get_editor_js('de_baesong_content'); ?>
|
||||
@@ -1798,6 +1895,29 @@ function fconfig_check(f)
|
||||
var msg = "",
|
||||
pg_msg = "";
|
||||
|
||||
if (!inicis_pro_retention_check("de_inicis_pro_log_days", 30, "상세 이력")) return false;
|
||||
if (!inicis_pro_retention_check("de_inicis_pro_summary_days", 365, "결제 요약")) return false;
|
||||
|
||||
if (f.de_pg_service.value == "inicis") {
|
||||
var pro_use_el = document.getElementById("de_inicis_pro_use");
|
||||
var inicis_test = parseInt(f.de_card_test.value, 10) > 0;
|
||||
if (pro_use_el && pro_use_el.checked && !inicis_test) {
|
||||
var hash_el = document.getElementById("de_inicis_hash_key");
|
||||
if (hash_el && hash_el.value.replace(/[^A-Za-z0-9+\/=_-]/g, "") === "") {
|
||||
alert("INIpay PRO를 사용하려면 HashKey를 입력해 주십시오.");
|
||||
hash_el.focus();
|
||||
return false;
|
||||
}
|
||||
var reconcile_el = document.getElementById("de_inicis_pro_reconcile_use");
|
||||
var iniapi_el = document.getElementById("de_inicis_iniapi_key");
|
||||
if (reconcile_el && reconcile_el.checked && iniapi_el && iniapi_el.value.replace(/^\s+|\s+$/g, "") === "") {
|
||||
alert("INIpay PRO 자동 거래대사를 사용하려면 INIAPI KEY를 입력해 주십시오.");
|
||||
iniapi_el.focus();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( f.de_pg_service.value == "kcp" ){
|
||||
if( f.de_kcp_mid.value && f.de_kcp_site_key.value && parseInt(f.de_card_test.value) > 0 ){
|
||||
pg_msg = "NHN KCP";
|
||||
|
||||
@@ -15,6 +15,16 @@ if(! (isset($_POST['de_admin_company_tel']) && check_vaild_callback($_POST['de_a
|
||||
// 로그인을 바로 이 주소로 하는 경우 쇼핑몰설정값이 사라지는 현상을 방지
|
||||
if (!$_POST['de_admin_company_owner']) goto_url("./configform.php");
|
||||
|
||||
$logo_img_fields = array('logo_img', 'logo_img2', 'mobile_logo_img', 'mobile_logo_img2');
|
||||
foreach ($logo_img_fields as $logo_img_field) {
|
||||
if (isset($_FILES[$logo_img_field]['name']) && $_FILES[$logo_img_field]['name']) {
|
||||
$filename = get_safe_filename($_FILES[$logo_img_field]['name']);
|
||||
if (is_disallowed_svg_filename($filename)) {
|
||||
alert('허용되지 않는 파일 확장자입니다. (svg, svgz)');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (! empty($_POST['logo_img_del'])) @unlink(G5_DATA_PATH."/common/logo_img");
|
||||
if (! empty($_POST['logo_img_del2'])) @unlink(G5_DATA_PATH."/common/logo_img2");
|
||||
if (! empty($_POST['mobile_logo_img_del'])) @unlink(G5_DATA_PATH."/common/mobile_logo_img");
|
||||
@@ -167,6 +177,12 @@ $check_sanitize_keys = array(
|
||||
'de_inicis_iniapi_key', //KG이니시스 INIAPI KEY
|
||||
'de_inicis_iniapi_iv', //KG이니시스 INIAPI IV
|
||||
'de_inicis_sign_key', //KG이니시스 웹결제 사인키
|
||||
'de_inicis_pro_use', //KG이니시스 INIpay PRO 사용
|
||||
'de_inicis_hash_key', //KG이니시스 INIpay PRO HashKey
|
||||
'de_inicis_pro_alert_use', //KG이니시스 INIpay PRO 이상 거래 알림
|
||||
'de_inicis_pro_reconcile_use', //KG이니시스 INIpay PRO 자동 거래대사
|
||||
'de_inicis_pro_log_days', //KG이니시스 INIpay PRO 상세 이력 보존기간
|
||||
'de_inicis_pro_summary_days', //KG이니시스 INIpay PRO 결제 요약 보존기간
|
||||
'de_samsung_pay_use', //KG이니시스 삼성페이 사용
|
||||
'de_inicis_lpay_use', //KG이니시스 Lpay 사용
|
||||
'de_inicis_kakaopay_use', //KG이니시스 카카오페이 사용
|
||||
@@ -253,6 +269,29 @@ foreach( $check_sanitize_keys as $key ){
|
||||
}
|
||||
}
|
||||
|
||||
$de_inicis_pro_use = !empty($de_inicis_pro_use) ? 1 : 0;
|
||||
$de_inicis_hash_key = preg_replace('/[^A-Za-z0-9+\/=_-]/', '', $de_inicis_hash_key);
|
||||
|
||||
$de_inicis_pro_alert_use = !empty($de_inicis_pro_alert_use) ? 1 : 0;
|
||||
$de_inicis_pro_reconcile_use = !empty($de_inicis_pro_reconcile_use) ? 1 : 0;
|
||||
$de_inicis_pro_log_days = (int) $de_inicis_pro_log_days;
|
||||
if ($de_inicis_pro_log_days !== 0 && ($de_inicis_pro_log_days < 30 || $de_inicis_pro_log_days > 3650))
|
||||
alert('INIpay PRO 상세 이력 보존기간은 0 또는 30~3650일로 설정해 주십시오.');
|
||||
$de_inicis_pro_summary_days = (int) $de_inicis_pro_summary_days;
|
||||
if ($de_inicis_pro_summary_days !== 0 && ($de_inicis_pro_summary_days < 365 || $de_inicis_pro_summary_days > 3650))
|
||||
alert('INIpay PRO 결제 요약 보존기간은 0 또는 365~3650일로 설정해 주십시오.');
|
||||
|
||||
if ($de_pg_service === 'inicis' && $de_inicis_pro_use) {
|
||||
if (empty($de_card_test) && $de_inicis_hash_key === '')
|
||||
alert('INIpay PRO를 사용하려면 HashKey를 입력해 주십시오.');
|
||||
if (!function_exists('curl_init'))
|
||||
alert('INIpay PRO를 사용하려면 PHP cURL 모듈이 필요합니다.');
|
||||
if (!function_exists('hash') || !in_array('sha512', hash_algos()))
|
||||
alert('INIpay PRO를 사용하려면 SHA-512 해시 지원이 필요합니다.');
|
||||
if ($de_inicis_pro_reconcile_use && empty($de_card_test) && trim($de_inicis_iniapi_key) === '')
|
||||
alert('INIpay PRO 자동 거래대사를 사용하려면 INIAPI KEY를 입력해 주십시오.');
|
||||
}
|
||||
|
||||
$warning_msg = '';
|
||||
|
||||
// kcp 전자결제를 사용할 때 site key 입력체크
|
||||
@@ -411,6 +450,12 @@ $sql = " update {$g5['g5_shop_default_table']}
|
||||
de_inicis_iniapi_key = '{$de_inicis_iniapi_key}',
|
||||
de_inicis_iniapi_iv = '{$de_inicis_iniapi_iv}',
|
||||
de_inicis_sign_key = '{$de_inicis_sign_key}',
|
||||
de_inicis_pro_use = '{$de_inicis_pro_use}',
|
||||
de_inicis_hash_key = '{$de_inicis_hash_key}',
|
||||
de_inicis_pro_alert_use = '{$de_inicis_pro_alert_use}',
|
||||
de_inicis_pro_reconcile_use = '{$de_inicis_pro_reconcile_use}',
|
||||
de_inicis_pro_log_days = '{$de_inicis_pro_log_days}',
|
||||
de_inicis_pro_summary_days = '{$de_inicis_pro_summary_days}',
|
||||
de_iche_use = '{$de_iche_use}',
|
||||
de_sms_cont1 = '{$_POST['de_sms_cont1']}',
|
||||
de_sms_cont2 = '{$_POST['de_sms_cont2']}',
|
||||
|
||||
@@ -4,6 +4,7 @@ include_once('./_common.php');
|
||||
|
||||
$cz_id = isset($_REQUEST['cz_id']) ? (int) $_REQUEST['cz_id'] : 0;
|
||||
$cp = array(
|
||||
'cz_id'=>'',
|
||||
'cp_method'=>'',
|
||||
'cz_subject'=>'',
|
||||
'cp_target'=>'',
|
||||
@@ -13,7 +14,6 @@ $cp = array(
|
||||
'mb_id'=>'',
|
||||
'cz_type'=>'',
|
||||
'cz_point'=>'',
|
||||
'cp_price'=>'',
|
||||
'cz_file'=>'',
|
||||
'cp_minimum'=>'',
|
||||
'cp_maximum'=>'',
|
||||
|
||||
@@ -0,0 +1,425 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit;
|
||||
|
||||
if (!function_exists('inicis_admin_status_label')) {
|
||||
function inicis_admin_status_label($status)
|
||||
{
|
||||
$labels = array(
|
||||
'request_ready' => '결제창 요청 준비',
|
||||
'request_expired' => '결제창 종료·미진행',
|
||||
'authentication_received' => '인증결과 수신',
|
||||
'authentication_failed' => '인증 실패',
|
||||
'validation_failed' => '주문 검증 실패',
|
||||
'approval_started' => '승인 요청 중',
|
||||
'communication_failed' => '승인 통신 실패',
|
||||
'approval_failed' => '승인 실패',
|
||||
'approved' => '승인 성공',
|
||||
'order_saving' => '주문 저장 중',
|
||||
'order_saved' => '주문 저장 완료',
|
||||
'notification_received' => '서버 통보 수신',
|
||||
'notification_failed' => '서버 통보 검증 실패',
|
||||
'notification_acknowledged' => '처리 완료 통보 확인',
|
||||
'vbank_issued' => '가상계좌 발급',
|
||||
'paid' => '입금 통보 처리 완료',
|
||||
'paid_after_cancel' => '취소 후 입금·환불 필요',
|
||||
'refund_required' => '환불 필요',
|
||||
'refund_completed' => '환불 확인 완료',
|
||||
'cancel_requested' => '취소 요청 중',
|
||||
'canceled' => '취소 완료',
|
||||
'cancel_failed' => '취소 확인 필요',
|
||||
'partial_canceled' => '부분취소 완료',
|
||||
'partial_cancel_failed' => '부분취소 확인 필요',
|
||||
'inquiry_success' => 'KG 거래조회 완료',
|
||||
'inquiry_failed' => 'KG 거래조회 실패',
|
||||
'approval_reference_recovered' => '승인 TID 복구'
|
||||
);
|
||||
|
||||
return isset($labels[$status]) ? $labels[$status] : $status;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('inicis_admin_pay_type_label')) {
|
||||
function inicis_admin_pay_type_label($pay_type, $easy_pay)
|
||||
{
|
||||
$easy_labels = array(
|
||||
'SAMSUNGPAY' => '삼성페이',
|
||||
'LPAY' => 'L.pay',
|
||||
'KAKAOPAY' => '카카오페이',
|
||||
'EASYPAY' => '간편결제'
|
||||
);
|
||||
$easy_pay = strtoupper((string) $easy_pay);
|
||||
if (isset($easy_labels[$easy_pay]))
|
||||
return $easy_labels[$easy_pay].' (CARD)';
|
||||
|
||||
$pay_labels = array('CARD' => '신용카드', 'BANK' => '계좌이체', 'VBANK' => '가상계좌', 'HPP' => '휴대폰');
|
||||
$pay_type = strtoupper((string) $pay_type);
|
||||
|
||||
return isset($pay_labels[$pay_type]) ? $pay_labels[$pay_type] : $pay_type;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('inicis_admin_stage_label')) {
|
||||
function inicis_admin_stage_label($stage)
|
||||
{
|
||||
$labels = array(
|
||||
'request' => '결제 요청',
|
||||
'authentication' => '결제 인증',
|
||||
'validation' => '주문 검증',
|
||||
'approval' => '결제 승인',
|
||||
'order' => '주문 저장',
|
||||
'notification' => '서버 통보',
|
||||
'cancel' => '결제 취소',
|
||||
'reconcile' => 'KG 거래대사'
|
||||
);
|
||||
|
||||
return isset($labels[$stage]) ? $labels[$stage] : $stage;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('inicis_admin_pg_status_label')) {
|
||||
function inicis_admin_pg_status_label($status)
|
||||
{
|
||||
$status = strtoupper((string) $status);
|
||||
$labels = array(
|
||||
'0' => '승인',
|
||||
'1' => '취소',
|
||||
'9' => '거래 없음',
|
||||
'N' => '가상계좌 입금대기',
|
||||
'Y' => '가상계좌 입금완료',
|
||||
'C' => '가상계좌 입금 전 취소',
|
||||
'APPROVAL' => '승인',
|
||||
'CANCEL' => '전체취소',
|
||||
'PART_CANCEL' => '부분취소',
|
||||
'DEPOSIT_COMPLETED' => '가상계좌 입금완료',
|
||||
'NON_DEPOSIT' => '가상계좌 입금대기',
|
||||
'DEPOSIT_CANCELED' => '가상계좌 입금취소',
|
||||
'WAITING_FOR_REFUND' => '가상계좌 환불대기',
|
||||
'REFUND_COMPLETED' => '가상계좌 환불완료'
|
||||
);
|
||||
|
||||
return isset($labels[$status]) ? $labels[$status] : $status;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('inicis_admin_source_label')) {
|
||||
function inicis_admin_source_label($source)
|
||||
{
|
||||
$labels = array(
|
||||
'web' => 'PC 브라우저',
|
||||
'mobile' => '모바일 브라우저',
|
||||
'server' => '이니시스 통보',
|
||||
'system' => '시스템',
|
||||
'admin' => '관리자'
|
||||
);
|
||||
|
||||
return isset($labels[$source]) ? $labels[$source] : $source;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('inicis_admin_primary_status')) {
|
||||
function inicis_admin_primary_status($row)
|
||||
{
|
||||
if (!empty($row['ip_refund_required']))
|
||||
return 'refund_required';
|
||||
if (!empty($row['ip_noti_status']) && $row['ip_noti_status'] === 'notification_failed')
|
||||
return 'notification_failed';
|
||||
if (!empty($row['ip_cancel_status']) && in_array($row['ip_cancel_status'], array('cancel_failed', 'partial_cancel_failed')))
|
||||
return $row['ip_cancel_status'];
|
||||
if (!empty($row['ip_cancel_status']) && $row['ip_cancel_status'] === 'cancel_requested')
|
||||
return 'cancel_requested';
|
||||
if (!empty($row['ip_noti_status']) && $row['ip_noti_status'] === 'notification_received')
|
||||
return 'notification_received';
|
||||
|
||||
// 서버 통보가 이후 정상 확인·처리 상태로 넘어갔는데도 이전 통보 검증 실패가
|
||||
// 원본 상태에 남아 있으면, 최신 통보 상태를 대표 상태로 사용한다.
|
||||
if (isset($row['ip_status']) && $row['ip_status'] === 'notification_failed'
|
||||
&& !empty($row['ip_noti_status']) && $row['ip_noti_status'] !== 'notification_failed')
|
||||
return $row['ip_noti_status'];
|
||||
|
||||
return isset($row['ip_status']) ? $row['ip_status'] : '';
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('inicis_admin_has_order')) {
|
||||
function inicis_admin_has_order($row)
|
||||
{
|
||||
if (isset($row['ip_order_type']) && $row['ip_order_type'] === 'personal')
|
||||
return !empty($row['personal_oid']);
|
||||
|
||||
return !empty($row['order_oid']);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('inicis_admin_order_tid')) {
|
||||
function inicis_admin_order_tid($row)
|
||||
{
|
||||
if (isset($row['ip_order_type']) && $row['ip_order_type'] === 'personal')
|
||||
return isset($row['personal_tid']) ? $row['personal_tid'] : '';
|
||||
|
||||
return isset($row['order_tid']) ? $row['order_tid'] : '';
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('inicis_admin_order_amount')) {
|
||||
function inicis_admin_order_amount($row)
|
||||
{
|
||||
if (isset($row['ip_order_type']) && $row['ip_order_type'] === 'personal')
|
||||
return isset($row['personal_amount']) ? (int) $row['personal_amount'] : 0;
|
||||
|
||||
return isset($row['order_amount']) ? (int) $row['order_amount'] : 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('inicis_admin_is_anomaly')) {
|
||||
function inicis_admin_is_anomaly($row)
|
||||
{
|
||||
if (!empty($row['ip_audit_error']))
|
||||
return true;
|
||||
|
||||
$status = isset($row['ip_status']) ? $row['ip_status'] : '';
|
||||
$noti_status = isset($row['ip_noti_status']) ? $row['ip_noti_status'] : '';
|
||||
$cancel_status = isset($row['ip_cancel_status']) ? $row['ip_cancel_status'] : '';
|
||||
if (!empty($row['ip_refund_required']) || in_array($status, array('paid_after_cancel', 'refund_required')))
|
||||
return true;
|
||||
if ($noti_status === 'notification_failed')
|
||||
return true;
|
||||
if (in_array($cancel_status, array('cancel_failed', 'partial_cancel_failed')))
|
||||
return true;
|
||||
if ($status === 'partial_cancel_failed')
|
||||
return true;
|
||||
$has_order = inicis_admin_has_order($row);
|
||||
$saved_tid = $has_order ? inicis_admin_order_tid($row) : '';
|
||||
$amount_mismatch = $has_order && (int) $row['ip_amount'] > 0
|
||||
&& inicis_admin_order_amount($row) !== (int) $row['ip_amount'];
|
||||
$tid_mismatch = $has_order && !empty($row['ip_tid']) && $saved_tid !== $row['ip_tid'];
|
||||
$mismatch = $amount_mismatch || $tid_mismatch;
|
||||
$is_personal = isset($row['ip_order_type']) && $row['ip_order_type'] === 'personal';
|
||||
$order_canceled = $has_order && !$is_personal
|
||||
&& isset($row['order_status']) && $row['order_status'] === '취소';
|
||||
$order_receipt = $is_personal
|
||||
? (isset($row['personal_receipt_price']) ? (int) $row['personal_receipt_price'] : 0)
|
||||
: (isset($row['order_receipt_price']) ? (int) $row['order_receipt_price'] : 0);
|
||||
$order_misu = !$is_personal && isset($row['order_misu']) ? (int) $row['order_misu'] : 0;
|
||||
$vbank_paid = isset($row['ip_pay_type']) && $row['ip_pay_type'] === 'VBANK'
|
||||
&& ($status === 'paid' || in_array($noti_status, array('paid', 'paid_after_cancel')));
|
||||
if ($status !== 'refund_completed' && $vbank_paid
|
||||
&& ($order_canceled || !$has_order || $order_receipt !== (int) $row['ip_amount'] || $order_misu !== 0))
|
||||
return true;
|
||||
if (isset($row['ip_pay_type']) && $row['ip_pay_type'] === 'VBANK'
|
||||
&& ($status === 'vbank_issued' || $noti_status === 'vbank_issued') && $order_canceled
|
||||
&& $status !== 'canceled' && $cancel_status !== 'canceled')
|
||||
return true;
|
||||
|
||||
$local_order_active = false;
|
||||
if ($has_order) {
|
||||
if (isset($row['ip_order_type']) && $row['ip_order_type'] === 'personal')
|
||||
$local_order_active = isset($row['personal_receipt_price']) && (int) $row['personal_receipt_price'] > 0;
|
||||
else
|
||||
$local_order_active = isset($row['order_status']) && $row['order_status'] !== '취소';
|
||||
}
|
||||
|
||||
$pg_status = !empty($row['ip_pg_result_code']) && $row['ip_pg_result_code'] === '00'
|
||||
? strtoupper((string) $row['ip_pg_status']) : '';
|
||||
$pg_mismatch = $pg_status !== ''
|
||||
&& ((!empty($row['ip_pg_tid']) && !empty($row['ip_tid']) && $row['ip_pg_tid'] !== $row['ip_tid'])
|
||||
|| ((int) $row['ip_pg_amount'] > 0 && (int) $row['ip_amount'] > 0 && (int) $row['ip_pg_amount'] !== (int) $row['ip_amount']));
|
||||
$pg_paid = in_array($pg_status, array('0', 'Y', 'APPROVAL', 'PART_CANCEL', 'DEPOSIT_COMPLETED'));
|
||||
$pg_pending = in_array($pg_status, array('N', 'NON_DEPOSIT'));
|
||||
$pg_attention = $pg_status === 'WAITING_FOR_REFUND';
|
||||
$pg_canceled = in_array($pg_status, array('1', '9', 'C', 'CANCEL', 'DEPOSIT_CANCELED', 'REFUND_COMPLETED'));
|
||||
|
||||
if ($pg_attention)
|
||||
return true;
|
||||
|
||||
// 부분취소 합계로 전액 환불된 주문이 취소 상태이면 PG의 부분취소 표시와 일치하는 종결 상태로 본다.
|
||||
$part_cancel_settled = $pg_status === 'PART_CANCEL' && !$local_order_active && !$is_personal
|
||||
&& isset($row['order_refund_price'], $row['order_receipt_price'])
|
||||
&& (int) $row['order_receipt_price'] > 0
|
||||
&& (int) $row['order_refund_price'] >= (int) $row['order_receipt_price'];
|
||||
if ($pg_paid)
|
||||
return $pg_mismatch || (!$part_cancel_settled && (!$local_order_active || $mismatch));
|
||||
|
||||
$updated = isset($row['ip_updated_at']) ? strtotime($row['ip_updated_at']) : false;
|
||||
if ($pg_pending)
|
||||
return $pg_mismatch || $status === 'canceled' || $status === 'cancel_failed' || $mismatch
|
||||
|| (!$has_order && $updated !== false && $updated < G5_SERVER_TIME - 180);
|
||||
|
||||
if ($pg_canceled)
|
||||
return $pg_mismatch || $local_order_active;
|
||||
|
||||
if (in_array($status, array('authentication_received', 'approval_started', 'cancel_requested'))
|
||||
|| $noti_status === 'notification_received' || $cancel_status === 'cancel_requested')
|
||||
return $updated !== false && $updated < G5_SERVER_TIME - 180;
|
||||
if ($status === 'communication_failed')
|
||||
return true;
|
||||
if ($status === 'validation_failed' && !empty($row['ip_tid']))
|
||||
return true;
|
||||
if ($status === 'cancel_failed' || $cancel_status === 'cancel_failed')
|
||||
return true;
|
||||
|
||||
if ($status === 'canceled') {
|
||||
return $local_order_active;
|
||||
}
|
||||
|
||||
if ($status === 'notification_received')
|
||||
return $updated !== false && $updated < G5_SERVER_TIME - 180;
|
||||
|
||||
if ($has_order)
|
||||
return $mismatch;
|
||||
|
||||
$approved_states = array('approved', 'order_saving', 'order_saved', 'notification_received', 'vbank_issued', 'paid');
|
||||
if (!in_array($status, $approved_states))
|
||||
return false;
|
||||
|
||||
return $updated !== false && $updated < G5_SERVER_TIME - 180;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('inicis_admin_anomaly_sql')) {
|
||||
function inicis_admin_anomaly_sql()
|
||||
{
|
||||
$order_amount = "(o.od_cart_price + o.od_send_cost + o.od_send_cost2 - o.od_cart_coupon - o.od_coupon - o.od_send_coupon - o.od_receipt_point)";
|
||||
$has_order = "((p.ip_order_type = 'personal' and pp.pp_id is not null) or (p.ip_order_type <> 'personal' and o.od_id is not null))";
|
||||
$saved_tid = "if(p.ip_order_type = 'personal', ifnull(pp.pp_tno, ''), ifnull(o.od_tno, ''))";
|
||||
$saved_amount = "if(p.ip_order_type = 'personal', ifnull(pp.pp_price, 0), ifnull($order_amount, 0))";
|
||||
$mismatch = "($has_order and ((p.ip_tid <> '' and p.ip_tid <> $saved_tid) or (p.ip_amount > 0 and p.ip_amount <> $saved_amount)))";
|
||||
$local_active = "((p.ip_order_type = 'personal' and pp.pp_id is not null and pp.pp_receipt_price > 0) or (p.ip_order_type <> 'personal' and o.od_id is not null and o.od_status <> '취소'))";
|
||||
$local_canceled = "(p.ip_order_type <> 'personal' and o.od_id is not null and o.od_status = '취소')";
|
||||
$vbank_paid_mismatch = "(p.ip_status <> 'refund_completed' and p.ip_pay_type = 'VBANK'
|
||||
and (p.ip_status = 'paid' or p.ip_noti_status in ('paid','paid_after_cancel'))
|
||||
and ((p.ip_order_type = 'personal' and (pp.pp_id is null or pp.pp_receipt_price <> p.ip_amount))
|
||||
or (p.ip_order_type <> 'personal' and (o.od_id is null or o.od_status = '취소' or o.od_receipt_price <> p.ip_amount or o.od_misu <> 0))))";
|
||||
$vbank_canceled_before_payment = "(p.ip_pay_type = 'VBANK' and (p.ip_status = 'vbank_issued' or p.ip_noti_status = 'vbank_issued')
|
||||
and p.ip_status <> 'canceled' and p.ip_cancel_status <> 'canceled' and $local_canceled)";
|
||||
$stale = "p.ip_updated_at < date_sub(now(), interval 3 minute)";
|
||||
$pg_paid = "(p.ip_pg_result_code = '00' and p.ip_pg_status in ('0','Y','APPROVAL','PART_CANCEL','DEPOSIT_COMPLETED'))";
|
||||
$pg_pending = "(p.ip_pg_result_code = '00' and p.ip_pg_status in ('N','NON_DEPOSIT'))";
|
||||
$pg_attention = "(p.ip_pg_result_code = '00' and p.ip_pg_status = 'WAITING_FOR_REFUND')";
|
||||
$pg_canceled = "(p.ip_pg_result_code = '00' and p.ip_pg_status in ('1','9','C','CANCEL','DEPOSIT_CANCELED','REFUND_COMPLETED'))";
|
||||
$pg_known = "($pg_paid or $pg_pending or $pg_attention or $pg_canceled)";
|
||||
$part_cancel_settled = "(p.ip_pg_result_code = '00' and p.ip_pg_status = 'PART_CANCEL'
|
||||
and $local_canceled and o.od_receipt_price > 0 and o.od_refund_price >= o.od_receipt_price)";
|
||||
$pg_mismatch = "(p.ip_pg_result_code = '00' and ((p.ip_pg_tid <> '' and p.ip_tid <> '' and p.ip_pg_tid <> p.ip_tid) or (p.ip_pg_amount > 0 and p.ip_amount > 0 and p.ip_pg_amount <> p.ip_amount)))";
|
||||
$approved_states = "'approved','order_saving','order_saved','notification_received','vbank_issued','paid'";
|
||||
$local_anomaly = "(p.ip_status = 'cancel_failed'
|
||||
or p.ip_status = 'communication_failed'
|
||||
or (p.ip_status = 'validation_failed' and p.ip_tid <> '')
|
||||
or (p.ip_status in ('authentication_received','approval_started','cancel_requested') and $stale)
|
||||
or (p.ip_noti_status = 'notification_received' and $stale)
|
||||
or (p.ip_cancel_status = 'cancel_requested' and $stale)
|
||||
or (p.ip_status = 'canceled' and $local_active)
|
||||
or (p.ip_status = 'notification_received' and $stale)
|
||||
or $mismatch
|
||||
or (not $has_order and p.ip_status in ($approved_states) and $stale))";
|
||||
|
||||
return "(p.ip_audit_error = '1'
|
||||
or p.ip_refund_required = '1'
|
||||
or p.ip_status in ('paid_after_cancel','refund_required')
|
||||
or p.ip_noti_status = 'notification_failed'
|
||||
or p.ip_cancel_status in ('cancel_failed','partial_cancel_failed')
|
||||
or p.ip_status = 'partial_cancel_failed'
|
||||
or $vbank_paid_mismatch
|
||||
or $vbank_canceled_before_payment
|
||||
or $pg_mismatch
|
||||
or $pg_attention
|
||||
or ($pg_paid and not $part_cancel_settled and (not $local_active or $mismatch))
|
||||
or ($pg_pending and (p.ip_status in ('canceled','cancel_failed') or $mismatch or (not $has_order and $stale)))
|
||||
or ($pg_canceled and $local_active)
|
||||
or (not $pg_known and $local_anomaly))";
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('inicis_admin_alert_key')) {
|
||||
function inicis_admin_alert_key($row)
|
||||
{
|
||||
return md5(
|
||||
(isset($row['ip_status']) ? $row['ip_status'] : '').'|'.
|
||||
(isset($row['ip_tid']) ? $row['ip_tid'] : '').'|'.
|
||||
(isset($row['ip_amount']) ? $row['ip_amount'] : '').'|'.
|
||||
(isset($row['ip_pg_result_code']) ? $row['ip_pg_result_code'] : '').'|'.
|
||||
(isset($row['ip_pg_status']) ? $row['ip_pg_status'] : '').'|'.
|
||||
(isset($row['ip_pg_tid']) ? $row['ip_pg_tid'] : '').'|'.
|
||||
(isset($row['ip_pg_amount']) ? $row['ip_pg_amount'] : '').'|'.
|
||||
(isset($row['ip_noti_status']) ? $row['ip_noti_status'] : '').'|'.
|
||||
(isset($row['ip_noti_code']) ? $row['ip_noti_code'] : '').'|'.
|
||||
(isset($row['ip_cancel_status']) ? $row['ip_cancel_status'] : '').'|'.
|
||||
(!empty($row['ip_refund_required']) ? '1' : '0').'|'.
|
||||
(inicis_admin_has_order($row) ? '1' : '0').'|'.
|
||||
inicis_admin_order_tid($row).'|'.inicis_admin_order_amount($row).'|'.
|
||||
(isset($row['order_status']) ? $row['order_status'] : '').'|'.
|
||||
(isset($row['order_receipt_price']) ? $row['order_receipt_price'] : '').'|'.
|
||||
(isset($row['order_misu']) ? $row['order_misu'] : '').'|'.
|
||||
(isset($row['personal_receipt_price']) ? $row['personal_receipt_price'] : '').'|'.
|
||||
(!empty($row['ip_audit_error']) ? '1' : '0')
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('inicis_admin_recommendation')) {
|
||||
function inicis_admin_recommendation($row)
|
||||
{
|
||||
if (!empty($row['ip_audit_error']))
|
||||
return '감사 상세 이력 기록이 일부 누락됐습니다. 서버 오류 로그를 확인하고 KG이니시스 상점관리자 거래내역을 기준으로 상태를 확정하십시오.';
|
||||
|
||||
if (!empty($row['ip_refund_required']) || in_array($row['ip_status'], array('paid_after_cancel', 'refund_required')))
|
||||
return '취소된 주문에 가상계좌 입금이 확인됐습니다. 상품을 발송하지 말고 KG이니시스 상점관리자에서 입금 TID를 확인한 뒤 고객 환불을 처리하고 KG 거래조회를 다시 실행하십시오.';
|
||||
if (!empty($row['ip_noti_status']) && $row['ip_noti_status'] === 'notification_failed')
|
||||
return '최근 KG 서버 통보를 검증하거나 저장하지 못했습니다. 통보 실패 코드와 서버 오류 로그를 확인하고 상점관리자에서 입금통보 결과를 재전송하십시오.';
|
||||
if (!empty($row['ip_cancel_status']) && $row['ip_cancel_status'] === 'cancel_failed')
|
||||
return 'PG 전체취소 결과를 확정하지 못했습니다. 영카트 주문상태를 변경하지 말고 KG이니시스 상점관리자의 원거래를 직접 확인하십시오.';
|
||||
if (!empty($row['ip_cancel_status']) && $row['ip_cancel_status'] === 'partial_cancel_failed')
|
||||
return '부분취소 결과를 확정하지 못했습니다. KG이니시스 상점관리자의 원거래와 부분취소 거래내역을 직접 대조하십시오.';
|
||||
if (!empty($row['ip_noti_status']) && $row['ip_noti_status'] === 'notification_received')
|
||||
return '가상계좌 입금 통보 수신 후 주문 반영 완료 기록이 없습니다. 주문 입금액과 미수금을 확인하고, 불일치하면 KG이니시스 상점관리자에서 입금 통보를 재전송하십시오.';
|
||||
if (!empty($row['ip_cancel_status']) && $row['ip_cancel_status'] === 'cancel_requested')
|
||||
return 'PG 취소 요청 후 결과가 확정되지 않았습니다. 영카트 주문을 추가로 변경하지 말고 KG이니시스 상점관리자에서 원거래 취소 여부를 먼저 확인하십시오.';
|
||||
|
||||
if (!empty($row['ip_pg_checked_at']) && $row['ip_pg_result_code'] !== '00')
|
||||
return 'KG 거래조회가 실패했습니다. 해당 MID의 거래조회 계약, INIAPI KEY와 서버 IPv4를 확인한 후 다시 조회하거나 KG이니시스 상점관리자에서 직접 조회하십시오.';
|
||||
|
||||
$has_order = inicis_admin_has_order($row);
|
||||
$pg_status = !empty($row['ip_pg_result_code']) && $row['ip_pg_result_code'] === '00' ? strtoupper((string) $row['ip_pg_status']) : '';
|
||||
$pg_paid = in_array($pg_status, array('0', 'Y', 'APPROVAL', 'PART_CANCEL', 'DEPOSIT_COMPLETED'));
|
||||
$pg_pending = in_array($pg_status, array('N', 'NON_DEPOSIT'));
|
||||
$pg_attention = $pg_status === 'WAITING_FOR_REFUND';
|
||||
$pg_canceled = in_array($pg_status, array('1', '9', 'C', 'CANCEL', 'DEPOSIT_CANCELED', 'REFUND_COMPLETED'));
|
||||
|
||||
if ($pg_status !== '' && ((!empty($row['ip_pg_tid']) && !empty($row['ip_tid']) && $row['ip_pg_tid'] !== $row['ip_tid'])
|
||||
|| ((int) $row['ip_pg_amount'] > 0 && (int) $row['ip_amount'] > 0 && (int) $row['ip_pg_amount'] !== (int) $row['ip_amount'])))
|
||||
return 'KG 거래조회 결과와 영카트 결제 이력의 TID 또는 금액이 다릅니다. 자동 조치하지 말고 KG이니시스 상점관리자 원거래 내역을 직접 확인하십시오.';
|
||||
if ($pg_attention)
|
||||
return '가상계좌 입금 후 환불 대기 상태입니다. 환불이 완료될 때까지 KG이니시스 상점관리자에서 상태를 계속 확인하십시오.';
|
||||
if ($pg_paid && !$has_order)
|
||||
return 'KG이니시스에는 승인 또는 입금이 있으나 영카트 주문이 없습니다. 원 주문 데이터와 재고·포인트 반영 여부를 확인한 뒤 안전한 복원이 불가능하면 상점관리자에서 승인 취소하십시오.';
|
||||
if ($pg_pending && !$has_order)
|
||||
return '가상계좌가 발급됐지만 영카트 주문이 없습니다. 고객 입금 전에 주문 복원 가능 여부를 확인하고, 복원이 불가능하면 해당 가상계좌 거래를 정리하십시오.';
|
||||
$recommend_is_personal = isset($row['ip_order_type']) && $row['ip_order_type'] === 'personal';
|
||||
$order_canceled_match = $has_order && ($recommend_is_personal
|
||||
? !(isset($row['personal_receipt_price']) && (int) $row['personal_receipt_price'] > 0)
|
||||
: (isset($row['order_status']) && $row['order_status'] === '취소'));
|
||||
if ($pg_canceled && $order_canceled_match)
|
||||
return 'KG이니시스 거래와 영카트 주문이 모두 취소 상태로 일치합니다. 별도 조치가 필요하지 않습니다.';
|
||||
if ($pg_canceled && $has_order)
|
||||
return 'KG이니시스 거래는 취소 또는 거래 없음 상태입니다. 영카트 주문의 결제금액·상태를 확인하고 PG 상태와 일치하도록 관리자 처리하십시오.';
|
||||
if ($pg_status === 'PART_CANCEL' && $order_canceled_match && !$recommend_is_personal
|
||||
&& isset($row['order_refund_price'], $row['order_receipt_price'])
|
||||
&& (int) $row['order_receipt_price'] > 0
|
||||
&& (int) $row['order_refund_price'] >= (int) $row['order_receipt_price'])
|
||||
return 'KG이니시스 거래가 부분취소 합계로 전액 환불되었고 영카트 주문도 취소 상태입니다. 별도 조치가 필요하지 않습니다.';
|
||||
if (isset($row['ip_status']) && in_array($row['ip_status'], array('authentication_received', 'approval_started', 'communication_failed')) && empty($row['ip_tid']))
|
||||
return '최종 승인 TID가 영카트에 저장되기 전에 처리가 중단됐을 수 있습니다. 같은 주문을 다시 결제시키기 전에 KG이니시스 상점관리자에서 주문번호 OID로 승인 여부를 확인하십시오.';
|
||||
if (isset($row['ip_status']) && $row['ip_status'] === 'validation_failed' && !empty($row['ip_tid']))
|
||||
return '승인 TID가 생성된 뒤 주문 검증이 중단됐습니다. KG 거래조회 결과를 확인하고 주문이 없다면 승인 취소 여부를 결정하십시오.';
|
||||
if ($has_order && ((!empty($row['ip_tid']) && inicis_admin_order_tid($row) !== $row['ip_tid'])
|
||||
|| ((int) $row['ip_amount'] > 0 && inicis_admin_order_amount($row) !== (int) $row['ip_amount'])))
|
||||
return '결제 이력과 주문 DB의 TID 또는 금액이 다릅니다. 주문 상태를 변경하기 전에 KG이니시스 원거래 TID와 승인금액을 직접 대조하십시오.';
|
||||
if (isset($row['ip_status']) && $row['ip_status'] === 'cancel_failed')
|
||||
return '자동 취소 결과를 확정하지 못했습니다. KG 거래조회를 다시 실행하고 승인 상태라면 상점관리자에서 취소 여부를 결정하십시오.';
|
||||
if (isset($row['ip_status']) && $row['ip_status'] === 'partial_cancel_failed')
|
||||
return '부분취소 결과를 확정하지 못했습니다. KG이니시스 상점관리자의 원거래와 부분취소 거래내역을 직접 대조하십시오.';
|
||||
|
||||
return inicis_admin_is_anomaly($row)
|
||||
? 'KG이니시스 상점관리자에서 승인 TID와 금액을 확인한 뒤 영카트 주문 상태와 맞추십시오.'
|
||||
: '현재 별도 조치가 필요하지 않습니다. KG 거래상태와 영카트 주문의 TID 및 금액이 일치합니다.';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
$sub_menu = '400420';
|
||||
include_once('./_common.php');
|
||||
|
||||
check_demo();
|
||||
auth_check_menu($auth, $sub_menu, 'w');
|
||||
check_admin_token();
|
||||
|
||||
include_once(G5_SHOP_PATH.'/inicis/pro/inicis_pro.lib.php');
|
||||
include_once('./inicislog.lib.php');
|
||||
|
||||
if (!inicis_pro_audit_schema_ready())
|
||||
alert('결제 현황 DB 업그레이드를 먼저 실행해 주십시오.', G5_ADMIN_URL.'/dbupgrade.php');
|
||||
if (inicis_pro_get_iniapi_key() === '')
|
||||
alert('KG이니시스 INIAPI KEY를 먼저 설정해 주십시오.', './configform.php');
|
||||
|
||||
$tables = inicis_pro_audit_tables();
|
||||
$mode = isset($_POST['mode']) && !is_array($_POST['mode']) ? $_POST['mode'] : '';
|
||||
$targets = array();
|
||||
|
||||
if ($mode === 'batch') {
|
||||
$order_amount_sql = "(o.od_cart_price + o.od_send_cost + o.od_send_cost2 - o.od_cart_coupon - o.od_coupon - o.od_send_coupon - o.od_receipt_point)";
|
||||
$anomaly_sql = inicis_admin_anomaly_sql();
|
||||
$result = sql_query(" select p.*,
|
||||
o.od_id as order_oid, o.od_tno as order_tid, o.od_status as order_status,
|
||||
o.od_receipt_price as order_receipt_price, o.od_misu as order_misu, o.od_cancel_price as order_cancel_price,
|
||||
o.od_refund_price as order_refund_price, o.od_settle_case as order_settle_case, $order_amount_sql as order_amount,
|
||||
pp.pp_id as personal_oid, pp.pp_tno as personal_tid, pp.pp_price as personal_amount, pp.pp_receipt_price as personal_receipt_price
|
||||
from `{$tables['summary']}` p
|
||||
left join {$g5['g5_shop_order_table']} o on p.ip_order_type <> 'personal' and o.od_id = p.ip_oid
|
||||
left join {$g5['g5_shop_personalpay_table']} pp on p.ip_order_type = 'personal' and pp.pp_id = p.ip_oid
|
||||
left join {$g5['g5_shop_inicis_log_table']} il on il.oid = p.ip_oid
|
||||
where (p.ip_tid <> '' or (il.P_TID <> '' and il.P_STATUS = '00'))
|
||||
and $anomaly_sql
|
||||
order by p.ip_updated_at asc
|
||||
limit 5 ");
|
||||
while ($row = sql_fetch_array($result))
|
||||
$targets[] = $row;
|
||||
} else {
|
||||
$oid_raw = isset($_POST['oid']) && !is_array($_POST['oid']) ? trim($_POST['oid']) : '';
|
||||
$oid = inicis_pro_clean_oid($oid_raw);
|
||||
if ($oid === '' || $oid !== $oid_raw)
|
||||
alert('결제 주문번호가 올바르지 않습니다.', './inicisloglist.php');
|
||||
|
||||
$row = sql_fetch(" select * from `{$tables['summary']}` where ip_oid = '".sql_escape_string($oid)."' ");
|
||||
if (empty($row['ip_id']))
|
||||
alert('결제 처리 이력을 찾을 수 없습니다.', './inicisloglist.php');
|
||||
$targets[] = $row;
|
||||
}
|
||||
|
||||
if (!count($targets))
|
||||
alert('KG이니시스에서 조회할 확인 필요 거래가 없습니다.', './inicisloglist.php');
|
||||
|
||||
$success_count = 0;
|
||||
$failed_count = 0;
|
||||
$last_oid = '';
|
||||
foreach ($targets as $target) {
|
||||
$last_oid = $target['ip_oid'];
|
||||
$target_tid = !empty($target['ip_tid']) ? $target['ip_tid'] : inicis_pro_recover_approved_tid($target['ip_oid'], 'admin');
|
||||
if ($target_tid === '') {
|
||||
if ($mode !== 'batch')
|
||||
alert('승인 TID가 없어 KG이니시스 거래조회를 실행할 수 없습니다. 인증 전 미완료 결제이거나 승인 TID가 복구되지 않은 거래입니다.', './inicislogview.php?oid='.urlencode($target['ip_oid']));
|
||||
$failed_count++;
|
||||
continue;
|
||||
}
|
||||
$inquiry = inicis_pro_inquiry($target_tid, $target['ip_oid'], $target);
|
||||
if (inicis_pro_save_inquiry($target['ip_oid'], $inquiry, 'admin') && !empty($inquiry['success']))
|
||||
$success_count++;
|
||||
else
|
||||
$failed_count++;
|
||||
}
|
||||
|
||||
$message = 'KG이니시스 거래조회가 완료되었습니다. 성공 '.$success_count.'건, 실패 '.$failed_count.'건';
|
||||
if ($mode !== 'batch' && $last_oid !== '')
|
||||
alert($message, './inicislogview.php?oid='.urlencode($last_oid));
|
||||
|
||||
alert($message, './inicisloglist.php?risk=anomaly');
|
||||
@@ -0,0 +1,265 @@
|
||||
<?php
|
||||
$sub_menu = '400420';
|
||||
include_once('./_common.php');
|
||||
|
||||
auth_check_menu($auth, $sub_menu, 'r');
|
||||
|
||||
include_once(G5_SHOP_PATH.'/inicis/pro/inicis_pro.lib.php');
|
||||
include_once('./inicislog.lib.php');
|
||||
|
||||
$g5['title'] = 'KG이니시스 INIpay PRO 결제 처리 현황';
|
||||
$tables = inicis_pro_audit_tables();
|
||||
$tables_ready = inicis_pro_audit_tables_ready();
|
||||
$schema_ready = inicis_pro_audit_schema_ready();
|
||||
|
||||
$status = isset($_GET['status']) && !is_array($_GET['status']) ? preg_replace('/[^a-z_]/', '', strtolower($_GET['status'])) : '';
|
||||
$allowed_status = array('', 'request_ready', 'request_expired', 'authentication_received', 'authentication_failed', 'validation_failed', 'approval_started', 'communication_failed', 'approval_failed', 'approved', 'order_saving', 'order_saved', 'notification_received', 'notification_failed', 'vbank_issued', 'paid', 'paid_after_cancel', 'refund_required', 'refund_completed', 'cancel_requested', 'canceled', 'cancel_failed', 'partial_canceled', 'partial_cancel_failed');
|
||||
if (!in_array($status, $allowed_status))
|
||||
$status = '';
|
||||
|
||||
$risk = isset($_GET['risk']) && !is_array($_GET['risk']) ? preg_replace('/[^a-z_]/', '', strtolower($_GET['risk'])) : '';
|
||||
if (!in_array($risk, array('', 'anomaly', 'failed', 'processing', 'complete', 'canceled', 'abandoned')))
|
||||
$risk = '';
|
||||
|
||||
$sfl = isset($_GET['sfl']) && !is_array($_GET['sfl']) ? $_GET['sfl'] : 'ip_oid';
|
||||
if (!in_array($sfl, array('ip_oid', 'ip_tid', 'ip_auth_tid', 'mb_id')))
|
||||
$sfl = 'ip_oid';
|
||||
$stx = isset($_GET['stx']) && !is_array($_GET['stx']) ? get_search_string($_GET['stx']) : '';
|
||||
$fr_date = isset($_GET['fr_date']) && !is_array($_GET['fr_date']) && preg_match('/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/', $_GET['fr_date']) ? $_GET['fr_date'] : '';
|
||||
$to_date = isset($_GET['to_date']) && !is_array($_GET['to_date']) && preg_match('/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/', $_GET['to_date']) ? $_GET['to_date'] : '';
|
||||
|
||||
include_once(G5_ADMIN_PATH.'/admin.head.php');
|
||||
|
||||
if (!$tables_ready) {
|
||||
?>
|
||||
<div class="local_desc02 local_desc">
|
||||
<p>결제 현황 테이블이 아직 설치되지 않았습니다. 최고관리자로 <a href="<?php echo G5_ADMIN_URL; ?>/dbupgrade.php"><strong>DB 업그레이드</strong></a>를 실행한 후 이용해 주십시오.</p>
|
||||
</div>
|
||||
<?php
|
||||
include_once(G5_ADMIN_PATH.'/admin.tail.php');
|
||||
exit;
|
||||
}
|
||||
if (!$schema_ready) {
|
||||
?>
|
||||
<div class="local_desc02 local_desc">
|
||||
<p>결제 현황 테이블의 운영 감시 필드가 설치되지 않았습니다. 최고관리자로 <a href="<?php echo G5_ADMIN_URL; ?>/dbupgrade.php"><strong>DB 업그레이드</strong></a>를 실행한 후 이용해 주십시오.</p>
|
||||
</div>
|
||||
<?php
|
||||
include_once(G5_ADMIN_PATH.'/admin.tail.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
include_once(G5_PLUGIN_PATH.'/jquery-ui/datepicker.php');
|
||||
|
||||
$order_amount_sql = "(o.od_cart_price + o.od_send_cost + o.od_send_cost2 - o.od_cart_coupon - o.od_coupon - o.od_send_coupon - o.od_receipt_point)";
|
||||
$has_order_sql = "((p.ip_order_type = 'personal' and pp.pp_id is not null) or (p.ip_order_type <> 'personal' and o.od_id is not null))";
|
||||
$anomaly_sql = inicis_admin_anomaly_sql();
|
||||
|
||||
$where = array();
|
||||
if ($status === 'refund_required')
|
||||
$where[] = "p.ip_refund_required = '1'";
|
||||
elseif ($status !== '')
|
||||
$where[] = "(p.ip_status = '".sql_escape_string($status)."' or p.ip_noti_status = '".sql_escape_string($status)."' or p.ip_cancel_status = '".sql_escape_string($status)."')";
|
||||
if ($stx !== '')
|
||||
$where[] = "p.$sfl like '%".sql_escape_string($stx)."%'";
|
||||
if ($fr_date !== '')
|
||||
$where[] = "p.ip_created_at >= '".sql_escape_string($fr_date)." 00:00:00'";
|
||||
if ($to_date !== '')
|
||||
$where[] = "p.ip_created_at <= '".sql_escape_string($to_date)." 23:59:59'";
|
||||
|
||||
if ($risk === 'anomaly')
|
||||
$where[] = $anomaly_sql;
|
||||
elseif ($risk === 'failed')
|
||||
$where[] = "(p.ip_status in ('authentication_failed','validation_failed','communication_failed','approval_failed') or p.ip_noti_status = 'notification_failed' or p.ip_cancel_status in ('cancel_failed','partial_cancel_failed'))";
|
||||
elseif ($risk === 'processing')
|
||||
$where[] = "(p.ip_status in ('request_ready','authentication_received','approval_started','order_saving','cancel_requested') or p.ip_cancel_status = 'cancel_requested')";
|
||||
elseif ($risk === 'complete')
|
||||
$where[] = "$has_order_sql and p.ip_status in ('order_saved','paid','refund_completed') and not ($anomaly_sql)";
|
||||
elseif ($risk === 'canceled')
|
||||
$where[] = "(p.ip_status = 'canceled' or p.ip_cancel_status in ('canceled','partial_canceled'))";
|
||||
elseif ($risk === 'abandoned')
|
||||
$where[] = "p.ip_status = 'request_expired'";
|
||||
|
||||
$sql_from = " from `{$tables['summary']}` p
|
||||
left join {$g5['g5_shop_order_table']} o on p.ip_order_type <> 'personal' and o.od_id = p.ip_oid
|
||||
left join {$g5['g5_shop_personalpay_table']} pp on p.ip_order_type = 'personal' and pp.pp_id = p.ip_oid ";
|
||||
$sql_where = count($where) ? ' where '.implode(' and ', $where) : '';
|
||||
|
||||
$count = sql_fetch(" select count(*) as cnt $sql_from $sql_where ");
|
||||
$total_count = isset($count['cnt']) ? (int) $count['cnt'] : 0;
|
||||
$all_count = sql_fetch(" select count(*) as cnt from `{$tables['summary']}` ");
|
||||
$anomaly_count = sql_fetch(" select count(*) as cnt $sql_from where $anomaly_sql ");
|
||||
$failed_count = sql_fetch(" select count(*) as cnt from `{$tables['summary']}` where ip_status in ('authentication_failed','validation_failed','communication_failed','approval_failed') or ip_noti_status = 'notification_failed' or ip_cancel_status in ('cancel_failed','partial_cancel_failed') ");
|
||||
$audit_error_count = sql_fetch(" select count(*) as cnt from `{$tables['summary']}` where ip_audit_error = '1' ");
|
||||
|
||||
$rows = (int) $config['cf_page_rows'];
|
||||
if ($rows < 1)
|
||||
$rows = 20;
|
||||
$total_page = ceil($total_count / $rows);
|
||||
if ($page < 1)
|
||||
$page = 1;
|
||||
if ($total_page > 0 && $page > $total_page)
|
||||
$page = (int) $total_page;
|
||||
$from_record = ($page - 1) * $rows;
|
||||
|
||||
$sql = " select p.*,
|
||||
o.od_id as order_oid, o.od_tno as order_tid, o.od_status as order_status, o.od_receipt_price as order_receipt_price,
|
||||
o.od_misu as order_misu, o.od_cancel_price as order_cancel_price, o.od_refund_price as order_refund_price, o.od_settle_case as order_settle_case, $order_amount_sql as order_amount,
|
||||
pp.pp_id as personal_oid, pp.pp_tno as personal_tid, pp.pp_price as personal_amount, pp.pp_receipt_price as personal_receipt_price
|
||||
$sql_from
|
||||
$sql_where
|
||||
order by p.ip_id desc
|
||||
limit $from_record, $rows ";
|
||||
$result = sql_query($sql);
|
||||
|
||||
$query = array(
|
||||
'status' => $status,
|
||||
'risk' => $risk,
|
||||
'sfl' => $sfl,
|
||||
'stx' => $stx,
|
||||
'fr_date' => $fr_date,
|
||||
'to_date' => $to_date
|
||||
);
|
||||
$query_string = http_build_query($query, '', '&');
|
||||
// 상세보기 링크는 목록으로 돌아올 때 현재 페이지까지 유지하도록 page를 포함한다.
|
||||
$view_query_string = $query_string.'&page='.$page;
|
||||
?>
|
||||
|
||||
<div class="local_ov01 local_ov">
|
||||
<a href="./inicisloglist.php" class="ov_listall">전체목록</a>
|
||||
<span class="btn_ov01"><span class="ov_txt">전체</span><span class="ov_num"><?php echo number_format((int) $all_count['cnt']); ?>건</span></span>
|
||||
<a href="?risk=anomaly" class="btn_ov01"><span class="ov_txt">확인 필요</span><span class="ov_num"><?php echo number_format((int) $anomaly_count['cnt']); ?>건</span></a>
|
||||
<a href="?risk=failed" class="btn_ov01"><span class="ov_txt">실패</span><span class="ov_num"><?php echo number_format((int) $failed_count['cnt']); ?>건</span></a>
|
||||
</div>
|
||||
|
||||
<div class="local_desc01 local_desc">
|
||||
<p>이 화면은 INIpay PRO의 결제 요청, 인증, 승인, 주문 저장, 서버 통보 및 취소 이력을 표시합니다. KG 거래조회 결과가 있으면 실제 PG 상태와 주문 DB를 함께 비교합니다. 거래조회 실패 또는 조회 전 거래는 KG이니시스 상점관리자에서 TID와 금액을 다시 확인하십시오.</p>
|
||||
<p>최근 자동 감시: <?php echo !empty($default['de_inicis_pro_monitor_at']) ? get_text($default['de_inicis_pro_monitor_at']) : '실행 기록 없음'; ?><?php if (!empty($default['de_inicis_pro_monitor_message'])) { ?> / <?php echo get_text($default['de_inicis_pro_monitor_message']); ?><?php } ?></p>
|
||||
<p>감사 이력 기록 오류: <strong<?php echo !empty($audit_error_count['cnt']) ? ' style="color:#d00"' : ''; ?>><?php echo number_format((int) $audit_error_count['cnt']); ?>건</strong> / 통보 허용 IP: <?php echo get_text(implode(', ', inicis_pro_noti_allowed_ips())); ?></p>
|
||||
</div>
|
||||
|
||||
<form method="post" action="./inicislogcheck.php" style="margin-bottom:10px">
|
||||
<input type="hidden" name="token" value="">
|
||||
<input type="hidden" name="mode" value="batch">
|
||||
<button type="submit" class="btn btn_02" onclick="return confirm('확인 필요 거래 중 조회 가능한 최근 5건을 KG이니시스에서 조회하시겠습니까? 주문 생성이나 결제 취소는 실행하지 않습니다.');">확인 필요 거래 KG 대사</button>
|
||||
</form>
|
||||
|
||||
<form class="local_sch03 local_sch" method="get">
|
||||
<div>
|
||||
<strong>처리 구분</strong>
|
||||
<select name="risk">
|
||||
<option value=""<?php echo get_selected($risk, ''); ?>>전체</option>
|
||||
<option value="anomaly"<?php echo get_selected($risk, 'anomaly'); ?>>확인 필요</option>
|
||||
<option value="failed"<?php echo get_selected($risk, 'failed'); ?>>실패</option>
|
||||
<option value="processing"<?php echo get_selected($risk, 'processing'); ?>>처리 중</option>
|
||||
<option value="complete"<?php echo get_selected($risk, 'complete'); ?>>정상 완료</option>
|
||||
<option value="canceled"<?php echo get_selected($risk, 'canceled'); ?>>취소 완료</option>
|
||||
<option value="abandoned"<?php echo get_selected($risk, 'abandoned'); ?>>결제창 종료·미진행</option>
|
||||
</select>
|
||||
<strong>현재 상태</strong>
|
||||
<select name="status">
|
||||
<option value="">전체</option>
|
||||
<?php foreach ($allowed_status as $status_value) { if ($status_value === '') continue; ?>
|
||||
<option value="<?php echo $status_value; ?>"<?php echo get_selected($status, $status_value); ?>><?php echo get_text(inicis_admin_status_label($status_value)); ?></option>
|
||||
<?php } ?>
|
||||
</select>
|
||||
<strong>기간</strong>
|
||||
<input type="text" id="fr_date" name="fr_date" value="<?php echo get_text($fr_date); ?>" class="frm_input" size="10" maxlength="10" placeholder="YYYY-MM-DD">
|
||||
~
|
||||
<input type="text" id="to_date" name="to_date" value="<?php echo get_text($to_date); ?>" class="frm_input" size="10" maxlength="10" placeholder="YYYY-MM-DD">
|
||||
</div>
|
||||
<div>
|
||||
<select name="sfl">
|
||||
<option value="ip_oid"<?php echo get_selected($sfl, 'ip_oid'); ?>>주문번호 OID</option>
|
||||
<option value="ip_tid"<?php echo get_selected($sfl, 'ip_tid'); ?>>승인 TID</option>
|
||||
<option value="ip_auth_tid"<?php echo get_selected($sfl, 'ip_auth_tid'); ?>>인증 TID</option>
|
||||
<option value="mb_id"<?php echo get_selected($sfl, 'mb_id'); ?>>회원 ID</option>
|
||||
</select>
|
||||
<input type="text" name="stx" value="<?php echo get_text($stx); ?>" class="frm_input" size="30">
|
||||
<input type="submit" value="검색" class="btn_submit">
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="tbl_head01 tbl_wrap">
|
||||
<table>
|
||||
<caption>KG이니시스 INIpay PRO 결제 처리 현황 목록</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">최근 처리일시</th>
|
||||
<th scope="col">주문번호</th>
|
||||
<th scope="col">승인 TID</th>
|
||||
<th scope="col">회원</th>
|
||||
<th scope="col">구분</th>
|
||||
<th scope="col">결제수단</th>
|
||||
<th scope="col">금액</th>
|
||||
<th scope="col">현재 상태</th>
|
||||
<th scope="col">KG 거래상태</th>
|
||||
<th scope="col">주문 확인</th>
|
||||
<th scope="col">이력</th>
|
||||
<th scope="col">관리</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php for ($i = 0; $row = sql_fetch_array($result); $i++) {
|
||||
$has_order = inicis_admin_has_order($row);
|
||||
$is_anomaly = inicis_admin_is_anomaly($row);
|
||||
$order_type_label = $row['ip_order_type'] === 'personal' ? '개인결제' : '주문';
|
||||
$device_label = $row['ip_device'] === 'MOBILE' ? '모바일' : ($row['ip_device'] === 'WEB' ? 'PC' : $row['ip_device']);
|
||||
$bg = 'bg'.($i % 2);
|
||||
?>
|
||||
<tr class="<?php echo $bg; ?>">
|
||||
<td class="td_time"><?php echo get_text($row['ip_updated_at']); ?></td>
|
||||
<td class="td_odrnum2"><a href="./inicislogview.php?oid=<?php echo urlencode($row['ip_oid']); ?>&<?php echo $view_query_string; ?>"><?php echo get_text($row['ip_oid']); ?></a></td>
|
||||
<td class="td_left"><?php echo $row['ip_tid'] !== '' ? get_text($row['ip_tid']) : '-'; ?></td>
|
||||
<td class="td_name"><?php echo $row['mb_id'] !== '' ? get_text($row['mb_id']) : '비회원'; ?></td>
|
||||
<td class="td_center"><?php echo get_text($order_type_label.' / '.$device_label); ?><br><?php
|
||||
if ($row['ip_environment'] === 'test') echo '<strong style="color:#d00">테스트</strong>';
|
||||
elseif ($row['ip_environment'] === 'live') echo '<span style="font-size:11px">실결제</span>';
|
||||
else echo '<span style="font-size:11px;color:#d00">확인 필요</span>';
|
||||
?></td>
|
||||
<td class="td_center"><?php echo get_text(inicis_admin_pay_type_label($row['ip_pay_type'], $row['ip_easy_pay'])); ?></td>
|
||||
<td class="td_price"><?php echo number_format((int) $row['ip_amount']); ?></td>
|
||||
<td class="td_center"><?php echo get_text(inicis_admin_status_label(inicis_admin_primary_status($row))); ?></td>
|
||||
<td class="td_center">
|
||||
<?php if (!empty($row['ip_pg_checked_at'])) { ?>
|
||||
<?php echo $row['ip_pg_result_code'] === '00' ? get_text(inicis_admin_pg_status_label($row['ip_pg_status'])) : '<strong style="color:#d00">조회 실패</strong>'; ?><br>
|
||||
<span style="font-size:11px"><?php echo get_text($row['ip_pg_checked_at']); ?></span>
|
||||
<?php } else { ?>미조회<?php } ?>
|
||||
</td>
|
||||
<td class="td_center">
|
||||
<?php if ($is_anomaly) { ?><strong style="color:#d00">확인 필요</strong>
|
||||
<?php } elseif ($has_order) { ?><span style="color:#168b3f">정상 연결</span>
|
||||
<?php } elseif ($row['ip_status'] === 'canceled') { ?>취소됨
|
||||
<?php } else { ?>미생성<?php } ?>
|
||||
</td>
|
||||
<td class="td_num"><?php echo number_format((int) $row['ip_event_count']); ?></td>
|
||||
<td class="td_mng td_mng_s">
|
||||
<a href="./inicislogview.php?oid=<?php echo urlencode($row['ip_oid']); ?>&<?php echo $view_query_string; ?>" class="btn btn_03">상세</a>
|
||||
<?php if ($has_order && $row['ip_order_type'] === 'personal') { ?>
|
||||
<a href="./personalpayform.php?w=u&pp_id=<?php echo urlencode($row['ip_oid']); ?>" class="btn btn_02">개인</a>
|
||||
<?php } elseif ($has_order) { ?>
|
||||
<a href="./orderform.php?od_id=<?php echo urlencode($row['ip_oid']); ?>" class="btn btn_02">주문</a>
|
||||
<?php } ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php }
|
||||
if ($i === 0)
|
||||
echo '<tr><td colspan="12" class="empty_table">자료가 없습니다.</td></tr>';
|
||||
?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
$paging_url = './inicisloglist.php?'.$query_string.'&page=';
|
||||
echo get_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $page, $total_page, $paging_url);
|
||||
?>
|
||||
|
||||
<script>
|
||||
$(function(){
|
||||
$("#fr_date, #to_date").datepicker({ changeMonth: true, changeYear: true, dateFormat: "yy-mm-dd", showButtonPanel: true, yearRange: "c-99:c+99", maxDate: "+0d" });
|
||||
});
|
||||
</script>
|
||||
|
||||
<?php
|
||||
include_once(G5_ADMIN_PATH.'/admin.tail.php');
|
||||
@@ -0,0 +1,148 @@
|
||||
<?php
|
||||
$sub_menu = '400420';
|
||||
include_once('./_common.php');
|
||||
|
||||
auth_check_menu($auth, $sub_menu, 'r');
|
||||
|
||||
include_once(G5_SHOP_PATH.'/inicis/pro/inicis_pro.lib.php');
|
||||
include_once('./inicislog.lib.php');
|
||||
|
||||
$oid = isset($_GET['oid']) && !is_array($_GET['oid']) ? inicis_pro_clean_oid($_GET['oid']) : '';
|
||||
if ($oid === '' || !isset($_GET['oid']) || $oid !== $_GET['oid'])
|
||||
alert('결제 주문번호가 올바르지 않습니다.', './inicisloglist.php');
|
||||
|
||||
$tables = inicis_pro_audit_tables();
|
||||
if (!inicis_pro_audit_schema_ready())
|
||||
alert('결제 현황 테이블이 설치되지 않았습니다. DB 업그레이드를 실행해 주십시오.', G5_ADMIN_URL.'/dbupgrade.php');
|
||||
|
||||
// 목록으로 돌아갈 때 넘어온 검색 조건과 페이지를 그대로 유지한다.
|
||||
$list_query = array();
|
||||
foreach (array('status', 'risk', 'sfl', 'stx', 'fr_date', 'to_date', 'page') as $list_key) {
|
||||
if (isset($_GET[$list_key]) && !is_array($_GET[$list_key]) && $_GET[$list_key] !== '')
|
||||
$list_query[$list_key] = (string) $_GET[$list_key];
|
||||
}
|
||||
$list_url = './inicisloglist.php'.(count($list_query) ? '?'.http_build_query($list_query, '', '&') : '');
|
||||
|
||||
$oid_sql = sql_escape_string($oid);
|
||||
$order_amount_sql = "(o.od_cart_price + o.od_send_cost + o.od_send_cost2 - o.od_cart_coupon - o.od_coupon - o.od_send_coupon - o.od_receipt_point)";
|
||||
$sql = " select p.*,
|
||||
o.od_id as order_oid, o.od_tno as order_tid, o.od_status as order_status, o.od_time as order_time,
|
||||
o.od_receipt_price as order_receipt_price, o.od_misu as order_misu, o.od_cancel_price as order_cancel_price, o.od_refund_price as order_refund_price,
|
||||
o.od_settle_case as order_settle_case, $order_amount_sql as order_amount,
|
||||
pp.pp_id as personal_oid, pp.pp_tno as personal_tid, pp.pp_price as personal_amount, pp.pp_receipt_price as personal_receipt_price, pp.pp_time as personal_time
|
||||
from `{$tables['summary']}` p
|
||||
left join {$g5['g5_shop_order_table']} o on p.ip_order_type <> 'personal' and o.od_id = p.ip_oid
|
||||
left join {$g5['g5_shop_personalpay_table']} pp on p.ip_order_type = 'personal' and pp.pp_id = p.ip_oid
|
||||
where p.ip_oid = '$oid_sql' ";
|
||||
$row = sql_fetch($sql);
|
||||
if (empty($row['ip_id']))
|
||||
alert('결제 처리 이력을 찾을 수 없습니다.', './inicisloglist.php');
|
||||
|
||||
$events = sql_query(" select * from `{$tables['event']}` where ip_oid = '$oid_sql' order by pe_id asc ");
|
||||
$has_order = inicis_admin_has_order($row);
|
||||
$is_anomaly = inicis_admin_is_anomaly($row);
|
||||
$saved_tid = inicis_admin_order_tid($row);
|
||||
$saved_amount = inicis_admin_order_amount($row);
|
||||
$legacy_pro_log = empty($row['ip_tid']) ? inicis_pro_get_log($oid) : array();
|
||||
$legacy_pro_data = isset($legacy_pro_log['pro_data']) && is_array($legacy_pro_log['pro_data']) ? $legacy_pro_log['pro_data'] : array();
|
||||
// 승인 TID가 있거나 승인 로그에서 복구할 수 있을 때만 조회한다.
|
||||
// TID를 참조할 수 없는 미완료(인증 전) 거래는 KG에 조회할 대상이 없다.
|
||||
$can_inquiry = !empty($row['ip_tid'])
|
||||
|| (!empty($legacy_pro_data['__pro']) && $legacy_pro_data['__pro'] === '1'
|
||||
&& isset($legacy_pro_log['P_STATUS']) && $legacy_pro_log['P_STATUS'] === '00' && !empty($legacy_pro_data['P_APPL_TID']));
|
||||
$g5['title'] = 'KG이니시스 INIpay PRO 결제 처리 상세';
|
||||
include_once(G5_ADMIN_PATH.'/admin.head.php');
|
||||
?>
|
||||
|
||||
<div class="local_desc01 local_desc">
|
||||
<p>이 기록은 영카트 서버가 처리한 단계의 감사 이력입니다. 최종 결제·취소 여부는 KG이니시스 상점관리자의 TID 거래내역과 대조하여 확정하십시오.</p>
|
||||
<p>설정된 보존기간이 지난 단계별 상세 이력은 순차 삭제될 수 있으며, 아래 누적 이력 수에는 삭제 전 기록도 포함됩니다.</p>
|
||||
<?php if (!empty($row['ip_audit_error'])) { ?><p><strong style="color:#d00">이 거래에서 감사 상세 이력 기록 오류가 감지됐습니다. 서버 오류 로그와 KG이니시스 거래내역을 함께 확인하십시오.</strong></p><?php } ?>
|
||||
<?php if (!empty($row['ip_refund_required'])) { ?><p><strong style="color:#d00">취소 주문에 입금이 확인되어 환불이 필요합니다. 상품을 발송하지 말고 KG이니시스 상점관리자에서 입금 및 환불 상태를 확인하십시오.</strong></p><?php } ?>
|
||||
</div>
|
||||
|
||||
<div class="local_desc02 local_desc">
|
||||
<p><strong><?php echo $is_anomaly ? '권장 조치' : '확인 결과'; ?>:</strong> <?php echo get_text(inicis_admin_recommendation($row)); ?></p>
|
||||
</div>
|
||||
|
||||
<div class="tbl_frm01 tbl_wrap">
|
||||
<table>
|
||||
<caption>결제 처리 요약</caption>
|
||||
<tbody>
|
||||
<tr><th scope="row">주문번호 OID</th><td><?php echo get_text($row['ip_oid']); ?></td><th scope="row">처리 판정</th><td><?php echo $is_anomaly ? '<strong style="color:#d00">확인 필요</strong>' : ($has_order ? '<span style="color:#168b3f">주문 정상 연결</span>' : get_text(inicis_admin_status_label(inicis_admin_primary_status($row)))); ?></td></tr>
|
||||
<tr><th scope="row">인증 TID</th><td><?php echo $row['ip_auth_tid'] !== '' ? get_text($row['ip_auth_tid']) : '-'; ?></td><th scope="row">승인 TID</th><td><?php echo $row['ip_tid'] !== '' ? get_text($row['ip_tid']) : '-'; ?></td></tr>
|
||||
<tr><th scope="row">회원 ID</th><td><?php echo $row['mb_id'] !== '' ? get_text($row['mb_id']) : '비회원'; ?></td><th scope="row">MID</th><td><?php echo get_text($row['ip_mid']); ?></td></tr>
|
||||
<tr><th scope="row">결제금액</th><td><?php echo number_format((int) $row['ip_amount']); ?>원</td><th scope="row">결제수단</th><td><?php echo get_text(inicis_admin_pay_type_label($row['ip_pay_type'], $row['ip_easy_pay'])); ?></td></tr>
|
||||
<tr><th scope="row">결제환경</th><td><?php echo $row['ip_environment'] === 'test' ? '<strong style="color:#d00">테스트</strong>' : ($row['ip_environment'] === 'live' ? '실결제' : '<strong style="color:#d00">확인 필요</strong>'); ?></td><th scope="row">환불 확인 필요</th><td><?php echo !empty($row['ip_refund_required']) ? '<strong style="color:#d00">예</strong>' : '아니오'; ?></td></tr>
|
||||
<tr><th scope="row">접속 구분</th><td><?php echo get_text($row['ip_device']); ?></td><th scope="row">결제 구분</th><td><?php echo $row['ip_order_type'] === 'personal' ? '개인결제' : '일반주문'; ?></td></tr>
|
||||
<tr><th scope="row">현재 상태</th><td><?php echo get_text(inicis_admin_status_label(inicis_admin_primary_status($row))); ?></td><th scope="row">결과 코드</th><td><?php echo $row['ip_result_code'] !== '' ? get_text($row['ip_result_code']) : '-'; ?></td></tr>
|
||||
<tr><th scope="row">최근 서버 통보</th><td><?php echo $row['ip_noti_status'] !== '' ? get_text(inicis_admin_status_label($row['ip_noti_status'])).($row['ip_noti_code'] !== '' ? ' ('.get_text($row['ip_noti_code']).')' : '') : '-'; ?></td><th scope="row">통보 실패 누계</th><td><?php echo number_format((int) $row['ip_noti_failed_count']); ?>회</td></tr>
|
||||
<tr><th scope="row">최근 취소 처리</th><td><?php echo $row['ip_cancel_status'] !== '' ? get_text(inicis_admin_status_label($row['ip_cancel_status'])).($row['ip_cancel_code'] !== '' ? ' ('.get_text($row['ip_cancel_code']).')' : '') : '-'; ?></td><th scope="row">가상계좌 입금기한</th><td><?php echo !empty($row['ip_vbank_due_at']) ? get_text($row['ip_vbank_due_at']) : '-'; ?></td></tr>
|
||||
<tr><th scope="row">통보 메시지</th><td><?php echo $row['ip_noti_message'] !== '' ? get_text($row['ip_noti_message']) : '-'; ?></td><th scope="row">취소 메시지</th><td><?php echo $row['ip_cancel_message'] !== '' ? get_text($row['ip_cancel_message']) : '-'; ?></td></tr>
|
||||
<tr><th scope="row">감사 이력 상태</th><td><?php echo !empty($row['ip_audit_error']) ? '<strong style="color:#d00">상세 기록 오류</strong>' : '정상'; ?></td><th scope="row">최근 이상 알림</th><td><?php echo !empty($row['ip_alerted_at']) ? get_text($row['ip_alerted_at']) : '-'; ?></td></tr>
|
||||
<tr><th scope="row">마지막 메시지</th><td colspan="3"><?php echo $row['ip_result_message'] !== '' ? get_text($row['ip_result_message']) : '-'; ?></td></tr>
|
||||
<tr><th scope="row">승인 일시</th><td><?php echo !empty($row['ip_approved_at']) ? get_text($row['ip_approved_at']) : '-'; ?></td><th scope="row">주문 저장 일시</th><td><?php echo !empty($row['ip_ordered_at']) ? get_text($row['ip_ordered_at']) : '-'; ?></td></tr>
|
||||
<tr><th scope="row">통보 일시</th><td><?php echo !empty($row['ip_notified_at']) ? get_text($row['ip_notified_at']) : '-'; ?></td><th scope="row">취소 일시</th><td><?php echo !empty($row['ip_canceled_at']) ? get_text($row['ip_canceled_at']) : '-'; ?></td></tr>
|
||||
<tr><th scope="row">주문 DB의 TID</th><td><?php echo $has_order ? get_text($saved_tid) : '-'; ?></td><th scope="row">주문 DB의 금액</th><td><?php echo $has_order ? number_format($saved_amount).'원' : '-'; ?></td></tr>
|
||||
<?php if ($row['ip_order_type'] !== 'personal') { ?><tr><th scope="row">주문 상태/입금액</th><td><?php echo $has_order ? get_text($row['order_status']).' / '.number_format((int) $row['order_receipt_price']).'원' : '-'; ?></td><th scope="row">주문 미수금/취소액</th><td><?php echo $has_order ? number_format((int) $row['order_misu']).'원 / '.number_format((int) $row['order_cancel_price']).'원' : '-'; ?></td></tr><?php } ?>
|
||||
<tr><th scope="row">KG 거래조회 상태</th><td><?php echo !empty($row['ip_pg_checked_at']) ? ($row['ip_pg_result_code'] === '00' ? get_text(inicis_admin_pg_status_label($row['ip_pg_status'])) : '조회 실패 ('.get_text($row['ip_pg_result_code']).')') : '미조회'; ?></td><th scope="row">KG 거래조회 일시</th><td><?php echo !empty($row['ip_pg_checked_at']) ? get_text($row['ip_pg_checked_at']) : '-'; ?></td></tr>
|
||||
<tr><th scope="row">KG 조회 TID</th><td><?php echo !empty($row['ip_pg_tid']) ? get_text($row['ip_pg_tid']) : '-'; ?></td><th scope="row">KG 조회 금액</th><td><?php echo (int) $row['ip_pg_amount'] > 0 ? number_format((int) $row['ip_pg_amount']).'원' : '-'; ?></td></tr>
|
||||
<tr><th scope="row">KG 조회 메시지</th><td colspan="3"><?php echo !empty($row['ip_pg_message']) ? get_text($row['ip_pg_message']) : '-'; ?></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="btn_fixed_top">
|
||||
<a href="<?php echo $list_url; ?>" class="btn btn_02">목록</a>
|
||||
<?php if ($can_inquiry) { ?>
|
||||
<form method="post" action="./inicislogcheck.php" style="display:inline">
|
||||
<input type="hidden" name="token" value="">
|
||||
<input type="hidden" name="mode" value="single">
|
||||
<input type="hidden" name="oid" value="<?php echo get_text($row['ip_oid']); ?>">
|
||||
<button type="submit" class="btn btn_02" onclick="return confirm('이 거래를 KG이니시스에서 조회하시겠습니까? 주문 생성이나 결제 취소는 실행하지 않습니다.');">KG 거래조회</button>
|
||||
</form>
|
||||
<?php } ?>
|
||||
<?php if ($has_order && $row['ip_order_type'] === 'personal') { ?>
|
||||
<a href="./personalpayform.php?w=u&pp_id=<?php echo urlencode($row['ip_oid']); ?>" class="btn btn_03">개인결제 보기</a>
|
||||
<?php } elseif ($has_order) { ?>
|
||||
<a href="./orderform.php?od_id=<?php echo urlencode($row['ip_oid']); ?>" class="btn btn_03">주문 보기</a>
|
||||
<?php } ?>
|
||||
</div>
|
||||
|
||||
<div class="tbl_head01 tbl_wrap">
|
||||
<table>
|
||||
<caption>결제 단계별 처리 이력</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">순서</th>
|
||||
<th scope="col">처리일시</th>
|
||||
<th scope="col">경로</th>
|
||||
<th scope="col">단계</th>
|
||||
<th scope="col">결과</th>
|
||||
<th scope="col">코드</th>
|
||||
<th scope="col">메시지</th>
|
||||
<th scope="col">IP</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php for ($i = 1; $event = sql_fetch_array($events); $i++) { ?>
|
||||
<tr class="bg<?php echo ($i - 1) % 2; ?>">
|
||||
<td class="td_num"><?php echo $i; ?></td>
|
||||
<td class="td_time"><?php echo get_text($event['pe_created_at']); ?></td>
|
||||
<td class="td_center"><?php echo get_text(inicis_admin_source_label($event['pe_source'])); ?></td>
|
||||
<td class="td_center"><?php echo get_text(inicis_admin_stage_label($event['pe_stage'])); ?></td>
|
||||
<td class="td_center"><?php echo get_text(inicis_admin_status_label($event['pe_status'])); ?></td>
|
||||
<td class="td_center"><?php echo $event['pe_code'] !== '' ? get_text($event['pe_code']) : '-'; ?></td>
|
||||
<td class="td_left"><?php echo $event['pe_message'] !== '' ? get_text($event['pe_message']) : '-'; ?></td>
|
||||
<td class="td_center"><?php echo get_text($event['pe_ip']); ?></td>
|
||||
</tr>
|
||||
<?php }
|
||||
if ($i === 1)
|
||||
echo '<tr><td colspan="8" class="empty_table">단계별 이력이 없습니다.</td></tr>';
|
||||
?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
include_once(G5_ADMIN_PATH.'/admin.tail.php');
|
||||
@@ -367,7 +367,7 @@ $pg_anchor = '<ul class="anchor">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><?php echo $od['od_id']; ?></td>
|
||||
<td class="td_paybybig"><?php echo $s_receipt_way; ?></td>
|
||||
<td class="td_paybybig"><?php echo get_text($s_receipt_way); ?></td>
|
||||
<td class="td_numbig td_numsum"><?php echo display_price($amount['order']); ?></td>
|
||||
<td class="td_numbig"><?php echo display_price($od_send_cost + $od_send_cost2); ?></td>
|
||||
<td class="td_numbig"><?php echo display_point($od_temp_point); ?></td>
|
||||
@@ -487,7 +487,7 @@ $pg_anchor = '<ul class="anchor">
|
||||
<tr>
|
||||
<th scope="row"><span class="sound_only">주문하시는 분 </span>주소</th>
|
||||
<td>
|
||||
<span><?php echo $data['od_zip']; ?></span>
|
||||
<span><?php echo get_text($data['od_zip']); ?></span>
|
||||
<span><?php echo get_text($data['od_addr1']); ?></span>
|
||||
<span><?php echo get_text($data['od_addr2']); ?></span>
|
||||
<span><?php echo get_text($data['od_addr3']); ?></span>
|
||||
@@ -528,7 +528,7 @@ $pg_anchor = '<ul class="anchor">
|
||||
<tr>
|
||||
<th scope="row"><span class="sound_only">받으시는 분 </span>주소</th>
|
||||
<td>
|
||||
<span><?php echo $data['od_b_zip']; ?></span>
|
||||
<span><?php echo get_text($data['od_b_zip']); ?></span>
|
||||
<span><?php echo get_text($data['od_b_addr1']); ?></span>
|
||||
<span><?php echo get_text($data['od_b_addr2']); ?></span>
|
||||
<span><?php echo get_text($data['od_b_addr3']); ?></span>
|
||||
@@ -538,7 +538,7 @@ $pg_anchor = '<ul class="anchor">
|
||||
<?php if ($default['de_hope_date_use']) { ?>
|
||||
<tr>
|
||||
<th scope="row">희망배송일</th>
|
||||
<td><?php echo $data['od_hope_date']; ?> (<?php echo get_yoil($data['od_hope_date']); ?>)</td>
|
||||
<td><?php echo get_text($data['od_hope_date']); ?> (<?php echo get_yoil($data['od_hope_date']); ?>)</td>
|
||||
</tr>
|
||||
<?php } ?>
|
||||
<tr>
|
||||
|
||||
@@ -246,6 +246,9 @@ $od_bank_account = isset($data['od_bank_account']) ? addslashes(clean_xss_tags(
|
||||
$od_tno = '';
|
||||
$od_app_no = '';
|
||||
$od_hope_date = isset($data['od_hope_date']) ? addslashes(clean_xss_tags(stripslashes($data['od_hope_date']), 1, 1)) : '';
|
||||
$od_ip = (isset($data['od_ip']) && !is_array($data['od_ip']) && preg_match('/^[0-9a-fA-F:.]{1,45}$/', $data['od_ip'])) ? $data['od_ip'] : '';
|
||||
$od_settle_case = (isset($data['od_settle_case']) && !is_array($data['od_settle_case'])) ? addslashes(clean_xss_tags(stripslashes($data['od_settle_case']), 1, 1)) : '';
|
||||
$od_test = (isset($data['od_test']) && !is_array($data['od_test'])) ? (int) $data['od_test'] : 0;
|
||||
|
||||
// 주문서에 입력
|
||||
$sql = " insert {$g5['g5_shop_order_table']}
|
||||
@@ -297,9 +300,9 @@ $sql = " insert {$g5['g5_shop_order_table']}
|
||||
od_shop_memo = '',
|
||||
od_hope_date = '{$od_hope_date}',
|
||||
od_time = '{$od['dt_time']}',
|
||||
od_ip = '{$data['od_ip']}',
|
||||
od_settle_case = '{$data['od_settle_case']}',
|
||||
od_test = '{$data['od_test']}'
|
||||
od_ip = '$od_ip',
|
||||
od_settle_case = '$od_settle_case',
|
||||
od_test = '$od_test'
|
||||
";
|
||||
$result = sql_query($sql, true);
|
||||
|
||||
|
||||
@@ -6,6 +6,11 @@ auth_check_menu($auth, $sub_menu, "r");
|
||||
|
||||
$sql_common = " from {$g5['g5_shop_order_data_table']} ";
|
||||
|
||||
$allowed_sfl = array('od_id');
|
||||
if (!in_array($sfl, $allowed_sfl)) {
|
||||
$sfl = 'od_id';
|
||||
}
|
||||
|
||||
$sql_search = " where cart_id <> '0' ";
|
||||
if ($stx) {
|
||||
$sql_search .= " and ( ";
|
||||
@@ -136,7 +141,7 @@ $colspan = 10;
|
||||
<td class="td_center"><?php echo get_text($data['od_tel']); ?></td>
|
||||
<td class="td_name"><?php echo get_text($data['od_b_name']); ?></td>
|
||||
<td class="td_price"><?php echo number_format($ct['price']); ?></td>
|
||||
<td class="td_center"><?php echo $data['od_settle_case']; ?></td>
|
||||
<td class="td_center"><?php echo get_text($data['od_settle_case']); ?></td>
|
||||
<td class="td_time"><?php echo $row['dt_time']; ?></td>
|
||||
<td class="td_mng td_mng_m">
|
||||
<a href="./inorderform.php?od_id=<?php echo $row['od_id']; ?>&<?php echo $qstr; ?>" class="btn btn_03"><span class="sound_only"><?php echo $row['od_id']; ?> </span>보기</a>
|
||||
|
||||
@@ -6,6 +6,8 @@ check_demo();
|
||||
|
||||
auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
if (function_exists('check_request_origin')) check_request_origin(G5_ADMIN_URL);
|
||||
|
||||
$post_it_id_count = (isset($_POST['it_id']) && is_array($_POST['it_id'])) ? count($_POST['it_id']) : 0;
|
||||
|
||||
for ($i=0; $i<$post_it_id_count; $i++)
|
||||
|
||||
@@ -8,6 +8,8 @@ ini_set('memory_limit', '50M');
|
||||
|
||||
auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
if (function_exists('check_request_origin')) check_request_origin(G5_ADMIN_URL);
|
||||
|
||||
function only_number($n)
|
||||
{
|
||||
return preg_replace('/[^0-9]/', '', (string)$n);
|
||||
|
||||
+400
-11
@@ -113,8 +113,120 @@ if ($od['od_pg'] === 'nicepay' && $od['od_settle_case'] === '가상계좌' && $o
|
||||
$print_od_deposit_name .= '_NICE';
|
||||
}
|
||||
|
||||
if (!function_exists('shop_admin_get_nicepay_status')) {
|
||||
function shop_admin_get_nicepay_status($tid, $default)
|
||||
{
|
||||
$result = array(
|
||||
'data' => array(),
|
||||
'error' => ''
|
||||
);
|
||||
|
||||
if (!function_exists('curl_init')) {
|
||||
$result['error'] = 'cURL 모듈이 설치되어 있지 않아 나이스페이 거래 상태를 조회할 수 없습니다.';
|
||||
return $result;
|
||||
}
|
||||
|
||||
$tid = preg_replace('/[^0-9a-zA-Z]/', '', (string) $tid);
|
||||
if ($tid === '') {
|
||||
$result['error'] = '거래 ID가 없어 나이스페이 거래 상태를 조회할 수 없습니다.';
|
||||
return $result;
|
||||
}
|
||||
|
||||
if (!empty($default['de_card_test'])) {
|
||||
$mid = 'nicepay00m';
|
||||
$merchantKey = 'EYzu8jGGMfqaDEp76gSckuvnaHHu+bC4opsSN6lHv3b2lurNYkVXrZ7Z1AoqQnXI3eLuaUFyoRNC6FkrzVjceg==';
|
||||
} else {
|
||||
$mid = 'SR'.$default['de_nicepay_mid'];
|
||||
$merchantKey = $default['de_nicepay_key'];
|
||||
}
|
||||
|
||||
if ($mid === 'SR' || $merchantKey === '') {
|
||||
$result['error'] = '나이스페이 MID 또는 KEY가 설정되어 있지 않아 거래 상태를 조회할 수 없습니다.';
|
||||
return $result;
|
||||
}
|
||||
|
||||
$ediDate = preg_replace('/[^0-9]/', '', G5_TIME_YMDHIS);
|
||||
$signData = bin2hex(hash('sha256', $tid.$mid.$ediDate.$merchantKey, true));
|
||||
$postUrl = 'https://webapi.nicepay.co.kr/webapi/inquery/trans_status.jsp';
|
||||
$data = array(
|
||||
'TID' => $tid,
|
||||
'MID' => $mid,
|
||||
'EdiDate' => $ediDate,
|
||||
'SignData' => $signData,
|
||||
'CharSet' => 'utf-8',
|
||||
'EdiType' => 'JSON'
|
||||
);
|
||||
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $postUrl);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 25);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
$response = curl_exec($ch);
|
||||
$curl_error = curl_error($ch);
|
||||
curl_close($ch);
|
||||
|
||||
if ($response === false || $response === '') {
|
||||
$result['error'] = '나이스페이 거래 상태 조회 응답이 없습니다.'.($curl_error ? ' '.$curl_error : '');
|
||||
return $result;
|
||||
}
|
||||
|
||||
$responseData = json_decode($response, true);
|
||||
if (!is_array($responseData)) {
|
||||
$utf8_response = @iconv('EUC-KR', 'UTF-8//IGNORE', $response);
|
||||
if ($utf8_response) {
|
||||
$responseData = json_decode($utf8_response, true);
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_array($responseData)) {
|
||||
$result['error'] = '나이스페이 거래 상태 조회 응답을 해석할 수 없습니다.';
|
||||
return $result;
|
||||
}
|
||||
|
||||
$result['data'] = $responseData;
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('shop_admin_format_nicepay_auth_date')) {
|
||||
function shop_admin_format_nicepay_auth_date($auth_date)
|
||||
{
|
||||
$auth_date = preg_replace('/[^0-9]/', '', (string) $auth_date);
|
||||
|
||||
if (strlen($auth_date) === 12) {
|
||||
return '20'.substr($auth_date, 0, 2).'-'.substr($auth_date, 2, 2).'-'.substr($auth_date, 4, 2).' '.substr($auth_date, 6, 2).':'.substr($auth_date, 8, 2).':'.substr($auth_date, 10, 2);
|
||||
}
|
||||
|
||||
if (strlen($auth_date) === 14) {
|
||||
return substr($auth_date, 0, 4).'-'.substr($auth_date, 4, 2).'-'.substr($auth_date, 6, 2).' '.substr($auth_date, 8, 2).':'.substr($auth_date, 10, 2).':'.substr($auth_date, 12, 2);
|
||||
}
|
||||
|
||||
return $auth_date;
|
||||
}
|
||||
}
|
||||
|
||||
$nicepay_status_result = array();
|
||||
$nicepay_status_error = '';
|
||||
if ($od['od_pg'] === 'nicepay') {
|
||||
$nicepay_status = shop_admin_get_nicepay_status($od['od_tno'], $default);
|
||||
$nicepay_status_result = $nicepay_status['data'];
|
||||
$nicepay_status_error = $nicepay_status['error'];
|
||||
}
|
||||
|
||||
// add_javascript('js 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
|
||||
|
||||
$is_nicepay_vbank_pg_cancel = ($od['od_pg'] === 'nicepay' && $od['od_settle_case'] === '가상계좌' && is_cancel_shop_pg_order($od));
|
||||
if ($is_nicepay_vbank_pg_cancel) {
|
||||
add_stylesheet('<link rel="stylesheet" href="'.G5_JS_URL.'/remodal/remodal.css">', 11);
|
||||
add_stylesheet('<link rel="stylesheet" href="'.G5_JS_URL.'/remodal/remodal-default-theme.css">', 12);
|
||||
add_javascript('<script src="'.G5_JS_URL.'/remodal/remodal.js"></script>', 10);
|
||||
}
|
||||
?>
|
||||
|
||||
<section id="anc_sodr_list">
|
||||
@@ -144,6 +256,13 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
|
||||
<input type="hidden" name="search" value="<?php echo $search; ?>">
|
||||
<input type="hidden" name="page" value="<?php echo $page;?>">
|
||||
<input type="hidden" name="pg_cancel" value="0">
|
||||
<input type="hidden" name="submit_ct_status" value="">
|
||||
<?php if ($is_nicepay_vbank_pg_cancel) { ?>
|
||||
<input type="hidden" name="RefundAcctNo" value="">
|
||||
<input type="hidden" name="RefundBankCd" value="">
|
||||
<input type="hidden" name="RefundAcctNm" value="">
|
||||
<input type="hidden" name="nicepay_vbank_refund_confirmed" value="0">
|
||||
<?php } ?>
|
||||
|
||||
<div class="tbl_head01 tbl_wrap">
|
||||
<table>
|
||||
@@ -311,6 +430,52 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
|
||||
} //end if
|
||||
?>
|
||||
|
||||
<?php if ($od['od_pg'] === 'nicepay') { ?>
|
||||
<section id="anc_sodr_nicepay_status">
|
||||
<h2 class="h2_frm">나이스페이 결제 조회</h2>
|
||||
<?php if ($nicepay_status_error) { ?>
|
||||
<div class="local_desc01 local_desc">
|
||||
<p><?php echo get_text($nicepay_status_error); ?></p>
|
||||
</div>
|
||||
<?php } else {
|
||||
$nicepay_status_map = array(
|
||||
'0' => '승인 상태',
|
||||
'1' => '취소 상태',
|
||||
'9' => '승인 거래 없음'
|
||||
);
|
||||
$nicepay_status_code = isset($nicepay_status_result['Status']) ? (string) $nicepay_status_result['Status'] : '';
|
||||
$nicepay_status_text = isset($nicepay_status_map[$nicepay_status_code]) ? $nicepay_status_map[$nicepay_status_code] : '';
|
||||
$nicepay_auth_date = isset($nicepay_status_result['AuthDate']) ? shop_admin_format_nicepay_auth_date($nicepay_status_result['AuthDate']) : '';
|
||||
?>
|
||||
<div class="tbl_head01 tbl_wrap">
|
||||
<table>
|
||||
<caption>나이스페이 결제 조회</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">결과코드</th>
|
||||
<th scope="col">결과 메시지</th>
|
||||
<th scope="col">거래 ID</th>
|
||||
<th scope="col">거래 상태</th>
|
||||
<th scope="col">승인번호</th>
|
||||
<th scope="col">승인일시</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><?php echo isset($nicepay_status_result['ResultCode']) ? get_text($nicepay_status_result['ResultCode']) : '-'; ?></td>
|
||||
<td><?php echo isset($nicepay_status_result['ResultMsg']) ? get_text($nicepay_status_result['ResultMsg']) : '-'; ?></td>
|
||||
<td><?php echo isset($nicepay_status_result['TID']) ? get_text($nicepay_status_result['TID']) : get_text($od['od_tno']); ?></td>
|
||||
<td><?php echo $nicepay_status_code !== '' ? get_text($nicepay_status_code.($nicepay_status_text ? ' ('.$nicepay_status_text.')' : '')) : '-'; ?></td>
|
||||
<td><?php echo isset($nicepay_status_result['AuthCode']) && $nicepay_status_result['AuthCode'] !== '' ? get_text($nicepay_status_result['AuthCode']) : '-'; ?></td>
|
||||
<td><?php echo $nicepay_auth_date !== '' ? get_text($nicepay_auth_date) : '-'; ?></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php } ?>
|
||||
</section>
|
||||
<?php } ?>
|
||||
|
||||
<section id="anc_sodr_pay">
|
||||
<h2 class="h2_frm">주문결제 내역</h2>
|
||||
<?php echo $pg_anchor; ?>
|
||||
@@ -332,7 +497,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
|
||||
//$amount['미수'] = $amount['order'] - $amount['receipt'] - $amount['coupon'];
|
||||
|
||||
// 결제방법
|
||||
$s_receipt_way = check_pay_name_replace($od['od_settle_case'], $od);
|
||||
$s_receipt_way = get_text(check_pay_name_replace($od['od_settle_case'], $od));
|
||||
|
||||
if ($od['od_receipt_point'] > 0)
|
||||
$s_receipt_way .= "+포인트";
|
||||
@@ -409,7 +574,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
|
||||
</tr>
|
||||
<?php } ?>
|
||||
<tr>
|
||||
<th scope="row"><?php echo $od['od_settle_case']; ?> 입금액</th>
|
||||
<th scope="row"><?php echo get_text($od['od_settle_case']); ?> 입금액</th>
|
||||
<td><?php echo display_price($od['od_receipt_price']); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -432,7 +597,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
|
||||
<td><?php echo get_text($od['od_bank_account']); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row"><?php echo $od['od_settle_case']; ?> 결제액</th>
|
||||
<th scope="row"><?php echo get_text($od['od_settle_case']); ?> 결제액</th>
|
||||
<td><?php echo display_price($od['od_receipt_price']); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -705,7 +870,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
|
||||
<?php } ?>
|
||||
|
||||
<tr>
|
||||
<th scope="row"><label for="od_receipt_price"><?php echo $od['od_settle_case']; ?> 입금액</label></th>
|
||||
<th scope="row"><label for="od_receipt_price"><?php echo get_text($od['od_settle_case']); ?> 입금액</label></th>
|
||||
<td>
|
||||
<?php echo $html_receipt_chk; ?>
|
||||
<input type="text" name="od_receipt_price" value="<?php echo $od['od_receipt_price']; ?>" id="od_receipt_price" class="frm_input"> 원
|
||||
@@ -739,7 +904,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
|
||||
<td><?php echo get_text($od['od_bank_account']); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row"><label for="od_receipt_price"><?php echo $od['od_settle_case']; ?> 결제액</label></th>
|
||||
<th scope="row"><label for="od_receipt_price"><?php echo get_text($od['od_settle_case']); ?> 결제액</label></th>
|
||||
<td>
|
||||
<?php echo $html_receipt_chk; ?>
|
||||
<input type="text" name="od_receipt_price" value="<?php echo $od['od_receipt_price']; ?>" id="od_receipt_price" class="frm_input"> 원
|
||||
@@ -870,8 +1035,8 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
|
||||
<?php if($od['od_status'] == '주문' && $od['od_misu'] > 0) { ?>
|
||||
<a href="./personalpayform.php?popup=yes&od_id=<?php echo $od_id; ?>" id="personalpay_add" class="btn btn_02">개인결제추가</a>
|
||||
<?php } ?>
|
||||
<?php if($od['od_misu'] < 0 && ($od['od_receipt_price'] - $od['od_refund_price']) > 0 && ($od['od_settle_case'] == '신용카드' || $od['od_settle_case'] == '계좌이체' || $od['od_settle_case'] == 'KAKAOPAY')) { ?>
|
||||
<a href="./orderpartcancel.php?od_id=<?php echo $od_id; ?>" id="orderpartcancel" class="btn btn_02"><?php echo $od['od_settle_case']; ?> 부분취소</a>
|
||||
<?php if($od['od_misu'] < 0 && ($od['od_receipt_price'] - $od['od_refund_price']) > 0 && ($od['od_settle_case'] == '신용카드' || $od['od_settle_case'] == '계좌이체' || $od['od_settle_case'] == 'KAKAOPAY' || ($od['od_pg'] == 'nicepay' && $od['od_settle_case'] == '간편결제'))) { ?>
|
||||
<a href="./orderpartcancel.php?od_id=<?php echo $od_id; ?>" id="orderpartcancel" class="btn btn_02"><?php echo get_text($od['od_settle_case']); ?> 부분취소</a>
|
||||
<?php } ?>
|
||||
<a href="./orderlist.php?<?php echo $qstr; ?>" class="btn btn_02">목록</a>
|
||||
</div>
|
||||
@@ -1044,7 +1209,157 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<?php if ($is_nicepay_vbank_pg_cancel) {
|
||||
$nicepay_refund_bank_codes = array(
|
||||
'은행/기관' => array(
|
||||
'001' => '한국은행',
|
||||
'002' => '산업은행',
|
||||
'003' => '기업은행',
|
||||
'004' => '국민은행',
|
||||
'005' => '외환은행',
|
||||
'007' => '수협은행',
|
||||
'008' => '수출입은행',
|
||||
'011' => 'NH농협은행',
|
||||
'012' => '농협중앙회(지역농축협)',
|
||||
'020' => '우리은행',
|
||||
'023' => 'SC제일은행',
|
||||
'026' => '서울은행',
|
||||
'027' => '한국씨티은행',
|
||||
'030' => '수협중앙회',
|
||||
'031' => 'iM뱅크(대구)',
|
||||
'032' => '부산은행',
|
||||
'034' => '광주은행',
|
||||
'035' => '제주은행',
|
||||
'037' => '전북은행',
|
||||
'039' => '경남은행',
|
||||
'045' => '새마을금고',
|
||||
'048' => '신협',
|
||||
'050' => '저축은행',
|
||||
'051' => '기타 외국계은행',
|
||||
'052' => '모건스탠리은행',
|
||||
'054' => 'HSBC은행',
|
||||
'055' => '도이치은행',
|
||||
'056' => '알비에스피엘씨은행',
|
||||
'057' => '제이피모간체이스은행',
|
||||
'058' => '미즈호은행',
|
||||
'059' => '엠유에프지은행',
|
||||
'060' => 'BOA은행',
|
||||
'061' => '비엔피파리바은행',
|
||||
'062' => '중국공상은행',
|
||||
'063' => '중국은행',
|
||||
'064' => '산림조합중앙회',
|
||||
'065' => '대화은행',
|
||||
'071' => '우체국',
|
||||
'076' => '신용보증기금',
|
||||
'077' => '기술보증기금',
|
||||
'081' => '하나은행',
|
||||
'088' => '신한은행',
|
||||
'089' => '케이뱅크',
|
||||
'090' => '카카오뱅크',
|
||||
'092' => '토스뱅크',
|
||||
'093' => '한국주택금융공사',
|
||||
'094' => '서울보증보험',
|
||||
'095' => '경찰청',
|
||||
'099' => '금융결제원'
|
||||
),
|
||||
'증권사' => array(
|
||||
'209' => '유안타증권',
|
||||
'218' => 'KB증권',
|
||||
'238' => '미래에셋증권',
|
||||
'240' => '삼성증권',
|
||||
'243' => '한국투자증권',
|
||||
'247' => 'NH투자증권',
|
||||
'261' => '교보증권',
|
||||
'262' => 'iM증권',
|
||||
'263' => '현대차증권',
|
||||
'264' => '키움증권',
|
||||
'265' => 'LS증권',
|
||||
'266' => '에스케이증권',
|
||||
'267' => '대신증권',
|
||||
'269' => '한화투자증권',
|
||||
'270' => '하나증권',
|
||||
'271' => '토스증권',
|
||||
'278' => '신한투자증권',
|
||||
'279' => 'DB증권',
|
||||
'280' => '유진투자증권',
|
||||
'287' => '메리츠증권',
|
||||
'288' => '카카오페이증권',
|
||||
'289' => '엔에이치투자증권',
|
||||
'290' => '부국증권',
|
||||
'291' => '신영증권',
|
||||
'292' => '케이프투자증권'
|
||||
)
|
||||
);
|
||||
?>
|
||||
<div class="remodal" data-remodal-id="nicepay-vbank-refund" data-remodal-options="hashTracking:false, closeOnOutsideClick:false">
|
||||
<button data-remodal-action="close" class="remodal-close"></button>
|
||||
<h3>나이스페이 가상계좌 환불 정보</h3>
|
||||
<p>입금 후 환불 건은 환불계좌 정보를 입력해야 합니다. 입금 전 발급취소 건은 비워두고 진행할 수 있습니다.</p>
|
||||
<div class="tbl_frm01 tbl_wrap">
|
||||
<table>
|
||||
<caption>나이스페이 가상계좌 환불 정보 입력</caption>
|
||||
<colgroup>
|
||||
<col class="grid_4">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th scope="row"><label for="nicepay_refund_acct_no">환불계좌번호</label></th>
|
||||
<td><input type="text" id="nicepay_refund_acct_no" class="frm_input" size="22" maxlength="16" inputmode="numeric" autocomplete="off"> 숫자만 입력</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row"><label for="nicepay_refund_bank_cd">환불은행</label></th>
|
||||
<td>
|
||||
<select id="nicepay_refund_bank_cd" class="frm_input">
|
||||
<option value="">은행을 선택해 주세요</option>
|
||||
<?php foreach ($nicepay_refund_bank_codes as $bank_group => $bank_codes) { ?>
|
||||
<optgroup label="<?php echo $bank_group; ?>">
|
||||
<?php foreach ($bank_codes as $bank_code => $bank_name) { ?>
|
||||
<option value="<?php echo $bank_code; ?>"><?php echo $bank_name; ?> (<?php echo $bank_code; ?>)</option>
|
||||
<?php } ?>
|
||||
</optgroup>
|
||||
<?php } ?>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row"><label for="nicepay_refund_acct_nm">환불계좌주명</label></th>
|
||||
<td><input type="text" id="nicepay_refund_acct_nm" class="frm_input" size="18" maxlength="10" autocomplete="off"> 10 byte 이하</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<br>
|
||||
<button type="button" class="remodal-cancel" data-remodal-action="cancel">취소</button>
|
||||
<button type="button" class="remodal-confirm" id="nicepay_vbank_refund_submit">확인</button>
|
||||
</div>
|
||||
<?php } ?>
|
||||
|
||||
<script>
|
||||
<?php if ($is_nicepay_vbank_pg_cancel) { ?>
|
||||
var nicepayVbankCancel = true;
|
||||
var nicepayVbankRefundRequired = <?php echo ((int) $od['od_receipt_price'] > 0) ? 'true' : 'false'; ?>;
|
||||
<?php } else { ?>
|
||||
var nicepayVbankCancel = false;
|
||||
var nicepayVbankRefundRequired = false;
|
||||
<?php } ?>
|
||||
|
||||
function nicepay_submit_orderform(f)
|
||||
{
|
||||
var status = document.pressed || (f.submit_ct_status ? f.submit_ct_status.value : "");
|
||||
var statusInput = f.querySelector("input[type=hidden][name=ct_status]");
|
||||
|
||||
if (!statusInput) {
|
||||
statusInput = document.createElement("input");
|
||||
statusInput.type = "hidden";
|
||||
statusInput.name = "ct_status";
|
||||
f.appendChild(statusInput);
|
||||
}
|
||||
|
||||
statusInput.value = status;
|
||||
f.submit();
|
||||
}
|
||||
|
||||
$(function() {
|
||||
// 전체 옵션선택
|
||||
$("#sit_select_all").click(function() {
|
||||
@@ -1080,12 +1395,70 @@ $(function() {
|
||||
window.open(href, "partcancelwin", "left=100, top=100, width=600, height=350, scrollbars=yes");
|
||||
return false;
|
||||
});
|
||||
|
||||
$("#nicepay_refund_acct_no").on("input", function() {
|
||||
this.value = this.value.replace(/[^0-9]/g, "");
|
||||
});
|
||||
|
||||
$("#nicepay_vbank_refund_submit").on("click", function() {
|
||||
var f = document.frmorderform;
|
||||
var acctNo = $.trim($("#nicepay_refund_acct_no").val()).replace(/[^0-9]/g, "");
|
||||
var bankCd = $.trim($("#nicepay_refund_bank_cd").val()).replace(/[^0-9]/g, "");
|
||||
var acctNm = $.trim($("#nicepay_refund_acct_nm").val());
|
||||
var hasRefundInfo = (acctNo !== "" || bankCd !== "" || acctNm !== "");
|
||||
|
||||
if (!nicepayVbankRefundRequired && !hasRefundInfo) {
|
||||
f.RefundAcctNo.value = "";
|
||||
f.RefundBankCd.value = "";
|
||||
f.RefundAcctNm.value = "";
|
||||
f.nicepay_vbank_refund_confirmed.value = 1;
|
||||
|
||||
if (form_submit(f)) {
|
||||
nicepay_submit_orderform(f);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (acctNo === "" || acctNo.length > 16) {
|
||||
alert("환불계좌번호를 숫자 16자리 이하로 입력해 주십시오.");
|
||||
$("#nicepay_refund_acct_no").focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!/^[0-9]{3}$/.test(bankCd)) {
|
||||
alert("환불은행을 선택해 주십시오.");
|
||||
$("#nicepay_refund_bank_cd").focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (acctNm === "") {
|
||||
alert("환불계좌주명을 입력해 주십시오.");
|
||||
$("#nicepay_refund_acct_nm").focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
f.RefundAcctNo.value = acctNo;
|
||||
f.RefundBankCd.value = bankCd;
|
||||
f.RefundAcctNm.value = acctNm;
|
||||
f.nicepay_vbank_refund_confirmed.value = 1;
|
||||
|
||||
if (form_submit(f)) {
|
||||
nicepay_submit_orderform(f);
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
});
|
||||
|
||||
function form_submit(f)
|
||||
{
|
||||
var check = false;
|
||||
var status = document.pressed;
|
||||
var status = document.pressed || (f.submit_ct_status ? f.submit_ct_status.value : "");
|
||||
|
||||
if (f.submit_ct_status) {
|
||||
f.submit_ct_status.value = status;
|
||||
}
|
||||
|
||||
for (i=0; i<f.chk_cnt.value; i++) {
|
||||
if (document.getElementById('ct_chk_'+i).checked == true)
|
||||
@@ -1107,13 +1480,26 @@ function form_submit(f)
|
||||
<?php if($od['od_pg'] == 'KAKAOPAY') { ?>
|
||||
var cancel_pg = "카카오페이";
|
||||
<?php } else { ?>
|
||||
var cancel_pg = "PG사의 <?php echo $od['od_settle_case']; ?>";
|
||||
var cancel_pg = "PG사의 <?php echo get_text($od['od_settle_case']); ?>";
|
||||
<?php } ?>
|
||||
|
||||
if(chk_cnt == chked_cnt) {
|
||||
if(confirm(cancel_pg+" 결제를 함께 취소하시겠습니까?\n\n한번 취소한 결제는 다시 복구할 수 없습니다.")) {
|
||||
// 체크하지 않은 나머지 품목이 모두 취소류 상태이면 이번 처리로 주문 전체가 취소된다.
|
||||
var remain_active_cnt = $ct_chk.not(":checked").filter(function() {
|
||||
var row_status = $.trim($(this).closest("tr").find("td.td_mngsmall").first().text());
|
||||
return row_status != "취소" && row_status != "반품" && row_status != "품절";
|
||||
}).length;
|
||||
|
||||
if(chked_cnt > 0 && remain_active_cnt == 0) {
|
||||
if(nicepayVbankCancel && f.nicepay_vbank_refund_confirmed.value == "1") {
|
||||
f.pg_cancel.value = 1;
|
||||
msg = cancel_pg+" 결제 취소와 함께 ";
|
||||
} else if(confirm(cancel_pg+" 결제를 함께 취소하시겠습니까?\n\n한번 취소한 결제는 다시 복구할 수 없습니다.")) {
|
||||
f.pg_cancel.value = 1;
|
||||
msg = cancel_pg+" 결제 취소와 함께 ";
|
||||
if (nicepayVbankCancel && f.nicepay_vbank_refund_confirmed.value != "1") {
|
||||
$('[data-remodal-id=nicepay-vbank-refund]').remodal().open();
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
f.pg_cancel.value = 0;
|
||||
msg = "";
|
||||
@@ -1125,6 +1511,9 @@ function form_submit(f)
|
||||
if (confirm(msg+"\'" + status + "\' 상태를 선택하셨습니다.\n\n선택하신대로 처리하시겠습니까?")) {
|
||||
return true;
|
||||
} else {
|
||||
if (nicepayVbankCancel && f.nicepay_vbank_refund_confirmed) {
|
||||
f.nicepay_vbank_refund_confirmed.value = 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,16 @@ auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
check_admin_token();
|
||||
|
||||
$od_id = isset($_POST['od_id']) ? safe_replace_regex($_POST['od_id'], 'od_id') : '';
|
||||
$ct_status = isset($_POST['ct_status']) ? clean_xss_tags($_POST['ct_status'], 1, 1) : '';
|
||||
if ($ct_status === '' && isset($_POST['submit_ct_status'])) {
|
||||
$ct_status = clean_xss_tags($_POST['submit_ct_status'], 1, 1);
|
||||
}
|
||||
$pg_cancel = isset($_POST['pg_cancel']) ? (int) $_POST['pg_cancel'] : 0;
|
||||
$nicepay_refund_acct_no = isset($_POST['RefundAcctNo']) ? preg_replace('/[^0-9]/', '', $_POST['RefundAcctNo']) : '';
|
||||
$nicepay_refund_bank_cd = isset($_POST['RefundBankCd']) ? preg_replace('/[^0-9]/', '', $_POST['RefundBankCd']) : '';
|
||||
$nicepay_refund_acct_nm = isset($_POST['RefundAcctNm']) ? trim(clean_xss_tags($_POST['RefundAcctNm'], 1, 1)) : '';
|
||||
|
||||
$ct_chk_count = isset($_POST['ct_chk']) ? count($_POST['ct_chk']) : 0;
|
||||
if(!$ct_chk_count)
|
||||
alert('처리할 자료를 하나 이상 선택해 주십시오.');
|
||||
@@ -13,12 +23,171 @@ if(!$ct_chk_count)
|
||||
$status_normal = array('주문','입금','준비','배송','완료');
|
||||
$status_cancel = array('취소','반품','품절');
|
||||
|
||||
if (in_array($_POST['ct_status'], $status_normal) || in_array($_POST['ct_status'], $status_cancel)) {
|
||||
if (in_array($ct_status, $status_normal) || in_array($ct_status, $status_cancel)) {
|
||||
; // 통과
|
||||
} else {
|
||||
alert('변경할 상태가 올바르지 않습니다.');
|
||||
}
|
||||
|
||||
// INIpay PRO 전체취소는 로컬 상품상태를 바꾸기 전에 PG 취소를 먼저 확정한다.
|
||||
// PG 취소 실패 후에도 주문만 취소되어 가상계좌 입금이 남는 상태를 방지한다.
|
||||
$inicis_pro_cancel_preprocessed = false;
|
||||
$inicis_pro_order_lock = '';
|
||||
if (in_array($_POST['ct_status'], $status_cancel)) {
|
||||
$selected_ct_ids = array();
|
||||
$posted_ct_count = isset($_POST['ct_id']) && is_array($_POST['ct_id']) ? count($_POST['ct_id']) : 0;
|
||||
for ($pre_i = 0; $pre_i < $posted_ct_count; $pre_i++) {
|
||||
$pre_k = isset($_POST['ct_chk'][$pre_i]) ? (int) $_POST['ct_chk'][$pre_i] : -1;
|
||||
if ($pre_k < 0 || !isset($_POST['ct_id'][$pre_k]))
|
||||
continue;
|
||||
$pre_ct_id = (int) $_POST['ct_id'][$pre_k];
|
||||
if ($pre_ct_id > 0)
|
||||
$selected_ct_ids[$pre_ct_id] = $pre_ct_id;
|
||||
}
|
||||
|
||||
if (count($selected_ct_ids)) {
|
||||
$selected_ct_sql = implode(',', array_values($selected_ct_ids));
|
||||
$future = sql_fetch(" select count(*) as total_count,
|
||||
sum(if(ct_status in ('취소','반품','품절') or ct_id in ($selected_ct_sql), 1, 0)) as cancel_count
|
||||
from {$g5['g5_shop_cart_table']}
|
||||
where od_id = '".sql_escape_string($od_id)."' ");
|
||||
if ((int) $future['total_count'] > 0 && (int) $future['total_count'] === (int) $future['cancel_count']) {
|
||||
$pre_od = sql_fetch(" select * from {$g5['g5_shop_order_table']} where od_id = '".sql_escape_string($od_id)."' ");
|
||||
if (!empty($pre_od['od_tno']) && $pre_od['od_pg'] === 'inicis') {
|
||||
include_once(G5_SHOP_PATH.'/inicis/pro/inicis_pro.lib.php');
|
||||
$pro_tables = inicis_pro_audit_tables();
|
||||
$pro_summary = sql_fetch(" select * from `{$pro_tables['summary']}`
|
||||
where ip_oid = '".sql_escape_string($pre_od['od_id'])."'
|
||||
and ip_tid = '".sql_escape_string($pre_od['od_tno'])."' ", false);
|
||||
if (!empty($pro_summary['ip_id'])) {
|
||||
$inicis_pro_order_lock = inicis_pro_lock($pre_od['od_id']);
|
||||
if ($inicis_pro_order_lock === '')
|
||||
alert('동일 주문의 결제 또는 통보 처리가 진행 중입니다. 잠시 후 다시 취소해 주십시오.');
|
||||
|
||||
// KG이니시스 상점관리자에서 이미 취소한 거래이면 PG 취소 없이 주문 취소만 진행한다.
|
||||
$pre_inquiry = inicis_pro_inquiry($pre_od['od_tno'], $pre_od['od_id'], $pro_summary);
|
||||
$pre_inquiry_data = isset($pre_inquiry['data']) && is_array($pre_inquiry['data']) ? $pre_inquiry['data'] : array();
|
||||
$pre_pg_status = isset($pre_inquiry_data['status']) ? strtoupper(preg_replace('/[^A-Za-z0-9_]/', '', (string) $pre_inquiry_data['status'])) : '';
|
||||
|
||||
if (!empty($pre_inquiry['success']) && in_array($pre_pg_status, array('1', 'C', 'CANCEL', 'DEPOSIT_CANCELED', 'REFUND_COMPLETED'))) {
|
||||
inicis_pro_save_inquiry($pre_od['od_id'], $pre_inquiry, 'admin');
|
||||
inicis_pro_audit_write($pre_od['od_id'], 'cancel', 'canceled', array(
|
||||
'tid' => $pre_od['od_tno'],
|
||||
'mid' => $pro_summary['ip_mid'],
|
||||
'amount' => isset($pro_summary['ip_amount']) ? (int) $pro_summary['ip_amount'] : 0,
|
||||
'pay_type' => isset($pro_summary['ip_pay_type']) ? $pro_summary['ip_pay_type'] : '',
|
||||
'source' => 'admin',
|
||||
'code' => $pre_pg_status,
|
||||
'message' => 'KG이니시스에서 이미 취소된 거래로 확인되어 주문 취소만 진행합니다.'
|
||||
));
|
||||
$inicis_pro_cancel_preprocessed = true;
|
||||
} else {
|
||||
$pre_refunded = (int) $pre_od['od_refund_price'];
|
||||
$pre_remaining = (int) $pre_od['od_receipt_price'] - $pre_refunded;
|
||||
|
||||
if ($pre_refunded > 0 && $pre_remaining <= 0) {
|
||||
// 이전 부분취소로 결제금액이 모두 환불된 주문은 PG 취소 없이 주문 취소만 진행한다.
|
||||
inicis_pro_audit_write($pre_od['od_id'], 'cancel', 'canceled', array(
|
||||
'tid' => $pre_od['od_tno'],
|
||||
'mid' => $pro_summary['ip_mid'],
|
||||
'amount' => isset($pro_summary['ip_amount']) ? (int) $pro_summary['ip_amount'] : 0,
|
||||
'pay_type' => isset($pro_summary['ip_pay_type']) ? $pro_summary['ip_pay_type'] : '',
|
||||
'source' => 'admin',
|
||||
'message' => '이전 부분취소로 결제금액이 모두 환불되어 주문 취소만 진행합니다.'
|
||||
));
|
||||
$inicis_pro_cancel_preprocessed = true;
|
||||
} elseif (!isset($_POST['pg_cancel']) || (int) $_POST['pg_cancel'] !== 1) {
|
||||
// PG 승인취소 없이 주문만 취소하는 선택을 이력에 남긴다. 결제는 KG이니시스에 승인 상태로 남는다.
|
||||
inicis_pro_audit_write($pre_od['od_id'], 'cancel', 'canceled', array(
|
||||
'tid' => $pre_od['od_tno'],
|
||||
'mid' => $pro_summary['ip_mid'],
|
||||
'amount' => isset($pro_summary['ip_amount']) ? (int) $pro_summary['ip_amount'] : 0,
|
||||
'pay_type' => isset($pro_summary['ip_pay_type']) ? $pro_summary['ip_pay_type'] : '',
|
||||
'source' => 'admin',
|
||||
'message' => 'PG 승인취소 없이 주문만 취소했습니다. 결제는 KG이니시스에 남아 있습니다.',
|
||||
'event_only' => '1'
|
||||
));
|
||||
} else {
|
||||
$pro_environment = !empty($pro_summary['ip_environment']) ? $pro_summary['ip_environment'] : inicis_pro_environment();
|
||||
if ($pro_summary['ip_mid'] !== inicis_pro_get_mid(!empty($pro_summary['ip_pay_type']) ? $pro_summary['ip_pay_type'] : null) || $pro_environment !== inicis_pro_environment())
|
||||
alert('거래 당시 MID 또는 결제환경과 현재 설정이 달라 PG 취소를 실행할 수 없습니다. KG이니시스 상점관리자에서 원거래를 확인해 주십시오.');
|
||||
|
||||
include_once(G5_SHOP_PATH.'/settle_inicis.inc.php');
|
||||
$pre_cancel_args = array(
|
||||
'paymethod' => get_type_inicis_paymethod($pre_od['od_settle_case']),
|
||||
'tid' => $pre_od['od_tno'],
|
||||
'mid' => $pro_summary['ip_mid'],
|
||||
'audit_oid' => $pre_od['od_id'],
|
||||
'audit_source' => 'admin',
|
||||
'msg' => '쇼핑몰 운영자 승인 취소',
|
||||
'url' => $pro_environment === 'test' ? 'https://stginiapi.inicis.com/api/v1/refund' : 'https://iniapi.inicis.com/api/v1/refund'
|
||||
);
|
||||
// 부분취소 이력이 있는 거래는 전체취소 요청이 거부되므로 잔여 금액을 부분취소로 처리한다.
|
||||
$pre_cancel_is_part = $pre_refunded > 0 && $pre_remaining > 0;
|
||||
if ($pre_cancel_is_part) {
|
||||
$pre_cancel_args['msg'] = '쇼핑몰 운영자 승인 취소(잔여금액)';
|
||||
$pre_cancel_args['price'] = $pre_remaining;
|
||||
$pre_cancel_args['confirmPrice'] = 0;
|
||||
}
|
||||
$pre_cancel_response = inicis_tid_cancel($pre_cancel_args, $pre_cancel_is_part);
|
||||
$pre_cancel_result = json_decode($pre_cancel_response, true);
|
||||
if (!isset($pre_cancel_result['resultCode']) || $pre_cancel_result['resultCode'] !== '00') {
|
||||
$pre_cancel_code = !empty($pre_cancel_result['resultCode']) ? $pre_cancel_result['resultCode'] : 'COMMUNICATION_FAILED';
|
||||
$pre_cancel_message = !empty($pre_cancel_result['resultMsg']) ? $pre_cancel_result['resultMsg'] : 'KG이니시스 취소 응답을 확인하지 못했습니다.';
|
||||
alert($pre_cancel_message.' 코드 : '.$pre_cancel_code);
|
||||
}
|
||||
if ($pre_cancel_is_part) {
|
||||
inicis_pro_audit_write($pre_od['od_id'], 'cancel', 'canceled', array(
|
||||
'tid' => $pre_od['od_tno'],
|
||||
'mid' => $pro_summary['ip_mid'],
|
||||
'amount' => isset($pro_summary['ip_amount']) ? (int) $pro_summary['ip_amount'] : 0,
|
||||
'pay_type' => isset($pro_summary['ip_pay_type']) ? $pro_summary['ip_pay_type'] : '',
|
||||
'source' => 'admin',
|
||||
'code' => '00',
|
||||
'message' => '잔여 금액 부분취소로 전체취소를 완료했습니다.'
|
||||
));
|
||||
}
|
||||
$inicis_pro_cancel_preprocessed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($pg_cancel === 1 && in_array($ct_status, $status_cancel)) {
|
||||
$nicepay_refund_order = sql_fetch(" select od_id, od_pg, od_settle_case, od_status, od_receipt_price from {$g5['g5_shop_order_table']} where od_id = '$od_id' ");
|
||||
|
||||
if (isset($nicepay_refund_order['od_id']) && $nicepay_refund_order['od_pg'] === 'nicepay' && $nicepay_refund_order['od_settle_case'] === '가상계좌' && is_cancel_shop_pg_order($nicepay_refund_order)) {
|
||||
$nicepay_refund_required = ((int) $nicepay_refund_order['od_receipt_price'] > 0);
|
||||
$nicepay_refund_inputted = ($nicepay_refund_acct_no !== '' || $nicepay_refund_bank_cd !== '' || $nicepay_refund_acct_nm !== '');
|
||||
|
||||
if (!$nicepay_refund_required && !$nicepay_refund_inputted) {
|
||||
$nicepay_refund_acct_no = '';
|
||||
$nicepay_refund_bank_cd = '';
|
||||
$nicepay_refund_acct_nm = '';
|
||||
} else {
|
||||
if ($nicepay_refund_acct_no === '' || strlen($nicepay_refund_acct_no) > 16) {
|
||||
alert('나이스페이 가상계좌 취소를 위해 환불계좌번호를 숫자 16자리 이하로 입력해 주십시오.');
|
||||
}
|
||||
|
||||
if (!preg_match('/^[0-9]{3}$/', $nicepay_refund_bank_cd)) {
|
||||
alert('나이스페이 가상계좌 취소를 위해 환불계좌코드를 숫자 3자리로 입력해 주십시오.');
|
||||
}
|
||||
|
||||
if ($nicepay_refund_acct_nm === '') {
|
||||
alert('나이스페이 가상계좌 취소를 위해 환불계좌주명을 입력해 주십시오.');
|
||||
}
|
||||
|
||||
$nicepay_refund_acct_nm_euckr = function_exists('iconv') ? @iconv('UTF-8', 'EUC-KR//IGNORE', $nicepay_refund_acct_nm) : $nicepay_refund_acct_nm;
|
||||
if (strlen($nicepay_refund_acct_nm_euckr) > 10) {
|
||||
alert('나이스페이 환불계좌주명은 10 byte 이하로 입력해 주십시오.');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$search = isset($_REQUEST['search']) ? get_search_string($_REQUEST['search']) : '';
|
||||
$sort1 = isset($_REQUEST['sort1']) ? clean_xss_tags($_REQUEST['sort1'], 1, 1) : '';
|
||||
$sort2 = isset($_REQUEST['sort2']) ? clean_xss_tags($_REQUEST['sort2'], 1, 1) : '';
|
||||
@@ -172,7 +341,7 @@ if(is_array($arr_it_id) && !empty($arr_it_id)) {
|
||||
|
||||
// 장바구니 상품 모두 취소일 경우 주문상태 변경
|
||||
$cancel_change = false;
|
||||
if (in_array($_POST['ct_status'], $status_cancel)) {
|
||||
if (in_array($ct_status, $status_cancel)) {
|
||||
$sql = " select count(*) as od_count1,
|
||||
SUM(IF(ct_status = '취소' OR ct_status = '반품' OR ct_status = '품절', 1, 0)) as od_count2
|
||||
from {$g5['g5_shop_cart_table']}
|
||||
@@ -227,15 +396,19 @@ if (in_array($_POST['ct_status'], $status_cancel)) {
|
||||
case 'inicis':
|
||||
include_once(G5_SHOP_PATH.'/settle_inicis.inc.php');
|
||||
$cancel_msg = '쇼핑몰 운영자 승인 취소';
|
||||
|
||||
$args = array(
|
||||
'paymethod' => get_type_inicis_paymethod($od['od_settle_case']),
|
||||
'tid' => $od['od_tno'],
|
||||
'msg' => $cancel_msg
|
||||
);
|
||||
|
||||
$response = inicis_tid_cancel($args);
|
||||
$result = json_decode($response, true);
|
||||
if ($inicis_pro_cancel_preprocessed) {
|
||||
$result = array('resultCode' => '00', 'resultMsg' => 'INIpay PRO PG 취소 선처리 완료');
|
||||
} else {
|
||||
$args = array(
|
||||
'paymethod' => get_type_inicis_paymethod($od['od_settle_case']),
|
||||
'tid' => $od['od_tno'],
|
||||
'msg' => $cancel_msg
|
||||
);
|
||||
|
||||
$response = inicis_tid_cancel($args);
|
||||
$result = json_decode($response, true);
|
||||
}
|
||||
|
||||
if (isset($result['resultCode'])) {
|
||||
if ($result['resultCode'] != '00') {
|
||||
@@ -254,17 +427,24 @@ if (in_array($_POST['ct_status'], $status_cancel)) {
|
||||
|
||||
$tno = $od['od_tno'];
|
||||
|
||||
$cancelAmt = $od['od_receipt_price'];
|
||||
$cancelAmt = (int)$od['od_receipt_price'];
|
||||
if($od['od_settle_case'] == '가상계좌' && $od['od_status'] == '주문' && $cancelAmt == 0)
|
||||
$cancelAmt = (int)$od['od_misu'];
|
||||
|
||||
// 0:전체 취소, 1:부분 취소(별도 계약 필요)
|
||||
$partialCancelCode = 0;
|
||||
|
||||
if($cancelAmt <= 0) {
|
||||
$pg_res_cd = 'NO_CANCEL_AMT';
|
||||
$pg_res_msg = '취소 요청금액이 없습니다.';
|
||||
break;
|
||||
}
|
||||
|
||||
include G5_SHOP_PATH.'/nicepay/cancel_process.php';
|
||||
|
||||
if (isset($result['ResultCode'])) {
|
||||
// 실패했다면
|
||||
if ($result['ResultCode'] !== '2001') {
|
||||
if (! in_array($result['ResultCode'], array('2001', '2211'), true)) {
|
||||
$pg_res_cd = $result['ResultCode'];
|
||||
$pg_res_msg = $result['ResultMsg'];
|
||||
}
|
||||
@@ -336,7 +516,7 @@ if (in_array($_POST['ct_status'], $status_cancel)) {
|
||||
}
|
||||
|
||||
// 관리자 주문취소 로그
|
||||
$mod_history .= G5_TIME_YMDHIS.' '.$member['mb_id'].' 주문'.$_POST['ct_status'].' 처리'.$pg_cancel_log."\n";
|
||||
$mod_history .= G5_TIME_YMDHIS.' '.$member['mb_id'].' 주문'.$ct_status.' 처리'.$pg_cancel_log."\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -364,8 +544,8 @@ if ($mod_history) { // 주문변경 히스토리 기록
|
||||
if($cancel_change) {
|
||||
$sql .= " , od_status = '취소' "; // 주문상품 모두 취소, 반품, 품절이면 주문 취소
|
||||
} else {
|
||||
if (isset($_POST['ct_status']) && in_array($_POST['ct_status'], $status_normal)) { // 정상인 주문상태만 기록
|
||||
$sql .= " , od_status = '{$_POST['ct_status']}' ";
|
||||
if ($ct_status && in_array($ct_status, $status_normal)) { // 정상인 주문상태만 기록
|
||||
$sql .= " , od_status = '$ct_status' ";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -376,6 +556,9 @@ $qstr = "sort1=$sort1&sort2=$sort2&sel_field=$sel_field&search=$sear
|
||||
|
||||
$url = "./orderform.php?od_id=$od_id&$qstr";
|
||||
|
||||
if ($inicis_pro_order_lock !== '')
|
||||
inicis_pro_unlock($inicis_pro_order_lock);
|
||||
|
||||
// 신용카드 취소 때 오류가 있으면 알림
|
||||
if($pg_cancel == 1 && $pg_res_cd && $pg_res_msg) {
|
||||
alert('오류코드 : '.$pg_res_cd.' 오류내용 : '.$pg_res_msg, $url);
|
||||
@@ -386,4 +569,4 @@ if($pg_cancel == 1 && $pg_res_cd && $pg_res_msg) {
|
||||
alert("포인트로 결제한 주문은,\\n\\n주문상태 변경으로 인해 포인트의 가감이 발생하는 경우\\n\\n회원관리 > 포인트관리에서 수작업으로 포인트를 맞추어 주셔야 합니다.", $url);
|
||||
else
|
||||
goto_url($url);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
$sub_menu = '400400';
|
||||
include_once('./_common.php');
|
||||
|
||||
auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
check_admin_token();
|
||||
|
||||
$od_shop_memo = isset($_POST['od_shop_memo']) ? addslashes(strip_tags(stripslashes($_POST['od_shop_memo']))) : '';
|
||||
|
||||
@@ -305,7 +305,7 @@ if( function_exists('pg_setting_check') ){
|
||||
$s_receipt_way = $s_br = "";
|
||||
if ($row['od_settle_case'])
|
||||
{
|
||||
$s_receipt_way = check_pay_name_replace($row['od_settle_case'], $row);
|
||||
$s_receipt_way = get_text(check_pay_name_replace($row['od_settle_case'], $row));
|
||||
$s_br = '<br />';
|
||||
}
|
||||
else
|
||||
@@ -402,7 +402,7 @@ if( function_exists('pg_setting_check') ){
|
||||
<?php echo $row['od_status']; ?>
|
||||
</td>
|
||||
<td headers="odrpay" class="odrpay">
|
||||
<input type="hidden" name="current_settle_case[<?php echo $i ?>]" value="<?php echo $row['od_settle_case'] ?>">
|
||||
<input type="hidden" name="current_settle_case[<?php echo $i ?>]" value="<?php echo get_text($row['od_settle_case']) ?>">
|
||||
<?php echo $s_receipt_way; ?>
|
||||
</td>
|
||||
<td headers="delino" class="delino">
|
||||
|
||||
@@ -4,6 +4,8 @@ include_once('./_common.php');
|
||||
|
||||
//print_r2($_POST); exit;
|
||||
|
||||
auth_check_menu($auth, $sub_menu, "d");
|
||||
|
||||
check_admin_token();
|
||||
|
||||
$count_post_chk = (isset($_POST['chk']) && is_array($_POST['chk'])) ? count($_POST['chk']) : 0;
|
||||
|
||||
@@ -4,6 +4,8 @@ include_once('./_common.php');
|
||||
include_once('./admin.shop.lib.php');
|
||||
include_once(G5_LIB_PATH.'/mailer.lib.php');
|
||||
|
||||
auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
check_admin_token();
|
||||
|
||||
define("_ORDERMAIL_", true);
|
||||
|
||||
@@ -21,7 +21,7 @@ if($od['od_settle_case'] == '계좌이체' && substr($od['od_receipt_time'], 0,
|
||||
if($od['od_receipt_price'] - $od['od_refund_price'] <= 0)
|
||||
alert_close('부분취소 처리할 금액이 없습니다.');
|
||||
|
||||
$g5['title'] = $od['od_settle_case'].' 부분취소';
|
||||
$g5['title'] = get_text($od['od_settle_case']).' 부분취소';
|
||||
include_once(G5_PATH.'/head.sub.php');
|
||||
|
||||
// 취소가능금액
|
||||
@@ -29,10 +29,11 @@ $od_misu = abs($od['od_misu']);
|
||||
?>
|
||||
|
||||
<form name="forderpartcancel" method="post" action="./orderpartcancelupdate.php" onsubmit="return form_check(this);">
|
||||
<input type="hidden" name="token" value="<?php echo get_admin_token(); ?>">
|
||||
<input type="hidden" name="od_id" value="<?php echo $od_id; ?>">
|
||||
|
||||
<div class="new_win">
|
||||
<h1><?php echo $od['od_settle_case']; ?> 부분취소</h1>
|
||||
<h1><?php echo get_text($od['od_settle_case']); ?> 부분취소</h1>
|
||||
|
||||
<div class="tbl_frm01 tbl_wrap">
|
||||
<table>
|
||||
@@ -70,14 +71,18 @@ $od_misu = abs($od['od_misu']);
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script src="<?php echo G5_ADMIN_URL ?>/admin.js"></script>
|
||||
|
||||
<script>
|
||||
var g5_admin_csrf_token_key = "<?php echo (function_exists('admin_csrf_token_key')) ? admin_csrf_token_key() : ''; ?>";
|
||||
|
||||
function form_check(f)
|
||||
{
|
||||
var max_mny = parseInt(<?php echo $od_misu; ?>);
|
||||
var tax_mny = parseInt(f.mod_tax_mny.value.replace("/[^0-9]/g", ""));
|
||||
var tax_mny = parseInt(f.mod_tax_mny.value.replace(/[^0-9]/g, ""), 10) || 0;
|
||||
var free_mny = 0;
|
||||
if(typeof f.mod_free.mny.value != "undefined")
|
||||
free_mny = parseInt(f.mod_free_mny.value.replace("/[^0-9]/g", ""));
|
||||
if(typeof f.mod_free_mny != "undefined")
|
||||
free_mny = parseInt(f.mod_free_mny.value.replace(/[^0-9]/g, ""), 10) || 0;
|
||||
|
||||
if(!tax_mny && !free_mny) {
|
||||
alert("과세 취소금액 또는 비과세 취소금액을 입력해 주십시오.");
|
||||
@@ -104,4 +109,4 @@ function form_check(f)
|
||||
</script>
|
||||
|
||||
<?php
|
||||
include_once(G5_PATH.'/tail.sub.php');
|
||||
include_once(G5_PATH.'/tail.sub.php');
|
||||
|
||||
@@ -6,6 +6,8 @@ auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
check_admin_token();
|
||||
|
||||
$od_id = isset($_POST['od_id']) ? safe_replace_regex($_POST['od_id'], 'od_id') : '';
|
||||
$mod_memo = isset($_POST['mod_memo']) ? trim(clean_xss_tags($_POST['mod_memo'], 1, 1)) : '';
|
||||
$tax_mny = isset($_POST['mod_tax_mny']) ? preg_replace('/[^0-9]/', '', $_POST['mod_tax_mny']) : 0;
|
||||
$free_mny = isset($_POST['mod_free_mny']) ? preg_replace('/[^0-9]/', '', $_POST['mod_free_mny']) : 0;
|
||||
|
||||
@@ -44,10 +46,10 @@ include_once(G5_PATH.'/head.sub.php');
|
||||
?>
|
||||
|
||||
<script>
|
||||
alert("<?php echo $od['od_settle_case']; ?> 부분취소 처리됐습니다.");
|
||||
alert("<?php echo get_text($od['od_settle_case']); ?> 부분취소 처리됐습니다.");
|
||||
opener.document.location.reload();
|
||||
self.close();
|
||||
</script>
|
||||
|
||||
<?php
|
||||
include_once(G5_PATH.'/tail.sub.php');
|
||||
include_once(G5_PATH.'/tail.sub.php');
|
||||
|
||||
@@ -4,6 +4,8 @@ include_once('./_common.php');
|
||||
|
||||
auth_check_menu($auth, $sub_menu, 'w');
|
||||
|
||||
if (function_exists('check_request_origin')) check_request_origin(G5_ADMIN_URL);
|
||||
|
||||
$_POST = array_map('trim', $_POST);
|
||||
|
||||
if(!$_POST['pp_name'])
|
||||
|
||||
@@ -6,6 +6,11 @@ auth_check_menu($auth, $sub_menu, "r");
|
||||
|
||||
$sql_common = " from {$g5['g5_shop_personalpay_table']} ";
|
||||
|
||||
$allowed_sfl = array('pp_id', 'pp_name', 'od_id');
|
||||
if (!in_array($sfl, $allowed_sfl)) {
|
||||
$sfl = 'pp_id';
|
||||
}
|
||||
|
||||
$sql_search = " where (1) ";
|
||||
if ($stx) {
|
||||
$sql_search .= " and ( ";
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
$sub_menu = "900600";
|
||||
include_once('./_common.php');
|
||||
|
||||
auth_check_menu($auth, $sub_menu, "r");
|
||||
auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
if (function_exists('check_request_origin')) check_request_origin(G5_ADMIN_URL);
|
||||
|
||||
$post_chk_fg_no = (isset($_POST['chk_fg_no']) && is_array($_POST['chk_fg_no'])) ? $_POST['chk_fg_no'] : array();
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@ include_once("./_common.php");
|
||||
|
||||
auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
if (function_exists('check_request_origin')) check_request_origin(G5_ADMIN_URL);
|
||||
|
||||
$post_cnk = (isset($_POST['chk']) && is_array($_POST['chk'])) ? $_POST['chk'] : array();
|
||||
|
||||
if ($w == 'u') // 업데이트
|
||||
|
||||
@@ -4,6 +4,8 @@ include_once("./_common.php");
|
||||
|
||||
auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
if (function_exists('check_request_origin')) check_request_origin(G5_ADMIN_URL);
|
||||
|
||||
$upload_bg_no = isset($_REQUEST['upload_bg_no']) ? (int) $_REQUEST['upload_bg_no'] : 0;
|
||||
$confirm = isset($_REQUEST['confirm']) ? clean_xss_tags($_REQUEST['confirm'], 1, 1) : '';
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@ include_once("./_common.php");
|
||||
|
||||
auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
if (function_exists('check_request_origin')) check_request_origin(G5_ADMIN_URL);
|
||||
|
||||
$g5['title'] = "전화번호부";
|
||||
|
||||
$post_bk_no = (isset($_POST['bk_no']) && is_array($_POST['bk_no'])) ? $_POST['bk_no'] : array();
|
||||
|
||||
@@ -4,6 +4,8 @@ include_once("./_common.php");
|
||||
|
||||
auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
if (function_exists('check_request_origin')) check_request_origin(G5_ADMIN_URL);
|
||||
|
||||
$g5['title'] = "휴대폰번호 업데이트";
|
||||
|
||||
$g5['sms5_demo'] = 0;
|
||||
|
||||
@@ -6,6 +6,8 @@ $post_chk = (isset($_POST['chk']) && is_array($_POST['chk'])) ? $_POST['chk'] :
|
||||
|
||||
auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
if (function_exists('check_request_origin')) check_request_origin(G5_ADMIN_URL);
|
||||
|
||||
if ($w == 'u') // 업데이트
|
||||
{
|
||||
for ($i=0; $i<count($post_chk); $i++)
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
$sub_menu = "900800";
|
||||
include_once('./_common.php');
|
||||
|
||||
auth_check_menu($auth, $sub_menu, "r");
|
||||
auth_check_menu($auth, $sub_menu, "w");
|
||||
|
||||
if (function_exists('check_request_origin')) check_request_origin(G5_ADMIN_URL);
|
||||
|
||||
$post_chk_bg_no = isset($_POST['chk_bg_no']) ? $_POST['chk_bg_no'] : array();
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@ check_demo();
|
||||
|
||||
auth_check_menu($auth, $sub_menu, 'd');
|
||||
|
||||
if (function_exists('check_request_origin')) check_request_origin(G5_ADMIN_URL);
|
||||
|
||||
if ($is_admin != 'super')
|
||||
alert('최고관리자만 접근 가능합니다.');
|
||||
|
||||
|
||||
+3
-2
@@ -58,6 +58,7 @@ for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||
if (count($arr)) {
|
||||
foreach ($arr as $key=>$value) {
|
||||
$count = $value;
|
||||
$last_date = date('Y-m-t', strtotime($key.'-01'));
|
||||
|
||||
$rate = ($count / $sum_count * 100);
|
||||
$s_rate = number_format($rate, 1);
|
||||
@@ -66,7 +67,7 @@ for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||
?>
|
||||
|
||||
<tr class="<?php echo $bg; ?>">
|
||||
<td class="td_category"><a href="./visit_date.php?fr_date=<?php echo $key ?>-01&to_date=<?php echo $key ?>-31"><?php echo $key ?></a></td>
|
||||
<td class="td_category"><a href="./visit_date.php?fr_date=<?php echo $key ?>-01&to_date=<?php echo $last_date ?>"><?php echo $key ?></a></td>
|
||||
<td>
|
||||
<div class="visit_bar">
|
||||
<span style="width:<?php echo $s_rate ?>%"></span>
|
||||
@@ -91,4 +92,4 @@ for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||
</div>
|
||||
|
||||
<?php
|
||||
include_once('./admin.tail.php');
|
||||
include_once('./admin.tail.php');
|
||||
|
||||
+2
-1
@@ -9,7 +9,8 @@ if (G5_IS_MOBILE) {
|
||||
} else {
|
||||
// 상단 파일 경로를 입력하지 않았다면 기본 상단 파일도 include 하지 않음
|
||||
if (trim($board['bo_include_head'])) {
|
||||
if (is_include_path_check($board['bo_include_head'])) { //파일경로 체크
|
||||
if (is_include_path_check($board['bo_include_head'])
|
||||
&& (!function_exists('is_content_include_allowed') || is_content_include_allowed($board['bo_include_head']))) { //파일경로 체크
|
||||
@include ($board['bo_include_head']);
|
||||
} else { //파일경로가 올바르지 않으면 기본파일을 가져옴
|
||||
include_once(G5_BBS_PATH.'/_head.php');
|
||||
|
||||
+2
-1
@@ -10,7 +10,8 @@ if (G5_IS_MOBILE) {
|
||||
echo run_replace('board_content_tail', html_purifier(stripslashes($board['bo_content_tail'])), $board);
|
||||
// 하단 파일 경로를 입력하지 않았다면 기본 하단 파일도 include 하지 않음
|
||||
if (trim($board['bo_include_tail'])) {
|
||||
if (is_include_path_check($board['bo_include_tail'])) { //파일경로 체크
|
||||
if (is_include_path_check($board['bo_include_tail'])
|
||||
&& (!function_exists('is_content_include_allowed') || is_content_include_allowed($board['bo_include_tail']))) { //파일경로 체크
|
||||
@include ($board['bo_include_tail']);
|
||||
} else { //파일경로가 올바르지 않으면 기본파일을 가져옴
|
||||
include_once(G5_BBS_PATH.'/_tail.php');
|
||||
|
||||
+4
-2
@@ -31,7 +31,8 @@ if (! (isset($co['co_id']) && $co['co_id']))
|
||||
|
||||
$g5['title'] = $co['co_subject'];
|
||||
|
||||
if ($co['co_include_head'] && is_include_path_check($co['co_include_head']))
|
||||
if ($co['co_include_head'] && is_include_path_check($co['co_include_head'])
|
||||
&& (!function_exists('is_content_include_allowed') || is_content_include_allowed($co['co_include_head'])))
|
||||
@include_once($co['co_include_head']);
|
||||
else
|
||||
include_once('./_head.php');
|
||||
@@ -99,7 +100,8 @@ if(is_file($skin_file)) {
|
||||
echo '<p>'.str_replace(G5_PATH.'/', '', $skin_file).'이 존재하지 않습니다.</p>';
|
||||
}
|
||||
|
||||
if ($co['co_include_tail'] && is_include_path_check($co['co_include_tail']))
|
||||
if ($co['co_include_tail'] && is_include_path_check($co['co_include_tail'])
|
||||
&& (!function_exists('is_content_include_allowed') || is_content_include_allowed($co['co_include_tail'])))
|
||||
@include_once($co['co_include_tail']);
|
||||
else
|
||||
include_once('./_tail.php');
|
||||
@@ -18,7 +18,7 @@ for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||
if ($row['mb_id']) {
|
||||
$list[$i]['name'] = get_sideview($row['mb_id'], cut_str($row['mb_nick'], $config['cf_cut_name']), $row['mb_email'], $row['mb_homepage']);
|
||||
} else {
|
||||
if ($is_admin)
|
||||
if ($is_admin === 'super')
|
||||
$list[$i]['name'] = $row['lo_ip'];
|
||||
else
|
||||
$list[$i]['name'] = preg_replace("/([0-9]+).([0-9]+).([0-9]+).([0-9]+)/", G5_IP_DISPLAY, $row['lo_ip']);
|
||||
|
||||
+16
-3
@@ -28,9 +28,22 @@ if (!preg_match("/([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)\.([0-9a-zA-Z_-]+)/", $to)){
|
||||
}
|
||||
|
||||
$file = array();
|
||||
|
||||
// 첨부파일을 이동하기 전에 모든 파일명을 먼저 확인한다.
|
||||
for ($i=1; $i<=$attach; $i++) {
|
||||
if ($_FILES['file'.$i]['name'])
|
||||
$file[] = attach_file($_FILES['file'.$i]['name'], $_FILES['file'.$i]['tmp_name']);
|
||||
$file_key = 'file'.$i;
|
||||
if (isset($_FILES[$file_key]['name']) && $_FILES[$file_key]['name']) {
|
||||
$filename = get_safe_filename($_FILES[$file_key]['name']);
|
||||
if (is_disallowed_svg_filename($filename)) {
|
||||
alert_close('허용되지 않는 파일 확장자입니다. (svg, svgz)');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for ($i=1; $i<=$attach; $i++) {
|
||||
$file_key = 'file'.$i;
|
||||
if (isset($_FILES[$file_key]['name']) && $_FILES[$file_key]['name'])
|
||||
$file[] = attach_file($_FILES[$file_key]['name'], $_FILES[$file_key]['tmp_name']);
|
||||
}
|
||||
|
||||
$content = stripslashes($content);
|
||||
@@ -78,4 +91,4 @@ include_once(G5_PATH.'/head.sub.php');
|
||||
|
||||
alert_close('메일을 정상적으로 발송하였습니다.');
|
||||
|
||||
include_once(G5_PATH.'/tail.sub.php');
|
||||
include_once(G5_PATH.'/tail.sub.php');
|
||||
|
||||
@@ -61,7 +61,8 @@ else if ($w == 'd')
|
||||
if ($member['mb_id'] || $is_admin == 'super')
|
||||
{
|
||||
$sql = " delete from {$g5['poll_etc_table']} where pc_id = '{$pc_id}' ";
|
||||
if (!$is_admin)
|
||||
// 최고관리자가 아니면 본인 기타의견만 삭제 (게시판/그룹 관리자 문맥으로 우회 불가)
|
||||
if ($is_admin !== 'super')
|
||||
$sql .= " and mb_id = '{$member['mb_id']}' ";
|
||||
sql_query($sql);
|
||||
}
|
||||
|
||||
+3
-1
@@ -1,6 +1,8 @@
|
||||
<?php
|
||||
include_once('./_common.php');
|
||||
|
||||
$is_admin = get_super_admin_type($is_admin);
|
||||
|
||||
if($is_guest)
|
||||
alert('회원이시라면 로그인 후 이용해 주십시오.', G5_URL);
|
||||
|
||||
@@ -93,4 +95,4 @@ for($i=0; $i<$count; $i++) {
|
||||
*/
|
||||
run_event('qa_delete', $tmp_array, $deleted);
|
||||
|
||||
goto_url(G5_BBS_URL.'/qalist.php'.preg_replace('/^&/', '?', $qstr));
|
||||
goto_url(G5_BBS_URL.'/qalist.php'.preg_replace('/^&/', '?', $qstr));
|
||||
|
||||
+18
-2
@@ -1,6 +1,8 @@
|
||||
<?php
|
||||
include_once('./_common.php');
|
||||
|
||||
$is_admin = get_super_admin_type($is_admin);
|
||||
|
||||
// clean the output buffer
|
||||
ob_end_clean();
|
||||
|
||||
@@ -11,11 +13,25 @@ $no = isset($_REQUEST['no']) ? (int) $_REQUEST['no'] : 0;
|
||||
if (!get_session('ss_qa_view_'.$qa_id))
|
||||
alert('잘못된 접근입니다.');
|
||||
|
||||
$sql = " select qa_subject, qa_file{$no}, qa_source{$no} from {$g5['qa_content_table']} where qa_id = '$qa_id' ";
|
||||
$sql = " select qa_subject, mb_id, qa_type, qa_parent, qa_file{$no}, qa_source{$no} from {$g5['qa_content_table']} where qa_id = '$qa_id' ";
|
||||
$file = sql_fetch($sql);
|
||||
if (!$file['qa_file'.$no])
|
||||
alert_close('파일 정보가 존재하지 않습니다.');
|
||||
|
||||
// 세션 표식만으로는 권한을 보장하지 못하므로 문의 스레드의 실제 소유자를 다시 확인
|
||||
if ($is_admin !== 'super') {
|
||||
if ($file['qa_type']) {
|
||||
// 답변 첨부는 부모 질문의 소유자를 기준으로 판정
|
||||
$parent = sql_fetch(" select mb_id from {$g5['qa_content_table']} where qa_id = '{$file['qa_parent']}' ");
|
||||
$thread_owner = isset($parent['mb_id']) ? $parent['mb_id'] : '';
|
||||
} else {
|
||||
$thread_owner = $file['mb_id'];
|
||||
}
|
||||
|
||||
if (! ($is_member && $thread_owner !== '' && $thread_owner === $member['mb_id']))
|
||||
alert('다운로드 권한이 없습니다.');
|
||||
}
|
||||
|
||||
if($is_guest) {
|
||||
alert('다운로드 권한이 없습니다.\\n회원이시라면 로그인 후 이용해 보십시오.', G5_BBS_URL.'/login.php?url='.urlencode(G5_BBS_URL.'/qaview.php?qa_id='.$qa_id));
|
||||
}
|
||||
@@ -71,4 +87,4 @@ while(!feof($fp)) {
|
||||
usleep(1000);
|
||||
}
|
||||
fclose ($fp);
|
||||
flush();
|
||||
flush();
|
||||
|
||||
+2
-1
@@ -9,7 +9,8 @@ if (G5_IS_MOBILE) {
|
||||
include_once('./_head.php');
|
||||
echo run_replace('qa_mobile_content_head', conv_content($qaconfig['qa_mobile_content_head'], 1), $qaconfig);
|
||||
} else {
|
||||
if($qaconfig['qa_include_head'] && is_include_path_check($qaconfig['qa_include_head']))
|
||||
if($qaconfig['qa_include_head'] && is_include_path_check($qaconfig['qa_include_head'])
|
||||
&& (!function_exists('is_content_include_allowed') || is_content_include_allowed($qaconfig['qa_include_head'])))
|
||||
@include ($qaconfig['qa_include_head']);
|
||||
else
|
||||
include ('./_head.php');
|
||||
|
||||
+8
-5
@@ -1,13 +1,15 @@
|
||||
<?php
|
||||
include_once('./_common.php');
|
||||
|
||||
$is_admin = get_super_admin_type($is_admin);
|
||||
|
||||
if($is_guest)
|
||||
alert('회원이시라면 로그인 후 이용해 보십시오.', './login.php?url='.urlencode(G5_BBS_URL.'/qalist.php'));
|
||||
|
||||
$qaconfig = get_qa_config();
|
||||
|
||||
$token = '';
|
||||
if( $is_admin ){
|
||||
if($is_admin === 'super') {
|
||||
$token = _token();
|
||||
set_session('ss_qa_delete_token', $token);
|
||||
}
|
||||
@@ -16,7 +18,7 @@ $g5['title'] = $qaconfig['qa_title'];
|
||||
include_once('./qahead.php');
|
||||
|
||||
$skin_file = $qa_skin_path.'/list.skin.php';
|
||||
$is_auth = $is_admin ? true : false;
|
||||
$is_auth = ($is_admin === 'super');
|
||||
|
||||
$category_option = '';
|
||||
|
||||
@@ -47,7 +49,8 @@ if(is_file($skin_file)) {
|
||||
$sql_common = " from {$g5['qa_content_table']} ";
|
||||
$sql_search = " where qa_type = '0' ";
|
||||
|
||||
if(!$is_admin)
|
||||
// 최고관리자가 아니면 본인 문의만 조회 (게시판/그룹 관리자 문맥으로 우회 불가)
|
||||
if($is_admin !== 'super')
|
||||
$sql_search .= " and mb_id = '{$member['mb_id']}' ";
|
||||
|
||||
if($sca) {
|
||||
@@ -131,7 +134,7 @@ if(is_file($skin_file)) {
|
||||
|
||||
$is_checkbox = false;
|
||||
$admin_href = '';
|
||||
if($is_admin) {
|
||||
if($is_admin === 'super') {
|
||||
$is_checkbox = true;
|
||||
$admin_href = G5_ADMIN_URL.'/qa_config.php';
|
||||
}
|
||||
@@ -147,4 +150,4 @@ if(is_file($skin_file)) {
|
||||
echo '<div>'.str_replace(G5_PATH.'/', '', $skin_file).'이 존재하지 않습니다.</div>';
|
||||
}
|
||||
|
||||
include_once('./qatail.php');
|
||||
include_once('./qatail.php');
|
||||
|
||||
+2
-1
@@ -7,7 +7,8 @@ if (G5_IS_MOBILE) {
|
||||
include_once('./_tail.php');
|
||||
} else {
|
||||
echo run_replace('qa_content_tail', conv_content($qaconfig['qa_content_tail'], 1), $qaconfig);
|
||||
if($qaconfig['qa_include_tail'] && is_include_path_check($qaconfig['qa_include_tail']))
|
||||
if($qaconfig['qa_include_tail'] && is_include_path_check($qaconfig['qa_include_tail'])
|
||||
&& (!function_exists('is_content_include_allowed') || is_content_include_allowed($qaconfig['qa_include_tail'])))
|
||||
@include ($qaconfig['qa_include_tail']);
|
||||
else
|
||||
include ('./_tail.php');
|
||||
|
||||
+7
-5
@@ -2,6 +2,8 @@
|
||||
include_once('./_common.php');
|
||||
include_once(G5_EDITOR_LIB);
|
||||
|
||||
$is_admin = get_super_admin_type($is_admin);
|
||||
|
||||
$qa_id = isset($_REQUEST['qa_id']) ? (int) $_REQUEST['qa_id'] : 0;
|
||||
|
||||
if($is_guest)
|
||||
@@ -21,7 +23,7 @@ $skin_file = $qa_skin_path.'/view.skin.php';
|
||||
|
||||
if(is_file($skin_file)) {
|
||||
$sql = " select * from {$g5['qa_content_table']} where qa_id = '$qa_id' ";
|
||||
if(!$is_admin) {
|
||||
if($is_admin !== 'super') {
|
||||
$sql .= " and mb_id = '{$member['mb_id']}' ";
|
||||
}
|
||||
|
||||
@@ -50,7 +52,7 @@ if(is_file($skin_file)) {
|
||||
$sql = " select qa_id, qa_subject
|
||||
from {$g5['qa_content_table']}
|
||||
where qa_type = '0' ";
|
||||
if(!$is_admin) {
|
||||
if($is_admin !== 'super') {
|
||||
$sql .= " and mb_id = '{$member['mb_id']}' ";
|
||||
}
|
||||
|
||||
@@ -115,7 +117,7 @@ if(is_file($skin_file)) {
|
||||
}
|
||||
*/
|
||||
|
||||
if(($view['qa_type'] && $is_admin) || (!$view['qa_type'] && $view['qa_status'] == 0)) {
|
||||
if(($view['qa_type'] && $is_admin === 'super') || (!$view['qa_type'] && $view['qa_status'] == 0)) {
|
||||
$update_href = G5_BBS_URL.'/qawrite.php?w=u&qa_id='.$view['qa_id'].$qstr;
|
||||
$delete_href = G5_BBS_URL.'/qadelete.php?qa_id='.$view['qa_id'].'&token='.$token.$qstr;
|
||||
}
|
||||
@@ -131,7 +133,7 @@ if(is_file($skin_file)) {
|
||||
and qa_parent = '{$view['qa_id']}' ";
|
||||
$answer = sql_fetch($sql);
|
||||
|
||||
if($is_admin) {
|
||||
if($is_admin === 'super') {
|
||||
$answer_update_href = G5_BBS_URL.'/qawrite.php?w=u&qa_id='.$answer['qa_id'].$qstr;
|
||||
$answer_delete_href = G5_BBS_URL.'/qadelete.php?qa_id='.$answer['qa_id'].'&token='.$token.$qstr;
|
||||
}
|
||||
@@ -216,4 +218,4 @@ if(is_file($skin_file)) {
|
||||
echo '<div>'.str_replace(G5_PATH.'/', '', $skin_file).'이 존재하지 않습니다.</div>';
|
||||
}
|
||||
|
||||
include_once('./qatail.php');
|
||||
include_once('./qatail.php');
|
||||
|
||||
+7
-5
@@ -2,6 +2,8 @@
|
||||
include_once('./_common.php');
|
||||
include_once(G5_EDITOR_LIB);
|
||||
|
||||
$is_admin = get_super_admin_type($is_admin);
|
||||
|
||||
if($w != '' && $w != 'u' && $w != 'r') {
|
||||
alert('올바른 방법으로 이용해 주십시오.');
|
||||
}
|
||||
@@ -30,7 +32,7 @@ if(is_file($skin_file)) {
|
||||
|
||||
if($w == 'u' || $w == 'r') {
|
||||
$sql = " select * from {$g5['qa_content_table']} where qa_id = '$qa_id' ";
|
||||
if(!$is_admin) {
|
||||
if($is_admin !== 'super') {
|
||||
$sql .= " and mb_id = '{$member['mb_id']}' ";
|
||||
}
|
||||
|
||||
@@ -40,7 +42,7 @@ if(is_file($skin_file)) {
|
||||
if(!$write['qa_id'])
|
||||
alert('게시글이 존재하지 않습니다.\\n삭제되었거나 자신의 글이 아닌 경우입니다.');
|
||||
|
||||
if(!$is_admin) {
|
||||
if($is_admin !== 'super') {
|
||||
if($write['qa_type'] == 0 && $write['qa_status'] == 1)
|
||||
alert('답변이 등록된 문의글은 수정할 수 없습니다.');
|
||||
|
||||
@@ -117,7 +119,7 @@ if(is_file($skin_file)) {
|
||||
if($w == '' || $w == 'r')
|
||||
$write['qa_email'] = $member['mb_email'];
|
||||
|
||||
if($w == 'u' && $is_admin && $write['qa_type'])
|
||||
if($w == 'u' && $is_admin === 'super' && $write['qa_type'])
|
||||
$is_email = false;
|
||||
}
|
||||
|
||||
@@ -132,7 +134,7 @@ if(is_file($skin_file)) {
|
||||
if($w == '' || $w == 'r')
|
||||
$write['qa_hp'] = $member['mb_hp'];
|
||||
|
||||
if($w == 'u' && $is_admin && $write['qa_type'])
|
||||
if($w == 'u' && $is_admin === 'super' && $write['qa_type'])
|
||||
$is_hp = false;
|
||||
}
|
||||
|
||||
@@ -145,4 +147,4 @@ if(is_file($skin_file)) {
|
||||
echo '<div>'.str_replace(G5_PATH.'/', '', $skin_file).'이 존재하지 않습니다.</div>';
|
||||
}
|
||||
|
||||
include_once('./qatail.php');
|
||||
include_once('./qatail.php');
|
||||
|
||||
+17
-5
@@ -1,6 +1,8 @@
|
||||
<?php
|
||||
include_once('./_common.php');
|
||||
|
||||
$is_admin = get_super_admin_type($is_admin);
|
||||
|
||||
/*==========================
|
||||
$w == a : 답변
|
||||
$w == r : 추가질문
|
||||
@@ -98,11 +100,12 @@ for ($i=1; $i<=5; $i++) {
|
||||
}
|
||||
|
||||
if($w == 'u' || $w == 'a' || $w == 'r') {
|
||||
if($w == 'a' && !$is_admin)
|
||||
if($w == 'a' && $is_admin !== 'super')
|
||||
alert('답변은 관리자만 등록할 수 있습니다.');
|
||||
|
||||
$sql = " select * from {$g5['qa_content_table']} where qa_id = '$qa_id' ";
|
||||
if(!$is_admin) {
|
||||
// 최고관리자가 아니면 본인 문의만 대상으로 (게시판/그룹 관리자 문맥으로 우회 불가)
|
||||
if($is_admin !== 'super') {
|
||||
$sql .= " and mb_id = '{$member['mb_id']}' ";
|
||||
}
|
||||
|
||||
@@ -112,7 +115,7 @@ if($w == 'u' || $w == 'a' || $w == 'r') {
|
||||
if(!$write['qa_id'])
|
||||
alert('게시글이 존재하지 않습니다.\\n삭제되었거나 자신의 글이 아닌 경우입니다.');
|
||||
|
||||
if(!$is_admin) {
|
||||
if($is_admin !== 'super') {
|
||||
if($write['qa_type'] == 0 && $write['qa_status'] == 1)
|
||||
alert('답변이 등록된 문의글은 수정할 수 없습니다.');
|
||||
|
||||
@@ -130,6 +133,15 @@ if($w == 'u' || $w == 'a' || $w == 'r') {
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($_FILES['bf_file']['name']) && is_array($_FILES['bf_file']['name'])) {
|
||||
foreach ($_FILES['bf_file']['name'] as $filename) {
|
||||
$filename = get_safe_filename($filename);
|
||||
if (is_disallowed_svg_filename($filename)) {
|
||||
alert('허용되지 않는 파일 확장자입니다. (svg, svgz)');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 파일개수 체크
|
||||
$file_count = 0;
|
||||
$upload_count = isset($_FILES['bf_file']['name']) ? count($_FILES['bf_file']['name']) : 0;
|
||||
@@ -184,8 +196,8 @@ for ($i=1; $i<=$upload_count; $i++) {
|
||||
}
|
||||
|
||||
if (is_uploaded_file($tmp_file)) {
|
||||
// 관리자가 아니면서 설정한 업로드 사이즈보다 크다면 건너뜀
|
||||
if (!$is_admin && $filesize > $qaconfig['qa_upload_size']) {
|
||||
// 최고관리자가 아니면서 설정한 업로드 사이즈보다 크다면 건너뜀
|
||||
if ($is_admin !== 'super' && $filesize > $qaconfig['qa_upload_size']) {
|
||||
$file_upload_msg .= '"'.$filename.'" 파일의 용량('.number_format($filesize).' 바이트)이 게시판에 설정('.number_format($qaconfig['qa_upload_size']).' 바이트)된 값보다 크므로 업로드 하지 않습니다.\\n';
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -74,6 +74,10 @@ $mb_addr2 = addslashes(clean_xss_tags(stripslashes($mb_addr2), 1, 1));
|
||||
$mb_addr3 = addslashes(clean_xss_tags(stripslashes($mb_addr3), 1, 1));
|
||||
$mb_addr_jibeon = preg_match("/^(N|R|J)$/", $mb_addr_jibeon) ? $mb_addr_jibeon : '';
|
||||
|
||||
for ($i = 1; $i <= 10; $i++) {
|
||||
${'mb_' . $i} = addslashes(clean_xss_tags(stripslashes(${'mb_' . $i}), 1, 1));
|
||||
}
|
||||
|
||||
$mb_marketing_agree = isset($_POST['mb_marketing_agree']) ? trim($_POST['mb_marketing_agree']) : "0";
|
||||
$mb_thirdparty_agree = isset($_POST['mb_thirdparty_agree']) ? trim($_POST['mb_thirdparty_agree']) : "0";
|
||||
|
||||
@@ -642,6 +646,8 @@ if($w == '' && isset($default['de_member_reg_coupon_use']) && $default['de_membe
|
||||
if($j > 20)
|
||||
break;
|
||||
}
|
||||
|
||||
$j++;
|
||||
} while(1);
|
||||
|
||||
if($create_coupon) {
|
||||
|
||||
@@ -137,6 +137,15 @@ for ($i=1; $i<=10; $i++) {
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($_FILES['bf_file']['name']) && is_array($_FILES['bf_file']['name'])) {
|
||||
foreach ($_FILES['bf_file']['name'] as $filename) {
|
||||
$filename = get_safe_filename($filename);
|
||||
if (is_disallowed_svg_filename($filename)) {
|
||||
alert('허용되지 않는 파일 확장자입니다. (svg, svgz)');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@include_once($board_skin_path.'/write_update.head.skin.php');
|
||||
|
||||
run_event('write_update_before', $board, $wr_id, $w, $qstr);
|
||||
|
||||
@@ -125,6 +125,10 @@ $_REQUEST = array_map_deep(G5_ESCAPE_FUNCTION, $_REQUEST);
|
||||
|
||||
// PHP 4.1.0 부터 지원됨
|
||||
// php.ini 의 register_globals=off 일 경우
|
||||
|
||||
// 관리자 메뉴 코드는 각 스크립트가 직접 지정하므로 요청값이 개입하지 못하게 한다.
|
||||
unset($_GET['sub_menu'], $_POST['sub_menu'], $_REQUEST['sub_menu'], $_SERVER['sub_menu']);
|
||||
|
||||
@extract($_GET);
|
||||
@extract($_POST);
|
||||
@extract($_SERVER);
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// 자바스크립트와 CSS 파일을 새로 다운로드 하도록 파일의 끝에 년월일 지정
|
||||
// 예) https://도메인/css/default.css?ver=220620
|
||||
// 예) https://도메인/js/common.js?ver=220620
|
||||
define('G5_CSS_VER', '2303229');
|
||||
define('G5_JS_VER', '2605291');
|
||||
+6
-6
@@ -58,11 +58,11 @@ if($config['cf_add_meta'])
|
||||
<?php
|
||||
if (defined('G5_IS_ADMIN')) {
|
||||
if(!defined('_THEME_PREVIEW_'))
|
||||
echo '<link rel="stylesheet" href="'.run_replace('head_css_url', G5_ADMIN_URL.'/css/admin.css?ver='.G5_CSS_VER, G5_URL).'">'.PHP_EOL;
|
||||
echo '<link rel="stylesheet" href="'.get_versioned_asset_url(run_replace('head_css_url', G5_ADMIN_URL.'/css/admin.css', G5_URL)).'">'.PHP_EOL;
|
||||
} else {
|
||||
$shop_css = '';
|
||||
if (defined('_SHOP_')) $shop_css = '_shop';
|
||||
echo '<link rel="stylesheet" href="'.run_replace('head_css_url', G5_CSS_URL.'/'.(G5_IS_MOBILE?'mobile':'default').$shop_css.'.css?ver='.G5_CSS_VER, G5_URL).'">'.PHP_EOL;
|
||||
echo '<link rel="stylesheet" href="'.get_versioned_asset_url(run_replace('head_css_url', G5_CSS_URL.'/'.(G5_IS_MOBILE?'mobile':'default').$shop_css.'.css', G5_URL)).'">'.PHP_EOL;
|
||||
}
|
||||
?>
|
||||
<!--[if lte IE 8]>
|
||||
@@ -91,13 +91,13 @@ add_javascript('<script src="'.G5_JS_URL.'/jquery-1.12.4.min.js"></script>', 0);
|
||||
add_javascript('<script src="'.G5_JS_URL.'/jquery-migrate-1.4.1.min.js"></script>', 0);
|
||||
if (defined('_SHOP_')) {
|
||||
if(!G5_IS_MOBILE) {
|
||||
add_javascript('<script src="'.G5_JS_URL.'/jquery.shop.menu.js?ver='.G5_JS_VER.'"></script>', 0);
|
||||
add_javascript('<script src="'.G5_JS_URL.'/jquery.shop.menu.js"></script>', 0);
|
||||
}
|
||||
} else {
|
||||
add_javascript('<script src="'.G5_JS_URL.'/jquery.menu.js?ver='.G5_JS_VER.'"></script>', 0);
|
||||
add_javascript('<script src="'.G5_JS_URL.'/jquery.menu.js"></script>', 0);
|
||||
}
|
||||
add_javascript('<script src="'.G5_JS_URL.'/common.js?ver='.G5_JS_VER.'"></script>', 0);
|
||||
add_javascript('<script src="'.G5_JS_URL.'/wrest.js?ver='.G5_JS_VER.'"></script>', 0);
|
||||
add_javascript('<script src="'.G5_JS_URL.'/common.js"></script>', 0);
|
||||
add_javascript('<script src="'.G5_JS_URL.'/wrest.js"></script>', 0);
|
||||
add_javascript('<script src="'.G5_JS_URL.'/placeholders.min.js"></script>', 0);
|
||||
add_stylesheet('<link rel="stylesheet" href="'.G5_JS_URL.'/font-awesome/css/font-awesome.min.css">', 0);
|
||||
|
||||
|
||||
@@ -354,6 +354,14 @@ CREATE TABLE IF NOT EXISTS `g5_shop_default` (
|
||||
`de_inicis_iniapi_key` varchar(30) NOT NULL DEFAULT '',
|
||||
`de_inicis_iniapi_iv` varchar(30) NOT NULL DEFAULT '',
|
||||
`de_inicis_sign_key` varchar(255) NOT NULL DEFAULT '',
|
||||
`de_inicis_pro_use` tinyint(4) NOT NULL DEFAULT '0',
|
||||
`de_inicis_hash_key` varchar(255) NOT NULL DEFAULT '',
|
||||
`de_inicis_pro_alert_use` tinyint(4) NOT NULL DEFAULT '1',
|
||||
`de_inicis_pro_reconcile_use` tinyint(4) NOT NULL DEFAULT '0',
|
||||
`de_inicis_pro_log_days` int(11) NOT NULL DEFAULT '365',
|
||||
`de_inicis_pro_summary_days` int(11) NOT NULL DEFAULT '1825',
|
||||
`de_inicis_pro_monitor_at` datetime DEFAULT NULL,
|
||||
`de_inicis_pro_monitor_message` varchar(255) NOT NULL DEFAULT '',
|
||||
`de_iche_use` tinyint(4) NOT NULL DEFAULT '0',
|
||||
`de_easy_pay_use` tinyint(4) NOT NULL DEFAULT '0',
|
||||
`de_easy_pay_services` varchar(255) NOT NULL DEFAULT '',
|
||||
@@ -888,3 +896,92 @@ CREATE TABLE IF NOT EXISTS `g5_shop_inicis_log` (
|
||||
`is_mail_send` tinyint(4) NOT NULL DEFAULT '1',
|
||||
PRIMARY KEY (`oid`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `g5_shop_inicis_pay`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `g5_shop_inicis_pay`;
|
||||
CREATE TABLE IF NOT EXISTS `g5_shop_inicis_pay` (
|
||||
`ip_id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`ip_oid` varchar(64) NOT NULL DEFAULT '',
|
||||
`ip_tid` varchar(80) NOT NULL DEFAULT '',
|
||||
`ip_auth_tid` varchar(80) NOT NULL DEFAULT '',
|
||||
`ip_mid` varchar(80) NOT NULL DEFAULT '',
|
||||
`ip_environment` varchar(10) NOT NULL DEFAULT '',
|
||||
`mb_id` varchar(20) NOT NULL DEFAULT '',
|
||||
`ip_amount` int(11) NOT NULL DEFAULT '0',
|
||||
`ip_pay_type` varchar(20) NOT NULL DEFAULT '',
|
||||
`ip_easy_pay` varchar(20) NOT NULL DEFAULT '',
|
||||
`ip_device` varchar(10) NOT NULL DEFAULT '',
|
||||
`ip_order_type` varchar(10) NOT NULL DEFAULT '',
|
||||
`ip_status` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_result_code` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_result_message` varchar(255) NOT NULL DEFAULT '',
|
||||
`ip_noti_status` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_noti_code` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_noti_message` varchar(255) NOT NULL DEFAULT '',
|
||||
`ip_noti_failed_count` int(11) NOT NULL DEFAULT '0',
|
||||
`ip_noti_at` datetime DEFAULT NULL,
|
||||
`ip_cancel_status` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_cancel_code` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_cancel_message` varchar(255) NOT NULL DEFAULT '',
|
||||
`ip_cancel_checked_at` datetime DEFAULT NULL,
|
||||
`ip_refund_required` tinyint(4) NOT NULL DEFAULT '0',
|
||||
`ip_vbank_due_at` datetime DEFAULT NULL,
|
||||
`ip_expired_at` datetime DEFAULT NULL,
|
||||
`ip_order_exists` tinyint(4) NOT NULL DEFAULT '0',
|
||||
`ip_approved_at` datetime DEFAULT NULL,
|
||||
`ip_ordered_at` datetime DEFAULT NULL,
|
||||
`ip_notified_at` datetime DEFAULT NULL,
|
||||
`ip_canceled_at` datetime DEFAULT NULL,
|
||||
`ip_created_at` datetime DEFAULT NULL,
|
||||
`ip_updated_at` datetime DEFAULT NULL,
|
||||
`ip_ip` varchar(45) NOT NULL DEFAULT '',
|
||||
`ip_event_count` int(11) NOT NULL DEFAULT '0',
|
||||
`ip_audit_error` tinyint(4) NOT NULL DEFAULT '0',
|
||||
`ip_alerted_at` datetime DEFAULT NULL,
|
||||
`ip_alert_key` varchar(64) NOT NULL DEFAULT '',
|
||||
`ip_pg_status` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_pg_amount` int(11) NOT NULL DEFAULT '0',
|
||||
`ip_pg_tid` varchar(80) NOT NULL DEFAULT '',
|
||||
`ip_pg_result_code` varchar(30) NOT NULL DEFAULT '',
|
||||
`ip_pg_message` varchar(255) NOT NULL DEFAULT '',
|
||||
`ip_pg_checked_at` datetime DEFAULT NULL,
|
||||
PRIMARY KEY (`ip_id`),
|
||||
UNIQUE KEY `ip_oid` (`ip_oid`),
|
||||
KEY `ip_tid` (`ip_tid`),
|
||||
KEY `ip_auth_tid` (`ip_auth_tid`),
|
||||
KEY `ip_status` (`ip_status`),
|
||||
KEY `ip_noti_status` (`ip_noti_status`),
|
||||
KEY `ip_cancel_status` (`ip_cancel_status`),
|
||||
KEY `ip_refund_required` (`ip_refund_required`),
|
||||
KEY `ip_updated_at` (`ip_updated_at`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Table structure for table `g5_shop_inicis_pay_event`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `g5_shop_inicis_pay_event`;
|
||||
CREATE TABLE IF NOT EXISTS `g5_shop_inicis_pay_event` (
|
||||
`pe_id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`ip_oid` varchar(64) NOT NULL DEFAULT '',
|
||||
`ip_tid` varchar(80) NOT NULL DEFAULT '',
|
||||
`pe_stage` varchar(30) NOT NULL DEFAULT '',
|
||||
`pe_status` varchar(30) NOT NULL DEFAULT '',
|
||||
`pe_code` varchar(30) NOT NULL DEFAULT '',
|
||||
`pe_message` varchar(255) NOT NULL DEFAULT '',
|
||||
`pe_source` varchar(10) NOT NULL DEFAULT '',
|
||||
`pe_ip` varchar(45) NOT NULL DEFAULT '',
|
||||
`pe_created_at` datetime DEFAULT NULL,
|
||||
PRIMARY KEY (`pe_id`),
|
||||
KEY `ip_oid` (`ip_oid`),
|
||||
KEY `ip_tid` (`ip_tid`),
|
||||
KEY `pe_status` (`pe_status`),
|
||||
KEY `pe_created_at` (`pe_created_at`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
@@ -660,6 +660,8 @@ if($g5_shop_install) {
|
||||
install_file_write($f, "\$g5['g5_shop_post_log_table'] = G5_SHOP_TABLE_PREFIX.'order_post_log'; // 주문요청 로그 테이블\n");
|
||||
install_file_write($f, "\$g5['g5_shop_order_data_table'] = G5_SHOP_TABLE_PREFIX.'order_data'; // 모바일 결제정보 임시저장 테이블\n");
|
||||
install_file_write($f, "\$g5['g5_shop_inicis_log_table'] = G5_SHOP_TABLE_PREFIX.'inicis_log'; // 이니시스 모바일 계좌이체 로그 테이블\n");
|
||||
install_file_write($f, "\$g5['g5_shop_inicis_pay_table'] = G5_SHOP_TABLE_PREFIX.'inicis_pay'; // 이니시스 결제 처리 현황 테이블\n");
|
||||
install_file_write($f, "\$g5['g5_shop_inicis_pay_event_table'] = G5_SHOP_TABLE_PREFIX.'inicis_pay_event'; // 이니시스 결제 처리 이력 테이블\n");
|
||||
}
|
||||
|
||||
install_file_write($f, "?>");
|
||||
|
||||
+91
-1
@@ -59,6 +59,72 @@ function trim(s)
|
||||
return t;
|
||||
}
|
||||
|
||||
// SVG/SVGZ 업로드 파일 차단
|
||||
function is_disallowed_svg_filename(filename)
|
||||
{
|
||||
// 서버의 파일명 정규화와 동일하게 특수문자를 제거
|
||||
filename = (filename || "").replace(/[\0"'<>=#&!%\\()*+?]/g, "");
|
||||
filename = filename.substring(filename.lastIndexOf("/") + 1);
|
||||
filename = filename.replace(/[ .\t\n\r\v]+$/, "");
|
||||
|
||||
return /\.(svg|svgz)$/i.test(filename);
|
||||
}
|
||||
|
||||
function is_svg_upload_target(input)
|
||||
{
|
||||
var name = input.name || "";
|
||||
|
||||
if (name.indexOf("bf_file[") === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (input.form && input.form.name == "fformmail" && (name == "file1" || name == "file2")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return input.form && input.form.name == "fconfig" &&
|
||||
(name == "logo_img" || name == "logo_img2" || name == "mobile_logo_img" || name == "mobile_logo_img2");
|
||||
}
|
||||
|
||||
function has_disallowed_svg_file(input)
|
||||
{
|
||||
var i;
|
||||
|
||||
if (input.files && input.files.length) {
|
||||
for (i=0; i<input.files.length; i++) {
|
||||
if (is_disallowed_svg_filename(input.files[i].name)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return is_disallowed_svg_filename(input.value);
|
||||
}
|
||||
|
||||
function check_disallowed_svg_upload(form)
|
||||
{
|
||||
var invalid_file = null;
|
||||
|
||||
$(form).find("input[type=file]").each(function() {
|
||||
if (is_svg_upload_target(this) && has_disallowed_svg_file(this)) {
|
||||
invalid_file = this;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if (!invalid_file) {
|
||||
return true;
|
||||
}
|
||||
|
||||
alert("허용되지 않는 파일 확장자입니다. (svg, svgz)");
|
||||
$(form).find("input:submit, button:submit, input:image").prop("disabled", false);
|
||||
invalid_file.focus();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// 자바스크립트로 PHP의 number_format 흉내를 냄
|
||||
// 숫자에 , 를 출력
|
||||
function number_format(data)
|
||||
@@ -728,6 +794,30 @@ function get_write_token(bo_table)
|
||||
}
|
||||
|
||||
$(function() {
|
||||
$(document).on("change", "input[type=file]", function() {
|
||||
if (!is_svg_upload_target(this) || !has_disallowed_svg_file(this)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
alert("허용되지 않는 파일 확장자입니다. (svg, svgz)");
|
||||
this.value = "";
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
if (document.addEventListener) {
|
||||
document.addEventListener("submit", function(event) {
|
||||
if (!check_disallowed_svg_upload(event.target)) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
}, true);
|
||||
} else {
|
||||
$(document).on("submit", "form", function() {
|
||||
return check_disallowed_svg_upload(this);
|
||||
});
|
||||
}
|
||||
|
||||
$(document).on("click", "form[name=fwrite] input:submit, form[name=fwrite] button:submit, form[name=fwrite] input:image", function() {
|
||||
var f = this.form;
|
||||
|
||||
@@ -752,4 +842,4 @@ $(function() {
|
||||
|
||||
return true;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
+143
-6
@@ -20,6 +20,13 @@ function get_microtime()
|
||||
}
|
||||
|
||||
|
||||
// 게시판/그룹 관리자 문맥을 제외하고 최고관리자 권한만 반환
|
||||
function get_super_admin_type($admin_type)
|
||||
{
|
||||
return $admin_type === 'super' ? 'super' : '';
|
||||
}
|
||||
|
||||
|
||||
// 한페이지에 보여줄 행, 현재페이지, 총페이지수, URL
|
||||
function get_paging($write_pages, $cur_page, $total_page, $url, $add="")
|
||||
{
|
||||
@@ -924,6 +931,8 @@ function get_write($write_table, $wr_id, $is_cache=false)
|
||||
{
|
||||
global $g5, $g5_object;
|
||||
|
||||
$wr_id = (int) $wr_id;
|
||||
|
||||
$wr_bo_table = preg_replace('/^'.preg_quote($g5['write_prefix']).'/i', '', $write_table);
|
||||
|
||||
$write = $g5_object->get('bbs', $wr_id, $wr_bo_table);
|
||||
@@ -3239,6 +3248,90 @@ function add_javascript($javascript, $order=0)
|
||||
get_html_process_cls()->merge_javascript($javascript, $order);
|
||||
}
|
||||
|
||||
// 로컬 정적 자산 URL에 파일 수정시간을 버전으로 추가
|
||||
function get_versioned_asset_url($url)
|
||||
{
|
||||
if (!is_string($url) || $url === '' || !defined('G5_PATH') || G5_PATH === '') {
|
||||
return $url;
|
||||
}
|
||||
|
||||
$asset_url = preg_replace('/[?#].*$/', '', $url);
|
||||
$g5_url = defined('G5_URL') ? rtrim(G5_URL, '/') : '';
|
||||
$relative_path = '';
|
||||
|
||||
if ($g5_url !== '' && strpos($asset_url, $g5_url.'/') === 0) {
|
||||
$relative_path = substr($asset_url, strlen($g5_url) + 1);
|
||||
} else {
|
||||
if (preg_match('#^[a-z][a-z0-9+.-]*://#i', $asset_url) || strpos($asset_url, '//') === 0 || substr($asset_url, 0, 1) !== '/') {
|
||||
return $url;
|
||||
}
|
||||
|
||||
$g5_url_path = $g5_url !== '' ? parse_url($g5_url, PHP_URL_PATH) : '';
|
||||
$g5_url_path = rtrim((string) $g5_url_path, '/');
|
||||
|
||||
if ($g5_url_path !== '') {
|
||||
if (strpos($asset_url, $g5_url_path.'/') !== 0) {
|
||||
return $url;
|
||||
}
|
||||
|
||||
$relative_path = substr($asset_url, strlen($g5_url_path) + 1);
|
||||
} else {
|
||||
$relative_path = ltrim($asset_url, '/');
|
||||
}
|
||||
}
|
||||
|
||||
$relative_path = str_replace('\\', '/', rawurldecode($relative_path));
|
||||
if ($relative_path === '' || strpos($relative_path, "\0") !== false) {
|
||||
return $url;
|
||||
}
|
||||
|
||||
$root_path = @realpath(G5_PATH);
|
||||
$file_path = @realpath(G5_PATH.'/'.$relative_path);
|
||||
if ($root_path === false || $file_path === false || !is_file($file_path)) {
|
||||
return $url;
|
||||
}
|
||||
|
||||
$root_path = rtrim(str_replace('\\', '/', $root_path), '/');
|
||||
$file_path = str_replace('\\', '/', $file_path);
|
||||
if (strpos($file_path, $root_path.'/') !== 0) {
|
||||
return $url;
|
||||
}
|
||||
|
||||
$filetime = @filemtime($file_path);
|
||||
if ($filetime === false) {
|
||||
return $url;
|
||||
}
|
||||
|
||||
$fragment = '';
|
||||
$fragment_pos = strpos($url, '#');
|
||||
if ($fragment_pos !== false) {
|
||||
$fragment = substr($url, $fragment_pos);
|
||||
$url = substr($url, 0, $fragment_pos);
|
||||
}
|
||||
|
||||
if (preg_match('/([?&](?:amp;)?)ver=[^&#]*/i', $url)) {
|
||||
$url = preg_replace('/([?&](?:amp;)?)ver=[^&#]*/i', '${1}ver='.$filetime, $url, 1);
|
||||
} else {
|
||||
$url .= (strpos($url, '?') === false ? '?' : '&').'ver='.$filetime;
|
||||
}
|
||||
|
||||
return $url.$fragment;
|
||||
}
|
||||
|
||||
function _callback_version_asset_url($matches)
|
||||
{
|
||||
return $matches[1].get_versioned_asset_url($matches[2]).$matches[3];
|
||||
}
|
||||
|
||||
function add_filetime_version_to_html($html)
|
||||
{
|
||||
return preg_replace_callback(
|
||||
'~(<(?:script|link)\b[^>]*\b(?:src|href)\s*=\s*[\'"])([^\'"]+?\.(?:js|css)(?:[?#][^\'"]*)?)([\'"])~i',
|
||||
'_callback_version_asset_url',
|
||||
$html
|
||||
);
|
||||
}
|
||||
|
||||
class html_process {
|
||||
protected static $id = '0';
|
||||
private static $instances = array();
|
||||
@@ -3298,8 +3391,6 @@ class html_process {
|
||||
// 현재접속자 처리
|
||||
$tmp_sql = " select count(*) as cnt from {$g5['login_table']} where lo_ip = '{$_SERVER['REMOTE_ADDR']}' ";
|
||||
$tmp_row = sql_fetch($tmp_sql);
|
||||
$http_host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];
|
||||
|
||||
if (!isset($member['mb_id'])) {
|
||||
$member['mb_id'] = '';
|
||||
}
|
||||
@@ -3340,7 +3431,7 @@ class html_process {
|
||||
if(!trim($link[1]))
|
||||
continue;
|
||||
|
||||
$link[1] = preg_replace('#\.css([\'\"]?>)$#i', '.css?ver='.G5_CSS_VER.'$1', $link[1]);
|
||||
$link[1] = add_filetime_version_to_html($link[1]);
|
||||
|
||||
$stylesheet .= PHP_EOL.$link[1];
|
||||
}
|
||||
@@ -3367,9 +3458,8 @@ class html_process {
|
||||
foreach($scripts as $js) {
|
||||
if(!trim($js[1]))
|
||||
continue;
|
||||
|
||||
$add_version_str = (stripos($js[1], $http_host) !== false) ? '?ver='.G5_JS_VER : '';
|
||||
$js[1] = preg_replace('#\.js([\'\"]?>)<\/script>$#i', '.js'.$add_version_str.'$1</script>', $js[1]);
|
||||
|
||||
$js[1] = add_filetime_version_to_html($js[1]);
|
||||
|
||||
$javascript .= $php_eol.$js[1];
|
||||
$php_eol = PHP_EOL;
|
||||
@@ -4002,6 +4092,26 @@ function get_safe_filename($name)
|
||||
return $name;
|
||||
}
|
||||
|
||||
// 업로드 파일명이 SVG 또는 SVGZ 확장자인지 확인
|
||||
function is_disallowed_svg_filename($filename)
|
||||
{
|
||||
if (!is_string($filename) || $filename === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
$filename = str_replace(array("\0", '\\'), array('', '/'), $filename);
|
||||
$filename = basename($filename);
|
||||
$filename = rtrim($filename, " .\t\n\r\0\x0B");
|
||||
|
||||
if ($filename === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
$extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
|
||||
|
||||
return in_array($extension, array('svg', 'svgz'), true);
|
||||
}
|
||||
|
||||
// 파일명 치환
|
||||
function replace_filename($name)
|
||||
{
|
||||
@@ -4851,6 +4961,33 @@ function filter_input_include_path($path){
|
||||
return str_replace('//', '/', strip_tags($path));
|
||||
}
|
||||
|
||||
// 콘텐츠 상단/하단 include 대상이 템플릿 파일인지 실행 직전 재확인한다.
|
||||
// 승인 확장자만 허용하고, 업로드가 저장되는 data 디렉터리로 귀결되는 경로는 거부한다.
|
||||
function is_content_include_allowed($path){
|
||||
if( !is_string($path) || $path === '' ){
|
||||
return false;
|
||||
}
|
||||
|
||||
$ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));
|
||||
if( !in_array($ext, array('php', 'htm', 'html')) ){
|
||||
return false;
|
||||
}
|
||||
|
||||
$real = @realpath($path);
|
||||
if( $real !== false && defined('G5_DATA_PATH') ){
|
||||
$data_real = @realpath(G5_DATA_PATH);
|
||||
if( $data_real !== false ){
|
||||
$real_norm = str_replace('\\', '/', $real);
|
||||
$data_norm = rtrim(str_replace('\\', '/', $data_real), '/').'/';
|
||||
if( strpos($real_norm, $data_norm) === 0 ){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function option_array_checked($option, $arr=array()){
|
||||
$checked = '';
|
||||
|
||||
|
||||
+78
-20
@@ -26,11 +26,51 @@ function get_shop_uid($type, $id, $time, $ip)
|
||||
return hash_hmac('sha256', $payload, $key);
|
||||
}
|
||||
|
||||
/**
|
||||
* 상품 목록 정렬 요청을 허용된 DB 컬럼과 방향으로 변환한다.
|
||||
*
|
||||
* @param mixed $sort 외부 정렬 키
|
||||
* @param mixed $sortodr 외부 정렬 방향
|
||||
* @return array 검증된 정렬 컬럼과 방향. 잘못된 입력이면 모두 빈 문자열
|
||||
*/
|
||||
function get_shop_item_sort($sort, $sortodr)
|
||||
{
|
||||
$sort_columns = array(
|
||||
'it_name' => 'it_name',
|
||||
'it_sum_qty' => 'it_sum_qty',
|
||||
'it_price' => 'it_price',
|
||||
'it_use_avg' => 'it_use_avg',
|
||||
'it_use_cnt' => 'it_use_cnt',
|
||||
'it_update_time' => 'it_update_time',
|
||||
);
|
||||
|
||||
if (!is_string($sort) || !isset($sort_columns[$sort])) {
|
||||
return array('', '');
|
||||
}
|
||||
|
||||
if (!is_string($sortodr)) {
|
||||
return array('', '');
|
||||
}
|
||||
|
||||
$sortodr = strtolower($sortodr);
|
||||
if (!in_array($sortodr, array('asc', 'desc'), true)) {
|
||||
return array('', '');
|
||||
}
|
||||
|
||||
return array($sort_columns[$sort], $sortodr);
|
||||
}
|
||||
|
||||
// 쇼핑몰 리소스 소유자 또는 최고관리자인지 확인
|
||||
function is_shop_resource_owner_or_super_admin($owner_id, $member_id, $admin_type)
|
||||
{
|
||||
return $admin_type === 'super' || ($member_id !== '' && $owner_id === $member_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 현금영수증 발급 또는 조회에 대한 검증
|
||||
*
|
||||
* 다음 셋 중 하나여야 접근 허용:
|
||||
* 1. 관리자
|
||||
* 1. 최고관리자 (게시판/그룹 관리자 권한은 제외)
|
||||
* 2. 본인 주문/개인결제 (로그인 회원이고 mb_id 일치)
|
||||
* 3. 비회원이지만 정당한 세션 uid 보유 (orderinquiry.php에서 비밀번호 검증 통과 후
|
||||
* 또는 주문 완료 직후 세션에 저장된 ss_orderview_uid / ss_personalpay_uid가
|
||||
@@ -48,8 +88,9 @@ function is_shop_order_owner($od, $type = 'order')
|
||||
return false;
|
||||
}
|
||||
|
||||
// 관리자
|
||||
if ($is_admin) {
|
||||
// 최고관리자만 전체 주문/개인결제 접근 허용
|
||||
// (요청 bo_table 로 좌우되는 게시판/그룹 관리자 문맥은 인정하지 않음)
|
||||
if ($is_admin === 'super') {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1021,7 +1062,7 @@ function session_check()
|
||||
global $g5;
|
||||
|
||||
if (!trim(get_session('ss_uniqid')))
|
||||
gotourl(G5_SHOP_URL);
|
||||
goto_url(G5_SHOP_URL);
|
||||
}
|
||||
|
||||
// 상품 선택옵션
|
||||
@@ -1353,14 +1394,16 @@ function get_list_skin_options($pattern, $dirname='./', $sval='')
|
||||
{
|
||||
$str = '<option value="">선택</option>'.PHP_EOL;
|
||||
|
||||
unset($arr);
|
||||
$handle = opendir($dirname);
|
||||
while ($file = readdir($handle)) {
|
||||
if (preg_match("/$pattern/", $file, $matches)) {
|
||||
$arr[] = $matches[0];
|
||||
$arr = array();
|
||||
$handle = @opendir($dirname);
|
||||
if ($handle !== false) {
|
||||
while (false !== ($file = readdir($handle))) {
|
||||
if (preg_match("/$pattern/", $file, $matches)) {
|
||||
$arr[] = $matches[0];
|
||||
}
|
||||
}
|
||||
closedir($handle);
|
||||
}
|
||||
closedir($handle);
|
||||
|
||||
sort($arr);
|
||||
foreach($arr as $value) {
|
||||
@@ -1631,17 +1674,32 @@ function get_coupon_id()
|
||||
{
|
||||
$len = 16;
|
||||
$chars = "ABCDEFGHJKLMNPQRSTUVWXYZ123456789";
|
||||
|
||||
srand((double)microtime()*1000000);
|
||||
|
||||
$i = 0;
|
||||
$chars_len = strlen($chars);
|
||||
$str = '';
|
||||
|
||||
while ($i < $len) {
|
||||
$num = rand() % strlen($chars);
|
||||
$tmp = substr($chars, $num, 1);
|
||||
$str .= $tmp;
|
||||
$i++;
|
||||
if (function_exists('get_random_token_string')) {
|
||||
// 문자 종류 수로 나누어 떨어지는 구간만 사용하여 특정 문자에 치우치지 않도록 한다.
|
||||
$limit = 256 - (256 % $chars_len);
|
||||
$round = 0;
|
||||
|
||||
while (strlen($str) < $len && $round < 8) {
|
||||
$bytes = pack('H*', get_random_token_string($len + 8));
|
||||
$bytes_len = strlen($bytes);
|
||||
|
||||
for ($i = 0; $i < $bytes_len && strlen($str) < $len; $i++) {
|
||||
$num = ord($bytes[$i]);
|
||||
if ($num >= $limit)
|
||||
continue;
|
||||
|
||||
$str .= substr($chars, $num % $chars_len, 1);
|
||||
}
|
||||
|
||||
$round++;
|
||||
}
|
||||
}
|
||||
|
||||
while (strlen($str) < $len) {
|
||||
$str .= substr($chars, mt_rand(0, $chars_len - 1), 1);
|
||||
}
|
||||
|
||||
$str = preg_replace("/([0-9A-Z]{4})([0-9A-Z]{4})([0-9A-Z]{4})([0-9A-Z]{4})/", "\\1-\\2-\\3-\\4", $str);
|
||||
@@ -2076,7 +2134,7 @@ function check_itemuse_write($it_id, $mb_id, $close=true)
|
||||
{
|
||||
global $g5, $default, $is_admin;
|
||||
|
||||
if(!$is_admin && $default['de_item_use_write'])
|
||||
if($is_admin !== 'super' && $default['de_item_use_write'])
|
||||
{
|
||||
$sql = " select count(*) as cnt
|
||||
from {$g5['g5_shop_cart_table']}
|
||||
|
||||
+9
-15
@@ -1,20 +1,14 @@
|
||||
<?php
|
||||
include_once('../../common.php');
|
||||
|
||||
// SQL 주석 토큰 차단 추가 — 데스크톱 shop/_common.php 와 동일 패턴
|
||||
if (isset($_REQUEST['sort']) && !preg_match("/(--|#|\/\*|\*\/)/", $_REQUEST['sort'])) {
|
||||
$sort = trim($_REQUEST['sort']);
|
||||
$sort = preg_replace("/[\<\>\'\"\\\'\\\"\%\=\(\)\s]/", "", $sort);
|
||||
} else {
|
||||
$sort = '';
|
||||
}
|
||||
|
||||
if (isset($_REQUEST['sortodr'])) {
|
||||
$sortodr = preg_match("/^(asc|desc)$/i", $sortodr) ? $sortodr : '';
|
||||
} else {
|
||||
$sortodr = '';
|
||||
}
|
||||
|
||||
if (!defined('G5_USE_SHOP') || !G5_USE_SHOP)
|
||||
die('<p>쇼핑몰 설치 후 이용해 주십시오.</p>');
|
||||
define('_SHOP_', true);
|
||||
|
||||
$is_admin = get_super_admin_type($is_admin);
|
||||
|
||||
$request_sort = (isset($_REQUEST['sort']) && is_string($_REQUEST['sort'])) ? $_REQUEST['sort'] : '';
|
||||
$request_sortodr = (isset($_REQUEST['sortodr']) && is_string($_REQUEST['sortodr'])) ? $_REQUEST['sortodr'] : '';
|
||||
list($sort, $sortodr) = get_shop_item_sort($request_sort, $request_sortodr);
|
||||
unset($request_sort, $request_sortodr);
|
||||
|
||||
define('_SHOP_', true);
|
||||
|
||||
@@ -36,8 +36,8 @@ $result = sql_query($sql);
|
||||
$cart_count = sql_num_rows($result);
|
||||
?>
|
||||
|
||||
<script src="<?php echo G5_JS_URL; ?>/shop.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||
<script src="<?php echo G5_JS_URL; ?>/shop.override.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||
<script src="<?php echo get_versioned_asset_url(G5_JS_URL.'/shop.js'); ?>"></script>
|
||||
<script src="<?php echo get_versioned_asset_url(G5_JS_URL.'/shop.override.js'); ?>"></script>
|
||||
|
||||
<div id="sod_bsk">
|
||||
|
||||
|
||||
@@ -93,4 +93,4 @@ echo '<div id="sev_thtml">'.conv_content($ev['ev_tail_html'], 1).'</div>';
|
||||
</div>
|
||||
|
||||
<?php
|
||||
include_once(G5_MSHOP_PATH.'/_tail.php');
|
||||
include_once(G5_MSHOP_PATH.'/_tail.php');
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
<?php
|
||||
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
|
||||
|
||||
if (!empty($inicis_pro_use)) {
|
||||
require(G5_SHOP_PATH.'/inicis/pro/orderform.1.php');
|
||||
return;
|
||||
}
|
||||
|
||||
if(!function_exists('get_inicis_app_scheme')){
|
||||
function get_inicis_app_scheme(){
|
||||
$user_agent = $_SERVER['HTTP_USER_AGENT'];
|
||||
@@ -56,4 +61,4 @@ if(!function_exists('get_inicis_app_scheme')){
|
||||
<input type="hidden" name="P_TAX" value="">
|
||||
<input type="hidden" name="P_TAXFREE" value="">
|
||||
<?php } ?>
|
||||
</form>
|
||||
</form>
|
||||
|
||||
@@ -203,7 +203,7 @@ echo run_replace('shop_it_mobile_head_html', '<div id="sit_hhtml">'.conv_content
|
||||
?>
|
||||
|
||||
<?php if($is_orderable) { ?>
|
||||
<script src="<?php echo G5_JS_URL; ?>/shop.js?ver=<?php echo G5_JS_VER; ?>"></script>
|
||||
<script src="<?php echo get_versioned_asset_url(G5_JS_URL.'/shop.js'); ?>"></script>
|
||||
<?php } ?>
|
||||
|
||||
<?php
|
||||
|
||||
@@ -31,7 +31,7 @@ if ($w == "u")
|
||||
|
||||
$it_id = $qa['it_id'];
|
||||
|
||||
if (!$is_admin && $qa['mb_id'] != $member['mb_id']) {
|
||||
if (!is_shop_resource_owner_or_super_admin($qa['mb_id'], $member['mb_id'], $is_admin)) {
|
||||
alert_close("자신의 상품문의만 수정이 가능합니다.");
|
||||
}
|
||||
|
||||
@@ -59,4 +59,4 @@ if(!file_exists($itemqaform_skin)) {
|
||||
include_once($itemqaform_skin);
|
||||
}
|
||||
|
||||
include_once(G5_PATH.'/tail.sub.php');
|
||||
include_once(G5_PATH.'/tail.sub.php');
|
||||
|
||||
@@ -29,7 +29,7 @@ if ($w == "") {
|
||||
$it_id = $use['it_id'];
|
||||
$is_score = $use['is_score'];
|
||||
|
||||
if (!$is_admin && $use['mb_id'] != $member['mb_id']) {
|
||||
if (!is_shop_resource_owner_or_super_admin($use['mb_id'], $member['mb_id'], $is_admin)) {
|
||||
alert_close("자신의 사용후기만 수정이 가능합니다.");
|
||||
}
|
||||
}
|
||||
@@ -54,4 +54,4 @@ if(!file_exists($itemuseform_skin)) {
|
||||
include_once($itemuseform_skin);
|
||||
}
|
||||
|
||||
include_once(G5_PATH.'/tail.sub.php');
|
||||
include_once(G5_PATH.'/tail.sub.php');
|
||||
|
||||
@@ -168,9 +168,10 @@
|
||||
{
|
||||
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
|
||||
{
|
||||
$bin_exe = $home_dir.'/bin/pp_cli_exe ';
|
||||
// 실행 파일 경로와 인자를 분리하여 mf_exec 호출 → escapeshellarg 자동 적용
|
||||
$bin_exe = $home_dir.'/bin/pp_cli_exe';
|
||||
|
||||
$res_data = $this->mf_exec($bin_exe . "\"".
|
||||
$res_data = $this->mf_exec($bin_exe,
|
||||
"site_cd=" . $site_cd . "," .
|
||||
"site_key=" . $site_key . "," .
|
||||
"tx_cd=" . $tx_cd . "," .
|
||||
@@ -188,8 +189,7 @@
|
||||
$ordr_data .
|
||||
$rcvr_data .
|
||||
$escw_data .
|
||||
$modx_data .
|
||||
"\"") ;
|
||||
$modx_data) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -276,21 +276,27 @@
|
||||
return $my_data;
|
||||
}
|
||||
|
||||
function mf_exec()
|
||||
function mf_build_exec_cmd( $arg )
|
||||
{
|
||||
$arg = func_get_args();
|
||||
|
||||
if ( is_array( $arg[0] ) ) $arg = $arg[0];
|
||||
|
||||
$exec_cmd = array_shift( $arg );
|
||||
|
||||
foreach($arg as $i)
|
||||
foreach((array) $arg as $key=>$i)
|
||||
{
|
||||
$exec_cmd .= " " . escapeshellarg( $i );
|
||||
}
|
||||
|
||||
return $exec_cmd;
|
||||
}
|
||||
|
||||
function mf_exec()
|
||||
{
|
||||
$arg = func_get_args();
|
||||
$exec_cmd = $this->mf_build_exec_cmd( $arg );
|
||||
|
||||
$rt = exec( $exec_cmd );
|
||||
|
||||
return $rt;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,11 +11,6 @@ if(defined('G5_THEME_MSHOP_PATH')) {
|
||||
unset($theme_list_file);
|
||||
}
|
||||
|
||||
// 상품 리스트에서 다른 필드로 정렬을 하려면 아래의 배열 코드에서 해당 필드를 추가하세요.
|
||||
if( isset($sort) && ! in_array($sort, array('it_name', 'it_sum_qty', 'it_price', 'it_use_avg', 'it_use_cnt', 'it_update_time')) ){
|
||||
$sort='';
|
||||
}
|
||||
|
||||
$sql = " select *
|
||||
from {$g5['g5_shop_category_table']}
|
||||
where ca_id = '$ca_id'
|
||||
@@ -200,4 +195,4 @@ var g5_shop_url = "<?php echo G5_SHOP_URL; ?>";
|
||||
<?php
|
||||
include_once(G5_MSHOP_PATH.'/_tail.php');
|
||||
|
||||
echo "\n<!-- {$ca['ca_mobile_skin']} -->\n";
|
||||
echo "\n<!-- {$ca['ca_mobile_skin']} -->\n";
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
<?php
|
||||
include_once('./_common.php');
|
||||
|
||||
// 상품 정렬 컬럼 화이트리스트 — 데스크톱 shop/listtype.php 와 동일 패턴
|
||||
$sort = (isset($_REQUEST['sort']) && in_array($_REQUEST['sort'], array('it_name', 'it_sum_qty', 'it_price', 'it_use_avg', 'it_use_cnt', 'it_update_time'))) ? $_REQUEST['sort'] : '';
|
||||
|
||||
$type = isset($_REQUEST['type']) ? (int) preg_replace("/[^0-9]/", "", $_REQUEST['type']) : 1;
|
||||
if ($type === 1) $g5['title'] = '히트상품';
|
||||
else if ($type === 2) $g5['title'] = '추천상품';
|
||||
@@ -78,4 +75,4 @@ echo get_paging($config['cf_mobile_pages'], $page, $total_page, "{$_SERVER['SCRI
|
||||
?>
|
||||
|
||||
<?php
|
||||
include_once(G5_MSHOP_PATH.'/_tail.php');
|
||||
include_once(G5_MSHOP_PATH.'/_tail.php');
|
||||
|
||||
@@ -16,14 +16,23 @@ $txTid = isset($_POST['TxTid']) ? clean_xss_tags($_POST['TxTid']) : ''; //
|
||||
$authToken = isset($_POST['AuthToken']) ? clean_xss_tags($_POST['AuthToken']) : ''; // authentication TOKEN
|
||||
$payMethod = isset($_POST['PayMethod']) ? clean_xss_tags($_POST['PayMethod']) : ''; // payment method
|
||||
$mid = isset($_POST['MID']) ? clean_xss_tags($_POST['MID']) : ''; // merchant id
|
||||
$moid = isset($_POST['Moid']) ? addslashes(clean_xss_tags(stripslashes($_POST['Moid']))) : ''; // order number
|
||||
$amt = isset($_POST['Amt']) ? (int) preg_replace('/[^0-9]/', '', $_POST['Amt']) : 0; // Amount of payment
|
||||
$reqReserved = isset($_POST['ReqReserved']) ? clean_xss_tags($_POST['ReqReserved']) : ''; // mall custom field
|
||||
$netCancelURL = isset($_POST['NetCancelURL']) ? clean_xss_tags($_POST['NetCancelURL']) : ''; // netCancelURL
|
||||
|
||||
if (isset($pp['pp_id']) && $pp['pp_id']) { //개인결제
|
||||
$session_order_id = get_session('ss_personalpay_id');
|
||||
$order_price = (int) $pp['pp_price'];
|
||||
$moid = isset($_POST['Moid']) ? addslashes(clean_xss_tags(stripslashes($_POST['Moid']))) : ''; // order number
|
||||
$amt = isset($_POST['Amt']) ? (int) preg_replace('/[^0-9]/', '', $_POST['Amt']) : 0; // Amount of payment
|
||||
$reqReserved = isset($_POST['ReqReserved']) ? clean_xss_tags($_POST['ReqReserved']) : ''; // mall custom field
|
||||
$netCancelURL = isset($_POST['NetCancelURL']) ? clean_xss_tags($_POST['NetCancelURL']) : ''; // netCancelURL
|
||||
$Signature = isset($_POST['Signature']) ? clean_xss_tags($_POST['Signature']) : ''; // authentication signature
|
||||
|
||||
if($authResultCode !== "0000"){
|
||||
//When authentication fail
|
||||
$ResultCode = $authResultCode;
|
||||
$ResultMsg = $authResultMsg;
|
||||
|
||||
alert($ResultMsg.' 실패 코드 : '.$ResultCode);
|
||||
}
|
||||
|
||||
if (isset($pp['pp_id']) && $pp['pp_id']) { //개인결제
|
||||
$session_order_id = get_session('ss_personalpay_id');
|
||||
$order_price = (int) $pp['pp_price'];
|
||||
} else {
|
||||
$session_order_id = get_session('ss_order_id'); // 쇼핑몰 일반결제
|
||||
}
|
||||
@@ -36,12 +45,12 @@ if ($default['de_nicepay_mid'] != $mid) {
|
||||
alert("요청한 상점 mid와 설정된 mid가 틀리므로 결제를 진행할수 없습니다.", G5_SHOP_URL);
|
||||
}
|
||||
|
||||
if ($order_price != $amt) {
|
||||
alert("요청한 결제금액이 틀리므로 결제를 진행할수 없습니다.", G5_SHOP_URL);
|
||||
}
|
||||
|
||||
// API CALL foreach example
|
||||
if (! function_exists('jsonRespDump')) {
|
||||
if ($order_price != $amt) {
|
||||
alert("요청한 결제금액이 틀리므로 결제를 진행할수 없습니다.", G5_SHOP_URL);
|
||||
}
|
||||
|
||||
// API CALL foreach example
|
||||
if (! function_exists('jsonRespDump')) {
|
||||
function jsonRespDump($resp){
|
||||
$respArr = json_decode($resp);
|
||||
foreach ( $respArr as $key => $value ){
|
||||
@@ -50,13 +59,27 @@ if (! function_exists('jsonRespDump')) {
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('nicepay_res')) {
|
||||
function nicepay_res($key, $data, $default_val='') {
|
||||
$response_val = isset($data[$key]) ? $data[$key] : $default_val;
|
||||
|
||||
return ($response_val ? $response_val : $default_val);
|
||||
}
|
||||
}
|
||||
if (! function_exists('nicepay_res')) {
|
||||
function nicepay_res($key, $data, $default_val='') {
|
||||
$response_val = isset($data[$key]) ? $data[$key] : $default_val;
|
||||
|
||||
return ($response_val ? $response_val : $default_val);
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('nicepay_expected_pay_result')) {
|
||||
function nicepay_expected_pay_result($settle_case) {
|
||||
$pay_results = array(
|
||||
'신용카드' => array('PayMethod'=>'CARD', 'ResultCode'=>'3001'),
|
||||
'간편결제' => array('PayMethod'=>'CARD', 'ResultCode'=>'3001'),
|
||||
'계좌이체' => array('PayMethod'=>'BANK', 'ResultCode'=>'4000'),
|
||||
'가상계좌' => array('PayMethod'=>'VBANK', 'ResultCode'=>'4100'),
|
||||
'휴대폰' => array('PayMethod'=>'CELLPHONE', 'ResultCode'=>'A000')
|
||||
);
|
||||
|
||||
return isset($pay_results[$settle_case]) ? $pay_results[$settle_case] : false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
****************************************************************************************
|
||||
@@ -65,10 +88,25 @@ if (! function_exists('nicepay_res')) {
|
||||
*/
|
||||
$response = "";
|
||||
|
||||
if($authResultCode === "0000"){
|
||||
/*
|
||||
****************************************************************************************
|
||||
* <Hash encryption> (do not modify)
|
||||
if($authResultCode === "0000"){
|
||||
// hex(sha256(AuthToken+MID+Amt+MerchantKey)), 위변조 검증 데이터
|
||||
$authSignData = bin2hex(hash('sha256', $authToken. $default['de_nicepay_mid'] . $order_price . $default['de_nicepay_key'], true));
|
||||
|
||||
if ($Signature != $authSignData) {
|
||||
alert("유효성 검증이 틀려서 결제를 진행할수 없습니다.");
|
||||
}
|
||||
|
||||
if (! nicepay_is_allowed_api_url($nextAppURL, array('/webapi/pay_process.jsp'))) {
|
||||
alert("승인 요청 url이 올바르지 않습니다.", G5_SHOP_URL);
|
||||
}
|
||||
|
||||
if (! nicepay_is_allowed_api_url($netCancelURL, array('/webapi/cancel_process.jsp'))) {
|
||||
alert("망취소 요청 url이 올바르지 않습니다.", G5_SHOP_URL);
|
||||
}
|
||||
|
||||
/*
|
||||
****************************************************************************************
|
||||
* <Hash encryption> (do not modify)
|
||||
****************************************************************************************
|
||||
*/
|
||||
$ediDate = preg_replace('/[^0-9]/', '', G5_TIME_YMDHIS);
|
||||
@@ -97,28 +135,95 @@ if($authResultCode === "0000"){
|
||||
// A000 : 휴대폰 소액결제 성공코드
|
||||
// 7001 : 현금영수증
|
||||
// https://developers.nicepay.co.kr/manual-auth.php
|
||||
*/
|
||||
$response = nicepay_reqPost($data, $nextAppURL);
|
||||
$respArr = json_decode($response, true);
|
||||
|
||||
$ResultCode = nicepay_res('ResultCode', $respArr);
|
||||
$ResultMsg = nicepay_res('ResultMsg', $respArr);
|
||||
$tno = nicepay_res('TID', $respArr);
|
||||
$amount = (int) nicepay_res('Amt', $respArr, 0);
|
||||
$app_time = nicepay_res('AuthDate', $respArr);
|
||||
$pay_method = nicepay_res('PayMethod', $respArr);
|
||||
$od_app_no = $app_no = nicepay_res('AuthCode', $respArr); // 승인 번호 (신용카드, 계좌이체, 휴대폰)
|
||||
$pay_type = $NICEPAY_METHOD[$pay_method];
|
||||
|
||||
// 승인된 코드가 아니면 결제가 되지 않게 합니다.
|
||||
if (! in_array($ResultCode, array('3001', '4000', '4100', 'A000', '7001'))) {
|
||||
alert($ResultMsg.' 코드 : '.$ResultCode, G5_SHOP_URL);
|
||||
die();
|
||||
}
|
||||
|
||||
if ($ResultCode == '3001') { // 신용카드
|
||||
|
||||
$card_cd = nicepay_res('CardCode', $respArr); // 카드사 코드
|
||||
*/
|
||||
$response = nicepay_reqPost($data, $nextAppURL);
|
||||
|
||||
if (! $response) {
|
||||
alert('응답이 없거나 잘못된 url 입니다.', G5_SHOP_URL);
|
||||
}
|
||||
|
||||
$respArr = json_decode($response, true);
|
||||
|
||||
$ResultCode = nicepay_res('ResultCode', $respArr);
|
||||
$ResultMsg = nicepay_res('ResultMsg', $respArr);
|
||||
$tno = nicepay_res('TID', $respArr);
|
||||
$response_amt = nicepay_res('Amt', $respArr, 0);
|
||||
$response_mid = nicepay_res('MID', $respArr);
|
||||
$response_moid = nicepay_res('Moid', $respArr);
|
||||
$amount = (int) $response_amt;
|
||||
$app_time = nicepay_res('AuthDate', $respArr);
|
||||
$pay_method = nicepay_res('PayMethod', $respArr);
|
||||
$od_app_no = $app_no = nicepay_res('AuthCode', $respArr); // 승인 번호 (신용카드, 계좌이체, 휴대폰)
|
||||
$pay_type = isset($NICEPAY_METHOD[$pay_method]) ? $NICEPAY_METHOD[$pay_method] : '';
|
||||
|
||||
// 승인된 코드가 아니면 결제가 되지 않게 합니다.
|
||||
if (! in_array($ResultCode, array('3001', '4000', '4100', 'A000', '7001'))) {
|
||||
alert($ResultMsg.' 코드 : '.$ResultCode, G5_SHOP_URL);
|
||||
die();
|
||||
}
|
||||
|
||||
$responseSignature = nicepay_res('Signature', $respArr);
|
||||
$responseSignData = bin2hex(hash('sha256', $tno . $mid . $response_amt . $merchantKey, true));
|
||||
|
||||
if ($responseSignature != $responseSignData) {
|
||||
if($amount > 0 && $tno) {
|
||||
$od_id = $moid;
|
||||
$cancel_msg = '승인 응답 유효성 검증 실패';
|
||||
$cancelAmt = $amount;
|
||||
$partialCancelCode = 0;
|
||||
include G5_SHOP_PATH.'/nicepay/cancel_process.php';
|
||||
}
|
||||
|
||||
alert("승인 응답 유효성 검증이 틀려서 결제를 진행할수 없습니다.", G5_SHOP_URL);
|
||||
}
|
||||
|
||||
if ($response_mid != $mid || $response_moid != $moid) {
|
||||
if($amount > 0) {
|
||||
$od_id = $moid;
|
||||
$cancel_msg = '승인 응답 주문정보 불일치';
|
||||
$cancelAmt = $amount;
|
||||
$partialCancelCode = 0;
|
||||
include G5_SHOP_PATH.'/nicepay/cancel_process.php';
|
||||
}
|
||||
|
||||
alert("승인 응답 주문정보가 틀려서 결제를 진행할수 없습니다.", G5_SHOP_URL);
|
||||
}
|
||||
|
||||
if ($amount != $order_price) {
|
||||
if($amount > 0) {
|
||||
$od_id = $moid;
|
||||
$cancel_msg = '결제금액 불일치';
|
||||
$cancelAmt = $amount;
|
||||
$partialCancelCode = 0;
|
||||
include G5_SHOP_PATH.'/nicepay/cancel_process.php';
|
||||
}
|
||||
|
||||
alert("승인된 결제금액이 틀리므로 결제를 진행할수 없습니다.", G5_SHOP_URL);
|
||||
}
|
||||
|
||||
$nicepay_settle_case = '';
|
||||
if (isset($pp['pp_id']) && $pp['pp_id'] && isset($pp_settle_case)) {
|
||||
$nicepay_settle_case = $pp_settle_case;
|
||||
} else if (isset($od_settle_case)) {
|
||||
$nicepay_settle_case = $od_settle_case;
|
||||
}
|
||||
|
||||
$expected_pay_result = nicepay_expected_pay_result($nicepay_settle_case);
|
||||
if ($expected_pay_result && ($pay_method !== $expected_pay_result['PayMethod'] || $ResultCode !== $expected_pay_result['ResultCode'])) {
|
||||
if($amount > 0 && $tno) {
|
||||
$od_id = $moid;
|
||||
$cancel_msg = '결제수단 불일치';
|
||||
$cancelAmt = $amount;
|
||||
$partialCancelCode = 0;
|
||||
include G5_SHOP_PATH.'/nicepay/cancel_process.php';
|
||||
}
|
||||
|
||||
alert("선택한 결제수단과 승인된 결제수단이 일치하지 않아 결제를 진행할수 없습니다.", G5_SHOP_URL);
|
||||
}
|
||||
|
||||
if ($ResultCode == '3001') { // 신용카드
|
||||
|
||||
$card_cd = nicepay_res('CardCode', $respArr); // 카드사 코드
|
||||
$card_name = nicepay_res('CardName', $respArr); // 카드 종류
|
||||
|
||||
} else if ($ResultCode == '4100') { // 가상계좌
|
||||
|
||||
@@ -71,10 +71,11 @@ function nicepay_create_signdata(frm)
|
||||
var result = true;
|
||||
$.ajax({
|
||||
url: g5_url+"/shop/nicepay/createsigndata.php",
|
||||
type: "POST",
|
||||
data: {
|
||||
price : frm.good_mny.value
|
||||
},
|
||||
type: "POST",
|
||||
data: {
|
||||
price : frm.good_mny.value,
|
||||
moid : frm.Moid ? frm.Moid.value : ''
|
||||
},
|
||||
dataType: "json",
|
||||
async: false,
|
||||
cache: false,
|
||||
@@ -137,4 +138,4 @@ function nicepay_create_signdata(frm)
|
||||
<input type="hidden" name="comm_vat_mny" value="<?php echo $comm_vat_mny; ?>"> <!-- 부가세 -->
|
||||
<input type="hidden" name="comm_free_mny" value="<?php echo $comm_free_mny; ?>"> <!-- 비과세 금액 -->
|
||||
<?php } ?>
|
||||
</form>
|
||||
</form>
|
||||
|
||||
@@ -3,12 +3,46 @@ include_once('./_common.php');
|
||||
include_once(G5_MSHOP_PATH.'/settle_nicepay.inc.php');
|
||||
|
||||
$authResultCode = isset($_POST['AuthResultCode']) ? clean_xss_tags($_POST['AuthResultCode']) : ''; // authentication result code 0000:success
|
||||
$authResultMsg = isset($_POST['AuthResultMsg']) ? clean_xss_tags($_POST['AuthResultMsg']) : ''; // authentication result message
|
||||
$mid = isset($_POST['MID']) ? clean_xss_tags($_POST['MID']) : ''; // merchant id
|
||||
$moid = isset($_POST['Moid']) ? addslashes(clean_xss_tags(stripslashes($_POST['Moid']))) : ''; // order number
|
||||
|
||||
$sql = " select * from {$g5['g5_shop_order_data_table']} where od_id = '$moid' ";
|
||||
$row = sql_fetch($sql);
|
||||
$authResultMsg = isset($_POST['AuthResultMsg']) ? clean_xss_tags($_POST['AuthResultMsg']) : ''; // authentication result message
|
||||
$mid = isset($_POST['MID']) ? clean_xss_tags($_POST['MID']) : ''; // merchant id
|
||||
$moid = isset($_POST['Moid']) ? addslashes(clean_xss_tags(stripslashes($_POST['Moid']))) : ''; // order number
|
||||
|
||||
$session_order_id = get_session('ss_order_id');
|
||||
$session_personalpay_id = get_session('ss_personalpay_id');
|
||||
|
||||
if ($authResultCode !== '0000') {
|
||||
$page_return_url = G5_SHOP_URL;
|
||||
|
||||
if ($moid && ($session_order_id == $moid || $session_personalpay_id == $moid)) {
|
||||
$sql = " select * from {$g5['g5_shop_order_data_table']} where od_id = '$moid' and dt_pg = 'nicepay' ";
|
||||
$row = sql_fetch($sql);
|
||||
|
||||
if (!empty($row)) {
|
||||
$data = unserialize(base64_decode($row['dt_data']));
|
||||
|
||||
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(isset($_SESSION['ss_direct']) && $_SESSION['ss_direct'])
|
||||
$page_return_url .= '?sw_direct=1';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
alert('오류 : '.$authResultMsg.' 코드 : '.$authResultCode, $page_return_url);
|
||||
}
|
||||
|
||||
if ($default['de_nicepay_mid'] != $mid) {
|
||||
alert("요청한 상점 mid와 설정된 mid가 틀리므로 결제를 진행할수 없습니다.", G5_SHOP_URL);
|
||||
}
|
||||
|
||||
if (!$moid || ($session_order_id != $moid && $session_personalpay_id != $moid)) {
|
||||
alert("요청한 주문번호가 틀려서 결제를 진행할수 없습니다.", G5_SHOP_URL);
|
||||
}
|
||||
|
||||
$sql = " select * from {$g5['g5_shop_order_data_table']} where od_id = '$moid' and dt_pg = 'nicepay' ";
|
||||
$row = sql_fetch($sql);
|
||||
|
||||
if (empty($row)) {
|
||||
die('');
|
||||
@@ -19,12 +53,12 @@ $data = unserialize(base64_decode($row['dt_data']));
|
||||
if(isset($data['pp_id']) && $data['pp_id']) {
|
||||
$order_action_url = G5_HTTPS_MSHOP_URL.'/personalpayformupdate.php';
|
||||
$page_return_url = G5_SHOP_URL.'/personalpayform.php?pp_id='.$data['pp_id'];
|
||||
} else {
|
||||
$order_action_url = G5_HTTPS_MSHOP_URL.'/orderformupdate.php';
|
||||
$page_return_url = G5_SHOP_URL.'/orderform.php';
|
||||
if($_SESSION['ss_direct'])
|
||||
$page_return_url .= '?sw_direct=1';
|
||||
}
|
||||
} else {
|
||||
$order_action_url = G5_HTTPS_MSHOP_URL.'/orderformupdate.php';
|
||||
$page_return_url = G5_SHOP_URL.'/orderform.php';
|
||||
if(isset($_SESSION['ss_direct']) && $_SESSION['ss_direct'])
|
||||
$page_return_url .= '?sw_direct=1';
|
||||
}
|
||||
|
||||
$params = array();
|
||||
$var_datas = array();
|
||||
@@ -84,4 +118,4 @@ if ($authResultCode === '0000') {
|
||||
// 실패시
|
||||
|
||||
alert('오류 : '.$authResultMsg.' 코드 : '.$authResultCode, $page_return_url);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
require_once(G5_MSHOP_PATH.'/settle_'.$default['de_pg_service'].'.inc.php');
|
||||
require_once(G5_SHOP_PATH.'/settle_kakaopay.inc.php');
|
||||
|
||||
if( is_inicis_simple_pay() ){ //이니시스 삼성페이 또는 Lpay 사용시
|
||||
if( empty($inicis_pro_use) && is_inicis_simple_pay() ){ //이니시스 삼성페이 또는 Lpay 사용시
|
||||
require_once(G5_MSHOP_PATH.'/samsungpay/incSamsungpayCommon.php');
|
||||
}
|
||||
|
||||
@@ -265,7 +265,7 @@ ob_end_clean();
|
||||
// 결제대행사별 코드 include (결제등록 필드)
|
||||
require_once(G5_MSHOP_PATH.'/'.$default['de_pg_service'].'/orderform.1.php');
|
||||
|
||||
if( is_inicis_simple_pay() ){ //이니시스 삼성페이 또는 lpay 사용시
|
||||
if( empty($inicis_pro_use) && is_inicis_simple_pay() ){ //이니시스 삼성페이 또는 lpay 사용시
|
||||
require_once(G5_MSHOP_PATH.'/samsungpay/orderform.1.php');
|
||||
}
|
||||
|
||||
@@ -698,18 +698,21 @@ if($is_kakaopay_use) {
|
||||
|
||||
//이니시스 삼성페이
|
||||
if($default['de_samsung_pay_use']) {
|
||||
$multi_settle++;
|
||||
echo '<li><input type="radio" id="od_settle_samsungpay" data-case="samsungpay" name="od_settle_case" value="삼성페이" '.$checked.'> <label for="od_settle_samsungpay" class="samsung_pay lb_icon">삼성페이</label></li>'.PHP_EOL;
|
||||
$checked = '';
|
||||
}
|
||||
|
||||
//이니시스 Lpay
|
||||
if($default['de_inicis_lpay_use']) {
|
||||
$multi_settle++;
|
||||
echo '<li><input type="radio" id="od_settle_inicislpay" data-case="lpay" name="od_settle_case" value="lpay" '.$checked.'> <label for="od_settle_inicislpay" class="inicis_lpay">L.pay</label></li>'.PHP_EOL;
|
||||
$checked = '';
|
||||
}
|
||||
|
||||
//이니시스 카카오페이
|
||||
if($default['de_inicis_kakaopay_use']) {
|
||||
$multi_settle++;
|
||||
echo '<li><input type="radio" id="od_settle_inicis_kakaopay" data-case="inicis_kakaopay" name="od_settle_case" value="inicis_kakaopay" '.$checked.'> <label for="od_settle_inicis_kakaopay" title="KG 이니시스 카카오페이" class="inicis_kakaopay">KG 이니시스 카카오페이</label></li>'.PHP_EOL;
|
||||
$checked = '';
|
||||
}
|
||||
@@ -770,7 +773,7 @@ if($is_kakaopay_use) {
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
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() ) {
|
||||
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 '</div>';
|
||||
}
|
||||
|
||||
@@ -783,7 +786,7 @@ if($is_kakaopay_use) {
|
||||
// 결제대행사별 코드 include (결제대행사 정보 필드 및 주분버튼)
|
||||
require_once(G5_MSHOP_PATH.'/'.$default['de_pg_service'].'/orderform.2.php');
|
||||
|
||||
if( is_inicis_simple_pay() ){ //삼성페이 또는 L.pay 사용시
|
||||
if( empty($inicis_pro_use) && is_inicis_simple_pay() ){ //삼성페이 또는 L.pay 사용시
|
||||
require_once(G5_MSHOP_PATH.'/samsungpay/orderform.2.php');
|
||||
}
|
||||
|
||||
@@ -813,7 +816,7 @@ if($is_kakaopay_use) {
|
||||
// 결제대행사별 코드 include (에스크로 안내)
|
||||
require_once(G5_MSHOP_PATH.'/'.$default['de_pg_service'].'/orderform.3.php');
|
||||
|
||||
if( is_inicis_simple_pay() ){ //삼성페이 사용시
|
||||
if( empty($inicis_pro_use) && is_inicis_simple_pay() ){ //삼성페이 사용시
|
||||
require_once(G5_MSHOP_PATH.'/samsungpay/orderform.3.php');
|
||||
}
|
||||
}
|
||||
@@ -822,7 +825,7 @@ if($is_kakaopay_use) {
|
||||
</div>
|
||||
|
||||
<?php
|
||||
if( is_inicis_simple_pay() ){ //삼성페이 사용시
|
||||
if( empty($inicis_pro_use) && is_inicis_simple_pay() ){ //삼성페이 사용시
|
||||
require_once(G5_MSHOP_PATH.'/samsungpay/order.script.php');
|
||||
}
|
||||
|
||||
@@ -1201,7 +1204,7 @@ function calculate_order_price()
|
||||
var send_coupon = parseInt($("input[name=od_send_coupon]").val());
|
||||
var tot_price = sell_price + send_cost + send_cost2 - send_coupon;
|
||||
|
||||
$("form[name=sm_form] input[name=good_mny]").val(tot_price);
|
||||
$("form[name=sm_form] input[name=good_mny], form[name=forderform] input[name=good_mny]").val(tot_price);
|
||||
$("#od_tot_price").text(number_format(String(tot_price)));
|
||||
<?php if($temp_point > 0 && $is_member) { ?>
|
||||
calculate_temp_point();
|
||||
@@ -1318,6 +1321,9 @@ function pay_approval()
|
||||
var send_cost2 = parseInt(pf.od_send_cost2.value);
|
||||
var send_coupon = parseInt(pf.od_send_coupon.value);
|
||||
f.good_mny.value = od_price + send_cost + send_cost2 - send_coupon - temp_point;
|
||||
if(pf.good_mny) {
|
||||
pf.good_mny.value = f.good_mny.value;
|
||||
}
|
||||
}
|
||||
|
||||
// 카카오페이 지불
|
||||
@@ -1333,7 +1339,7 @@ function pay_approval()
|
||||
|
||||
var form_order_method = '';
|
||||
|
||||
if( settle_method == "삼성페이" || settle_method == "lpay" || settle_method == "inicis_kakaopay" ){
|
||||
if( (settle_method == "삼성페이" || settle_method == "lpay" || settle_method == "inicis_kakaopay") && <?php echo !empty($inicis_pro_use) ? 'false' : 'true'; ?> ){
|
||||
form_order_method = 'samsungpay';
|
||||
} else if(settle_method == "간편결제") {
|
||||
if(jQuery("input[name='od_settle_case']:checked" ).attr("data-pay") === "naverpay"){
|
||||
@@ -1479,6 +1485,7 @@ function pay_approval()
|
||||
f.windowTarget.value = 'self';
|
||||
|
||||
<?php } else if($default['de_pg_service'] == 'inicis') { ?>
|
||||
<?php if (empty($inicis_pro_use)) { ?>
|
||||
var paymethod = "";
|
||||
var width = 330;
|
||||
var height = 480;
|
||||
@@ -1535,6 +1542,7 @@ function pay_approval()
|
||||
<?php } ?>
|
||||
f.P_RETURN_URL.value = "<?php echo $return_url.$od_id; ?>";
|
||||
f.action = "https://mobile.inicis.com/smart/" + paymethod + "/";
|
||||
<?php } ?>
|
||||
<?php } else if($default['de_pg_service'] == 'nicepay') { ?>
|
||||
|
||||
f.Amt.value = f.good_mny.value;
|
||||
@@ -1612,9 +1620,6 @@ function pay_approval()
|
||||
f.TaxFreeAmt.value = pf.comm_free_mny.value;
|
||||
<?php } ?>
|
||||
|
||||
if (! nicepay_create_signdata(f)) {
|
||||
return false;
|
||||
}
|
||||
<?php } ?>
|
||||
|
||||
// 주문 정보 임시저장
|
||||
@@ -1636,7 +1641,15 @@ function pay_approval()
|
||||
return false;
|
||||
}
|
||||
|
||||
<?php if ($default['de_pg_service'] == 'inicis' && !empty($inicis_pro_use)) { ?>
|
||||
return inicis_pro_pay("<?php echo $od_id; ?>", "MOBILE");
|
||||
<?php } ?>
|
||||
|
||||
<?php if ($default['de_pg_service'] == 'nicepay') { ?>
|
||||
if (! nicepay_create_signdata(f)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nicepayStart(f);
|
||||
return false;
|
||||
<?php } ?>
|
||||
@@ -1862,4 +1875,4 @@ $(function(){
|
||||
$("#od_hope_date").datepicker({ changeMonth: true, changeYear: true, dateFormat: "yy-mm-dd", showButtonPanel: true, yearRange: "c-99:c+99", minDate: "+<?php echo (int)$default['de_hope_date_after']; ?>d;", maxDate: "+<?php echo (int)$default['de_hope_date_after'] + 6; ?>d;" });
|
||||
});
|
||||
<?php } ?>
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -145,6 +145,11 @@ if($is_member) {
|
||||
for($i=0; $i<$it_cp_cnt; $i++) {
|
||||
$cid = isset($_POST['cp_id'][$i]) ? safe_replace_regex($_POST['cp_id'][$i], 'cp_id') : '';
|
||||
$it_id = isset($_POST['it_id'][$i]) ? safe_replace_regex($_POST['it_id'][$i], 'it_id') : '';
|
||||
|
||||
// 한 상품에는 상품쿠폰 하나만 적용 (동일 상품 반복 전송 무시)
|
||||
if(isset($arr_it_cp_prc[$it_id]))
|
||||
continue;
|
||||
|
||||
$sql = " select cp_id, cp_method, cp_target, cp_type, cp_price, cp_trunc, cp_minimum, cp_maximum
|
||||
from {$g5['g5_shop_coupon_table']}
|
||||
where cp_id = '$cid'
|
||||
@@ -347,6 +352,13 @@ $order_price = $tot_od_price + $send_cost + $send_cost2 - $tot_sc_cp_price - $od
|
||||
$od_status = '주문';
|
||||
$od_tno = '';
|
||||
|
||||
// PG사의 가상계좌 또는 계좌이체의 자동 현금영수증 초기배열값
|
||||
$pg_receipt_infos = array(
|
||||
'od_cash' => 0,
|
||||
'od_cash_no' => '',
|
||||
'od_cash_info' => '',
|
||||
);
|
||||
|
||||
if (function_exists('check_payment_method')) {
|
||||
check_payment_method($od_settle_case);
|
||||
}
|
||||
@@ -372,7 +384,10 @@ else if ($od_settle_case == "계좌이체")
|
||||
include G5_SHOP_PATH.'/toss/toss_result.php';
|
||||
break;
|
||||
case 'inicis':
|
||||
include G5_MSHOP_PATH.'/inicis/pay_result.php';
|
||||
if (!empty($_POST['inicis_pro']))
|
||||
include G5_SHOP_PATH.'/inicis/pro/pay_result.php';
|
||||
else
|
||||
include G5_MSHOP_PATH.'/inicis/pay_result.php';
|
||||
break;
|
||||
case 'nicepay':
|
||||
include G5_MSHOP_PATH.'/nicepay/nicepay_result.php';
|
||||
@@ -404,7 +419,10 @@ else if ($od_settle_case == "가상계좌")
|
||||
include G5_SHOP_PATH.'/toss/toss_result.php';
|
||||
break;
|
||||
case 'inicis':
|
||||
include G5_MSHOP_PATH.'/inicis/pay_result.php';
|
||||
if (!empty($_POST['inicis_pro']))
|
||||
include G5_SHOP_PATH.'/inicis/pro/pay_result.php';
|
||||
else
|
||||
include G5_MSHOP_PATH.'/inicis/pay_result.php';
|
||||
break;
|
||||
case 'nicepay':
|
||||
include G5_MSHOP_PATH.'/nicepay/nicepay_result.php';
|
||||
@@ -436,7 +454,10 @@ else if ($od_settle_case == "휴대폰")
|
||||
include G5_SHOP_PATH.'/toss/toss_result.php';
|
||||
break;
|
||||
case 'inicis':
|
||||
include G5_MSHOP_PATH.'/inicis/pay_result.php';
|
||||
if (!empty($_POST['inicis_pro']))
|
||||
include G5_SHOP_PATH.'/inicis/pro/pay_result.php';
|
||||
else
|
||||
include G5_MSHOP_PATH.'/inicis/pay_result.php';
|
||||
break;
|
||||
case 'nicepay':
|
||||
include G5_MSHOP_PATH.'/nicepay/nicepay_result.php';
|
||||
@@ -466,7 +487,10 @@ else if ($od_settle_case == "신용카드")
|
||||
include G5_SHOP_PATH.'/toss/toss_result.php';
|
||||
break;
|
||||
case 'inicis':
|
||||
include G5_MSHOP_PATH.'/inicis/pay_result.php';
|
||||
if (!empty($_POST['inicis_pro']))
|
||||
include G5_SHOP_PATH.'/inicis/pro/pay_result.php';
|
||||
else
|
||||
include G5_MSHOP_PATH.'/inicis/pay_result.php';
|
||||
break;
|
||||
case 'nicepay':
|
||||
include G5_MSHOP_PATH.'/nicepay/nicepay_result.php';
|
||||
@@ -498,7 +522,10 @@ else if ($od_settle_case == "간편결제")
|
||||
include G5_SHOP_PATH.'/toss/toss_result.php';
|
||||
break;
|
||||
case 'inicis':
|
||||
include G5_MSHOP_PATH.'/inicis/pay_result.php';
|
||||
if (!empty($_POST['inicis_pro']))
|
||||
include G5_SHOP_PATH.'/inicis/pro/pay_result.php';
|
||||
else
|
||||
include G5_MSHOP_PATH.'/inicis/pay_result.php';
|
||||
break;
|
||||
case 'nicepay':
|
||||
include G5_MSHOP_PATH.'/nicepay/nicepay_result.php';
|
||||
@@ -523,7 +550,10 @@ else if ($od_settle_case == "간편결제")
|
||||
else if ( is_inicis_order_pay($od_settle_case) ) //이니시스의 삼성페이 또는 L.pay 또는 이니시스 카카오페이
|
||||
{
|
||||
// 이니시스에서만 지원
|
||||
include G5_MSHOP_PATH.'/inicis/pay_result.php';
|
||||
if (!empty($_POST['inicis_pro']))
|
||||
include G5_SHOP_PATH.'/inicis/pro/pay_result.php';
|
||||
else
|
||||
include G5_MSHOP_PATH.'/inicis/pay_result.php';
|
||||
|
||||
$od_tno = $tno;
|
||||
$od_app_no = $app_no;
|
||||
@@ -676,6 +706,9 @@ $sql = " insert {$g5['g5_shop_order_table']}
|
||||
od_ip = '$REMOTE_ADDR',
|
||||
od_settle_case = '$od_settle_case',
|
||||
od_other_pay_type = '$od_other_pay_type',
|
||||
od_cash = '{$pg_receipt_infos['od_cash']}',
|
||||
od_cash_no = '{$pg_receipt_infos['od_cash_no']}',
|
||||
od_cash_info = '{$pg_receipt_infos['od_cash_info']}',
|
||||
od_test = '{$default['de_card_test']}'
|
||||
";
|
||||
$result = sql_query($sql, false);
|
||||
@@ -695,9 +728,9 @@ if(! $result && (isset($exists_order['od_id']) && $od_id && $exists_order['od_id
|
||||
// 주문정보 입력 오류시 결제 취소
|
||||
if(! $result || ! (isset($exists_order['od_id']) && $od_id && $exists_order['od_id'] === $od_id)) {
|
||||
if($tno) {
|
||||
$cancel_msg = '주문정보 입력 오류 : '.$sql;
|
||||
include G5_SHOP_PATH.'/cancel_pg.inc.php';
|
||||
}
|
||||
$cancel_msg = '주문정보 입력 오류';
|
||||
include G5_SHOP_PATH.'/cancel_pg.inc.php';
|
||||
}
|
||||
|
||||
// 관리자에게 오류 알림 메일발송
|
||||
$error = 'order';
|
||||
@@ -751,6 +784,9 @@ if(!$result) {
|
||||
die('<p>고객님의 주문 정보를 처리하는 중 오류가 발생해서 주문이 완료되지 않았습니다.</p><p>'.strtoupper($od_pg).'를 이용한 전자결제(신용카드, 계좌이체, 가상계좌 등)은 자동 취소되었습니다.');
|
||||
}
|
||||
|
||||
if (!empty($_POST['inicis_pro']) && function_exists('inicis_pro_audit_order_saved'))
|
||||
inicis_pro_audit_order_saved($od_id, $od_tno, 'order', 'mobile');
|
||||
|
||||
// 회원이면서 포인트를 사용했다면 포인트 테이블에 사용을 추가
|
||||
// 동시 주문 race condition 방지 — 회원 단위 GET_LOCK + 잔액 재조회
|
||||
if ($is_member && $od_receipt_point) {
|
||||
@@ -801,11 +837,16 @@ $od_memo = nl2br(htmlspecialchars2(stripslashes($od_memo))) . " ";
|
||||
$coupon_duplicate = false;
|
||||
if($is_member) {
|
||||
$it_cp_cnt = (isset($_POST['cp_id']) && is_array($_POST['cp_id'])) ? count($_POST['cp_id']) : 0;
|
||||
$arr_it_cp_logged = array();
|
||||
for($i=0; $i<$it_cp_cnt; $i++) {
|
||||
$cid = isset($_POST['cp_id'][$i]) ? safe_replace_regex($_POST['cp_id'][$i], 'cp_id') : '';
|
||||
$cp_it_id = isset($_POST['it_id'][$i]) ? safe_replace_regex($_POST['it_id'][$i], 'it_id') : '';
|
||||
$cp_prc = isset($arr_it_cp_prc[$cp_it_id]) ? (int) $arr_it_cp_prc[$cp_it_id] : 0;
|
||||
|
||||
// 한 상품에는 상품쿠폰 하나만 기록 (동일 상품 반복 전송 무시)
|
||||
if(isset($arr_it_cp_logged[$cp_it_id]))
|
||||
continue;
|
||||
|
||||
if(trim($cid)) {
|
||||
// 쿠폰 이중사용 방지: INSERT 직전 재확인
|
||||
if(is_used_coupon($member['mb_id'], $cid)) {
|
||||
@@ -827,6 +868,8 @@ if($is_member) {
|
||||
$coupon_duplicate = true;
|
||||
break;
|
||||
}
|
||||
|
||||
$arr_it_cp_logged[$cp_it_id] = true;
|
||||
}
|
||||
|
||||
// 쿠폰사용금액 cart에 기록
|
||||
@@ -1013,7 +1056,7 @@ set_session('ss_orderview_uid', $uid);
|
||||
$sql = " delete from {$g5['g5_shop_order_data_table']} where od_id = '$od_id' and dt_pg = '$od_pg' ";
|
||||
sql_query($sql);
|
||||
|
||||
if( $od_pg == 'inicis' && $od_tno ){
|
||||
if( $od_pg == 'inicis' && $od_tno && empty($_POST['inicis_pro']) ){
|
||||
$sql = "delete from {$g5['g5_shop_inicis_log_table']} where oid = '$od_id' and P_TID = '$od_tno' ";
|
||||
sql_query($sql, false);
|
||||
}
|
||||
|
||||
@@ -280,7 +280,7 @@ if($od['od_pg'] == 'lg') {
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">결제방식</th>
|
||||
<td><?php echo check_pay_name_replace($od['od_settle_case'], $od, 1); ?></td>
|
||||
<td><?php echo get_text(check_pay_name_replace($od['od_settle_case'], $od, 1)); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">결제금액</th>
|
||||
@@ -438,13 +438,17 @@ if($od['od_pg'] == 'lg') {
|
||||
$cash_receipt_script = 'javascript:showCashReceipts(\''.$LGD_MID.'\',\''.$od['od_id'].'\',\''.$od['od_casseqno'].'\',\''.$trade_type.'\',\''.$CST_PLATFORM.'\');';
|
||||
} else if($od['od_pg'] == 'toss') {
|
||||
$cash_receipt_script = 'window.open(\'https://dashboard.tosspayments.com/receipt/mids/si_'.$config['cf_lg_mid'].'/orders/'.$od['od_id'].'/cash-receipt?ref=dashboard\',\'receipt\',\'width=430,height=700\');';
|
||||
} else if($od['od_pg'] == 'inicis') {
|
||||
$cash = unserialize($od['od_cash_info']);
|
||||
$cash_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/Cash_mCmReceipt.jsp?noTid='.$cash['TID'].'&clpaymethod=22\',\'showreceipt\',\'width=380,height=540,scrollbars=no,resizable=no\');';
|
||||
} else if($od['od_pg'] == 'nicepay') {
|
||||
$cash_receipt_script = 'window.open(\'https://npg.nicepay.co.kr/issue/IssueLoader.do?type=1&TID='.$od['od_tno'].'&noMethod=1\',\'receipt\',\'width=430,height=700\');';
|
||||
} else {
|
||||
require_once G5_SHOP_PATH.'/settle_kcp.inc.php';
|
||||
} else if($od['od_pg'] == 'inicis') {
|
||||
$cash = unserialize($od['od_cash_info']);
|
||||
$cash_receipt_script = 'window.open(\'https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/Cash_mCmReceipt.jsp?noTid='.$cash['TID'].'&clpaymethod=22\',\'showreceipt\',\'width=380,height=540,scrollbars=no,resizable=no\');';
|
||||
} else if($od['od_pg'] == 'nicepay') {
|
||||
$cash = $od['od_cash_info'] ? unserialize($od['od_cash_info']) : array();
|
||||
if(!is_array($cash))
|
||||
$cash = array();
|
||||
$cash_tid = isset($cash['TID']) && $cash['TID'] ? $cash['TID'] : $od['od_tno'];
|
||||
$cash_receipt_script = 'window.open(\'https://npg.nicepay.co.kr/issue/IssueLoader.do?type=1&TID='.$cash_tid.'&noMethod=1\',\'receipt\',\'width=430,height=700\');';
|
||||
} else {
|
||||
require_once G5_SHOP_PATH.'/settle_kcp.inc.php';
|
||||
|
||||
$cash = unserialize($od['od_cash_info']);
|
||||
$cash_receipt_script = 'window.open(\''.G5_CASH_RECEIPT_URL.$default['de_kcp_mid'].'&orderid='.$od_id.'&bill_yn=Y&authno='.$cash['receipt_no'].'\', \'taxsave_receipt\', \'width=360,height=647,scrollbars=0,menus=0\');';
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user