Compare commits

...
75 Commits
Author SHA1 Message Date
thisgun 0b6f081f76 버전 5.6.34 수정 2026-07-24 07:14:18 +00:00
thisgunandClaude Fable 5 adbd9c3acc KG이니시스 PRO 현황 부분취소 전액환불 종결 판정 추가
- 부분취소 합계로 전액 환불되고 주문도 취소된 거래는 일치 상태로 판정
- 현황 목록 필터·KG 대사·관리자 알림에 동일 기준 적용

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 07:11:51 +00:00
thisgunandClaude Fable 5 8fcbd2a9b1 INIpay PRO 주문 전체취소 흐름 개선
- 부분취소 이력이 있는 주문은 잔여 금액을 부분취소로 처리해 전체취소 지원
- 부분취소로 전액 환불된 주문과 KG에서 이미 취소된 주문은 주문 취소만 진행
- PG 승인취소 미선택 시 차단하지 않고 주문만 취소하며 처리 내용을 이력에 기록
- 남은 품목 취소로 주문 전체가 취소되는 경우에도 PG 취소 여부 확인창 표시

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 07:11:51 +00:00
thisgunandClaude Fable 5 f8c06a26cb 관리자 부분취소 팝업 처리 오류 수정
- 팝업에서 admin.js와 토큰키를 로드해 처리 요청이 검증을 통과하도록 수정
- 금액 입력 유효성 검사의 필드명 오타 수정

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 07:11:51 +00:00
thisgunandClaude Fable 5 1fd5ec46ae KG이니시스 PRO 현황 안내 문구 정비
- 안내 문구의 로컬 표현을 영카트로 통일
- PG와 영카트 주문이 모두 취소 상태로 일치하면 조치 불필요 문구 출력

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 06:25:17 +00:00
thisgunandClaude Fable 5 cbd70fbe18 KG이니시스 상점관리자에서 먼저 취소한 INIpay PRO 주문의 전체취소 허용
- 전체취소 전에 KG 거래상태를 조회해 이미 취소된 거래이면 주문 취소만 진행
- 조회 결과와 처리 사유를 결제 현황 이력에 기록

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 06:25:17 +00:00
thisgunandClaude Fable 5 bc07b8383e KG이니시스 INIpay PRO 주문자 이메일 확인 후 전달
- 주문서/개인결제 결제 시작 시 이메일 형식을 확인해 잘못된 경우 안내 후 중단
- 결제창 요청에서는 확인된 이메일만 선택 항목으로 전달해 결제가 막히지 않게 처리

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 06:25:17 +00:00
thisgunandClaude Opus 4.8 23c60a8ba1 SMS 아이코드 신청 링크 최신 경로로 교체
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 05:28:15 +00:00
thisgunandClaude Opus 4.8 abb777016d 부가서비스 신청 링크 최신화 및 나이스페이먼츠 추가
- 전자결제/본인확인/SMS 신청 링크를 sir.kr 최신 경로로 교체
- 신용카드 전자결제에 나이스페이먼츠 추가(4개 1열 배치, 카드 폭 조정)
- 나이스페이먼츠 신청 버튼 이미지 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 05:19:41 +00:00
thisgun e45bd1d9e1 버전 5.6.33 수정 2026-07-24 01:04:31 +00:00
thisgunandClaude Fable 5 acdbcfd8ba KG이니시스 INIpay PRO 결제 연동 및 결제 처리 현황 추가
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 08:03:16 +00:00
thisgun 1f48f6bd80 버전 5.6.32 수정 2026-07-14 02:35:52 +00:00
thisgun 87d86d317e 소셜 로그인 앱 등록 링크 최신화 2026-07-13 08:55:10 +00:00
thisgun 7fa554f396 XSS 취약점 수정 2026-07-13 07:38:27 +00:00
thisgunandClaude Opus 4.8 6bc322c9d6 회원 여분필드 저장 시 입력값 정제 보완
- register_form_update.php에서 mb_1~mb_10을 다른 회원필드(mb_name 등)와
  동일하게 clean_xss_tags 처리하여 저장하도록 보완

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 07:36:19 +00:00
thisgun 43fba4407d [KVE-2025-1533] 미결제내역 임시주문 데이터 출력 시 이스케이프 보완 2026-07-13 07:36:19 +00:00
thisgunandClaude Opus 4.8 3d7fa04569 관리자 상태변경 엔드포인트에 요청 출처 검증 추가
- 상품이벤트/개인결제복사/SMS 번호·그룹·폼·업로드/방문로그 삭제 등
  POST 기반 상태변경 처리에 check_request_origin() 적용 (스킨 수정 불필요)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 07:20:32 +00:00
thisgun 82ee3ef438 [KVE-1525] SMS 번호·이모티콘 이동 처리 권한 속성 보완 2026-07-13 07:20:32 +00:00
thisgun 4049c6c164 [KVE-1524] 주문 상태변경 관리자 엔드포인트에 메뉴 권한 검증 추가 2026-07-13 07:15:09 +00:00
thisgun f80ed3946f Fix monthly visit date range end date 2026-07-01 08:41:11 +00:00
thisgunandClaude Opus 4.8 d7d5f26524 [KVE-2026-1233]취약점- 게시글 조회 시 wr_id 정수 처리 보완
- get_write() 진입 시 wr_id를 정수로 캐스팅하여 SQL 조건에 비정상 값이 전달되지 않도록 보완

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 02:05:11 +00:00
thisgun e0a42d8f46 버전 5.6.31 수정 2026-06-26 10:50:29 +00:00
thisgun 6c6787ec1f 상품 스킨 디렉토리 검증 보완 2026-06-26 10:40:28 +00:00
thisgunandClaude Opus 4.8 d419f430a9 [KVE-20206-1176]XSS 취약점 - 결제 전 주문 임시데이터 저장 요청 출처 검증 추가
- shop/ajax.orderdatasave.php에 check_request_origin() 적용하여
  외부 사이트발 자동 요청에 의한 임시 주문 데이터 교체 차단

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 07:10:24 +00:00
thisgunandClaude Opus 4.8 1a5661a995 접속자검색 접속경로 출력 시 속성값 이스케이프 보완
- vi_referer 디코딩 후 title 속성에 출력할 때 따옴표를 이스케이프하도록 보완

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 00:52:40 +00:00
thisgunandClaude Opus 4.8 8a5767dc70 [KVE-2026-1176]취약점수정 - 관리자 목록 정렬 파라미터 화이트리스트 적용 보완
- member_list·index·couponzonelist·inorderlist·personalpaylist의
  정렬 컬럼/방향 값을 허용 목록으로 제한하여 ORDER BY 절에 임의 값 삽입 차단
- 기존 다른 목록 파일과 동일한 in_array 화이트리스트 패턴 적용

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 00:48:42 +00:00
thisgunandClaude Opus 4.8 935ea84c7c [KVE-2026-1122]취약점 수정 - 주문·관리자·결제·소셜 등 사용자 입력 처리 보완
- 쿠폰/희망배송일/검색어/계정/결제 콜백 등 입력값을 SQL 컨텍스트에 맞게 재처리
- dt_data·PG 응답 등 비-GPC 값과 소셜 provider 입력 정제 보완

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 00:36:35 +00:00
thisgun 1cade844fb chore: allow CRLF in PHP whitespace checks 2026-06-22 08:30:20 +00:00
thisgun dfca17a599 버전 5.6.30 수정 2026-06-16 03:33:14 +00:00
thisgun 5ed691136d 나이스페이 가상계좌 취소금액 보정 2026-06-16 03:26:42 +00:00
thisgun cdda832081 Fix register form member defaults 2026-06-16 03:26:42 +00:00
thisgun 5374fb5f74 NHN KCP 본인확인 v2 설정 안내 보완 2026-06-16 03:17:44 +00:00
thisgun 16a8dca6f7 버전 5.6.29 수정 2026-06-09 02:34:30 +00:00
thisgun b00fc18275 Merge branch 'master' into tmp_install 2026-06-09 02:27:41 +00:00
thisgun 0c6ff731f6 관리권한 부여 목록에서 최고관리자 전용 메뉴 제외 2026-06-09 02:26:01 +00:00
thisgun 77835010df 메일 테스트 발송 안내 개선 2026-06-09 02:26:01 +00:00
thisgunandClaude Opus 4.8 33416852fc 나이스페이 가상계좌 채번 시 od_app_no 누락 수정
가상계좌(4100) 채번 시 od_app_no가 빈 AuthCode로 남아
입금통보 매칭(od_app_no = VbankNum)이 실패하던 문제 수정

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 01:34:33 +00:00
thisgun 3a4612420c Improve installer validation and error handling 2026-06-08 02:09:17 +00:00
thisgunandClaude Opus 4.8 6a55f1457d 현재접속자 처리 시 카운트 접근 null 보정 (PHP 8 호환)
html_process 의 접속자 처리에서 count 조회 결과 접근을 empty() 로
보정. 쿼리 실패 등 비정상 상황에서 빈 배열/undefined 키 접근으로
PHP 8.0+ 경고가 나는 경우를 예방. 동작 변화 없음.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 07:32:50 +00:00
thisgunandClaude Opus 4.8 76d83c2bae 게시판 정렬 필드 화이트리스트 검증 추가
게시판 설정의 bo_sort_field 가 허용 목록 검증 없이 저장·사용되어
목록 조회 ORDER BY 절에 임의 표현식이 들어갈 수 있던 문제 수정.
정렬값은 따옴표로 감싸지 않아 escape 로 막히지 않으므로,
게시판 관리 권한 계정이 저장한 값이 비로그인 목록 조회에서
실행될 수 있었음.

get_board_sort_fields() 의 허용 목록(관리자 드롭다운과 동일)으로
저장(adm/board_form_update.php)과 사용(bbs/list.php) 양쪽을 검증.
허용 목록 외 값은 기본 정렬로 무력화하여 이미 저장된 값도 차단.
function_exists 가드로 부분 패치 환경 대비.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 07:20:58 +00:00
thisgunandClaude Opus 4.8 afd8b35423 SMS 회원정보 업데이트 토큰 방식 불일치 수정
member_update.php 가 get_token()(HMAC) 으로 발급한 토큰을
member_update_run.php 가 check_admin_token()(세션) 으로 검증해
항상 불일치 → 오류 HTML 반환으로 AJAX JSON 파싱이 실패하던 문제 수정.

sms_admin 의 다른 _run 들과 동일하게 검증측(check_admin_token)은
유지하고, 실행 시 ajax.token.php 로 세션 토큰을 발급받아 본 요청에
사용하도록 변경. check_admin_token 의 1회용 소거 특성상 재실행에도
견고함.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 08:22:03 +00:00
thisgunandClaude Opus 4.8 e7c89675b6 회원관리/비디오 필터 null 인자 보정 (PHP 8.1 호환)
내장함수에 null 이 전달되어 PHP 8.1+ 에서 경고가 발생하던 것을
isset 삼항 / 문자열 캐스팅으로 보정.

- adm/member_form.php: number_format(mb_point), substr(mb_id) 2곳,
  substr(mp_register_day) — null/미정의 시 0 또는 빈 문자열 처리
- plugin/htmlpurifier/extend.video.php: strstr 인자 (string) 캐스팅

표시·동작 변화 없음. PHP 5.2~8.3 호환 유지(?? 미사용).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 07:55:39 +00:00
thisgun 10c6c18857 Fix JavaScript alert string escaping 2026-06-01 10:26:44 +00:00
thisgun 3e002199d5 버전 5.6.28 수정 2026-06-01 03:40:35 +00:00
thisgunandClaude Opus 4.8 7dde02d396 SMS 모듈 Add/Add2 매개변수 기본값 보정 (PHP 8 호환)
기본값 있는 $strDate 뒤에 기본값 없는 $nCount 가 선언되어 PHP 8.0+
에서 경고가 발생하던 것을 $nCount=0 기본값 부여로 해소.

- plugin/sms5/sms5.lib.php: Add(), Add2()
- lib/icode.lms.lib.php: Add() (LMS 부모 클래스 동일 패턴)

LMS 분기 호출부는 $strDate, $nCount 를 항상 함께 전달하므로
동작 변화 없음. PHP 5.2~8.3 호환 유지.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 01:02:26 +00:00
thisgunandClaude Opus 4.8 31871ee3e6 [security] 주문자 휴대폰 출력 인코딩 및 리다이렉트 URL 호스트 검증
- adm/shop_admin/orderform.php: 주문상세 hidden 의 od_hp 출력에
  get_text() 적용 (인접한 od_name 과 동일 처리, 누락분 보완)
- bbs/member_cert_refresh_update.php: 본인확인 갱신 후 이동 URL 에
  check_url_host() 적용
- plugin/social/includes/functions.php: 소셜 로그인/연동 후 이동
  URL 2곳에 동일하게 check_url_host() 적용

login_check.php 등 기존 코드와 동일한 호스트 검증 패턴으로,
같은 도메인/상대경로 복귀는 그대로 동작하고 타 도메인 이동만 차단.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 09:16:29 +00:00
thisgun ff9a7534ed Restore data htaccess on admin and write upload 2026-05-29 07:22:08 +00:00
thisgunandClaude Opus 4.8 9869be5970 [security] 토스 결제창 customerName 출력 시 get_text 인코딩 적용
토스페이먼츠 결제 요청 폼의 customerName hidden 필드에 주문자명
($od_name)이 인코딩 없이 출력되던 것을 get_text() 적용으로 정리.
직전 주문 필드 인코딩 처리와 동일한 맥락의 마무리.

hidden value 의 엔티티는 결제 SDK 가 값을 읽을 때 브라우저가
디코딩하므로 토스로 전달되는 구매자명에는 영향 없음.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 06:30:29 +00:00
thisgunandClaude Opus 4.8 1fa4467cd1 [security] 주문 관련 필드 출력 시 get_text 인코딩 적용
영카트 주문자명/받는분/입금자명(od_name, od_b_name, od_deposit_name)
이 일부 출력 지점에서 인코딩 없이 노출되어, 저장된 값이 HTML/속성
컨텍스트에서 그대로 렌더링되던 문제 수정. 다음 출력에 get_text() 적용:

- adm/shop_admin/orderform.php, sale1today.php (관리자 주문 화면)
- shop/orderinquiryview.php (PC/모바일/테마 주문조회)
- shop/{inicis,kcp,lg,nicepay,toss}/taxsave_form.php (현금영수증 발행 폼)
- shop/mail/orderupdate{1,2,3}.mail.php, ordermail.mail.php (주문 메일)

비회원 주문 시 입력값이 관리자 화면에서 실행될 수 있는 경로를 차단.
폼 value 의 엔티티는 브라우저 제출 시 디코딩되므로 PG 전송값 및
정상 표시에는 영향 없음.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 06:25:12 +00:00
thisgun 3e75ccea65 NHN KCP 휴대폰 본인확인(api_v2) 버전 추가 2026-05-29 06:14:21 +00:00
thisgun be9f50f96b Fix RSS warnings for invalid board requests 2026-05-29 01:33:45 +00:00
thisgun 7c217cb41b Restore alert newline handling 2026-05-28 06:23:04 +00:00
thisgun 5fc1c3bc27 버전 5.6.27 수정 2026-05-27 03:35:09 +00:00
thisgunandClaude Opus 4.7 d707c5abac data/ 디렉터리 git 추적 제외 (.htaccess 인덱스 제거)
.gitignore 에는 이미 data/ 가 등록되어 있으나 data/.htaccess
한 파일이 이전부터 트래킹되고 있어 배포본에 함께 포함되던 문제 정리.
디스크 파일은 그대로 두고 인덱스에서만 제거.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 02:28:39 +00:00
thisgunandClaude Opus 4.7 eeea46cb69 NHN KCP 가상계좌 발급 응답 코드 V000 허용
KCP 가이드 개정으로 가상계좌 발급 정상 응답이 0000 에서 V000 으로
변경되어, 기존 코드가 발급 성공을 실패로 인식하던 문제를 수정.
결제 hub 의 res_cd 비교 두 곳에서 V000 을 0000 과 동등하게 처리.

가상계좌 입금 완료 처리는 Webhook 입금통보가 담당하므로 본 변경과
무관. 취소/현금영수증/본인인증 경로는 V000 응답 대상이 아니므로
0000 단독 비교 유지.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 11:55:56 +00:00
thisgunandClaude Opus 4.7 669cce7011 주소 jibeon 값 화이트리스트에 'J' 추가
카카오 우편번호 서비스의 oncomplete 콜백이 userSelectedType
으로 'R'(도로명) 또는 'J'(지번)을 반환하는데, 서버 측 정규식이
'N|R' 만 허용해 지번 선택 시 빈 문자열로 저장되던 문제를 수정.
N 은 print_address() 의 도로명 표기 분기를 위한 레거시 값으로
호환을 위해 유지.

적용 위치: 회원가입(bbs/register_form_update.php), PC/모바일
주문(shop/, mobile/shop/ orderformupdate.php), 관리자 미완료
주문(adm/shop_admin/inorderformupdate.php) 의 7곳.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 11:46:36 +00:00
thisgunandClaude Opus 4.7 ee8b57eb13 미완료 주문 목록 PG 표시에 토스페이먼츠/NICEPAY 케이스 추가
dt_pg 값이 'toss' 또는 'nicepay' 인 건이 default 분기로 빠져
일괄 'KCP' 로 잘못 표시되던 문제 수정.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 11:40:18 +00:00
thisgun c927925a05 Fix PHP 5.2 compatibility issues 2026-05-26 09:34:18 +00:00
thisgun d914a7843d Fix PHP legacy array syntax 2026-05-26 08:10:57 +00:00
thisgun c04591e24a NHN_KCP 가상계좌 테스트 url 변경 2026-05-26 07:34:49 +00:00
thisgunandClaude Opus 4.7 a6fbbe6ad2 [security] 엑셀/CSV 다운로드 출력값 안전 처리
lib/common.lib.php 에 csv_safe_cell() 헬퍼 추가 (function_exists
가드 포함). 셀 값이 = + - @ TAB CR 로 시작하면 작은따옴표를 prefix
하여 스프레드시트가 수식으로 해석하지 못하도록 변환.

다음 출력 지점에서 사용자 입력 컬럼에 적용:
- adm/shop_admin/orderprintresult.php (CSV + XLS 두 분기)
- adm/shop_admin/orderdeliveryexcel.php
- adm/member_list_exel_export.php
- adm/sms_admin/num_book_file_download.php

호출부는 function_exists('csv_safe_cell') ? ... : 원본 폴백 형태로
감싸서 lib 미업데이트 환경에서도 fatal error 없이 동작하도록 함.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 07:30:21 +00:00
thisgunandClaude Opus 4.7 4c00c60006 [security]KVE-2026-0882 race condition 잔액 부족 시 결제 취소 처리로 변경
이전 커밋(e53689ac3)의 미수금 처리 방식은 사용자에게 결제 금액과
다른 청구가 발생해 혼란/분쟁을 유발할 수 있어, 동시 주문 race 로
포인트 잔액이 부족하면 결제 자체를 취소하는 방식으로 변경.

- PG 결제가 진행된 경우 (\$tno 존재): cancel_pg.inc.php 로 환불 요청
- 장바구니 복구: 기존 line 839 동일 패턴 (od_id = tmp_cart_id, ct_status = '쇼핑')
- 주문 삭제: g5_shop_order_table 에서 od_id 제거
- 사용자에게 die 로 명확한 오류 메시지 표시

lock timeout 케이스도 동일하게 결제 취소 처리 (보수적).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 07:10:53 +00:00
thisgunandClaude Opus 4.7 56b1958d37 [security]KVE-2026-0882 주문 포인트 차감 Race Condition (Double Spend) 수정
shop/orderformupdate.php / mobile/shop/orderformupdate.php 의 포인트
검증과 차감 사이에 TOCTOU race 가 존재하여, 동일 회원이 여러 세션으로
동시에 주문 제출 시 같은 포인트 잔액을 반복 검증 통과 → 다중 차감으로
mb_point 가 음수가 되는 double spend 가 가능했음.

insert_point() 의 기존 named lock 은 (mb_id, rel_table, rel_id, rel_action)
조합 키 기반이라 서로 다른 od_id 주문 간에는 lock 이 다르고, 주문 차감
호출에 rel_* 가 전달되지 않아 lock 미적용 상태였음.

조치: KVE-2026-0687 (쇼핑몰 쿠폰) 와 동일한 회원 단위 MySQL GET_LOCK
패턴을 적용. lock 획득 후 g5_point SUM 으로 잔액을 재조회하여
- 충분하면 정상 차감
- race 로 부족하면 사용 가능한 만큼만 차감 + 부족분은 od_receipt_point
  보정 + od_misu(미수금) 으로 반영하여 매장 손실 방지.

MyISAM 정책상 트랜잭션 금지이므로 named lock 으로 직렬화하는 방식이
가장 적합. 데스크톱·모바일 동일 패턴 적용.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 06:52:25 +00:00
thisgunandClaude Opus 4.7 6b2f9e094c [security] ORDER BY sst/sod 화이트리스트 누락 Blind SQL Injection 수정
KVE-2026-0876 동일 패턴 추가 발견 5건 일괄 수정.

- shop/itemuselist.php / mobile/shop/itemuselist.php (상품후기 목록)
- shop/itemqalist.php / mobile/shop/itemqalist.php (상품문의 목록)
  → 비회원 접근 가능한 공개 페이지에서 sst/sod 가 ORDER BY 절에
    검증 없이 삽입되어 CASE WHEN/SLEEP 기반 blind SQLi 가능했음.
    sst 는 컬럼 화이트리스트, sod 는 asc/desc 정규식으로 검증.

- bbs/list.php (게시판 목록)
  → sst 는 wr_datetime/wr_hit/wr_good/wr_nogood 화이트리스트 적용
    되어 있으나 sod 가 검증 누락되어 ORDER BY 절에 함수 표현식
    삽입이 가능했음. sod 에 asc/desc 정규식 검증 추가.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 06:32:28 +00:00
thisgun a781b4aef3 [KVE-2026-0876] 모바일 상품 리스트 sort 파라미터 Blind SQL Injection 수정 2026-05-26 06:27:53 +00:00
thisgun 8be4476f56 [KVE-2026-0869] 인스톨러 관리자 입력값 SQL Injection 수정 2026-05-26 05:22:52 +00:00
thisgunandClaude Opus 4.7 59d0b3c19c [security]KVE-2026-0859 KCP CLI Windows 환경 명령 인젝션(RCE) 수정
shop/kcp/pp_cli_hub_lib.php, shop/kcp/pp_ax_hub_lib.php 의
mf_do_tx() Windows 분기가 사용자 입력이 포함된 KCP CLI 인자를
큰따옴표로 감싼 단일 문자열로 만들어 mf_exec() 첫 인자로 전달했고,
mf_exec() 는 첫 인자를 escape 없이 exec() 에 넘겨 Windows cmd.exe
메타문자(`"`, `&` 등)로 인증 없는 OS 명령 실행이 가능했음.

Linux 분기와 동일하게 실행 파일 경로와 콤마 구분 인자 문자열을
분리하여 mf_exec($bin_exe, $args) 형태로 호출하도록 변경.
mf_exec() 의 foreach 가 두 번째 이후 인자에 escapeshellarg() 를
자동 적용하여 cmd.exe 메타문자가 안전하게 wrapping 됨.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 03:35:51 +00:00
thisgunandClaude Opus 4.7 f4f8c57a74 [security] 관리자 영역 권한 검증 누락 및 CSRF 토큰 누락 수정
- adm/qa_config_update.php / adm/contentformupdate.php :
  qa_include_head/tail, co_include_head/tail 가 super 가드 없이 변경 가능해
  하위 관리자가 임의 PHP 경로를 include 시킬 수 있던 LFI 위험을
  board_form_update.php 와 동일한 패턴(super 외에는 기존 값 유지)으로 차단.

- adm/member_form_update.php / adm/member_list_update.php :
  신규 회원 생성·일괄 수정 시 부여하려는 mb_level 상한 검증이 없어
  하위 관리자가 자기보다 높은 등급을 부여할 수 있던 권한 상승을 차단.

- adm/shop_admin/categorylistupdate.php /
  adm/shop_admin/itemformupdate.php :
  is_include_path_check 호출에서 두 번째 인자(is_input=1) 누락으로
  rar/php/zip wrapper 등 경로 wrapper 차단이 동작하지 않던 부분을
  is_include_path_check($file, 1) 로 강화.

- adm/shop_admin/orderdeliveryupdate.php /
  adm/shop_admin/orderpartcancelupdate.php /
  adm/sendmail_test.php :
  상태 변경 동작에 check_admin_token() 누락으로 발생하던 CSRF 위험을
  토큰 검증 추가로 차단. sendmail_test 폼에는 hidden token 필드 추가.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 03:35:29 +00:00
thisgunandClaude Opus 4.7 d5619707bc [security] 인스톨러 g5_shop_prefix PHP 코드 인젝션(RCE) 수정
install/install_db.php 의 g5_shop_prefix 가 dbconfig.php 의
define('G5_SHOP_TABLE_PREFIX','...') 문자열에 작은따옴표 escape 없이
삽입되어, 설치 전 노출된 인스톨러를 통해 임의 PHP 코드 주입 후 RCE
가능하던 문제를 수정. table_prefix·admin_id 와 동일하게 [^0-9a-z_]+
정규식 검증을 추가하여 영문자·숫자·언더스코어만 허용하도록 함.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 03:34:55 +00:00
thisgunandClaude Opus 4.7 9e7465319b [security]KVE-2026-0822 댓글 수정 textarea wr_content 미이스케이프 Stored XSS 수정
view_comment.skin.php 8종(skin/, mobile/skin/, theme/basic/ 하위 basic·
gallery)에서 댓글 수정($w == 'cu') 시 \$c_wr_content 가 textarea 내부에
이스케이프 없이 출력되어 </textarea> 페이로드로 탈출 가능하던 문제를
get_text() 적용으로 일괄 수정. 게시글 본문 수정(bbs/write.php) 과
동일한 escape 패턴을 댓글 수정에도 적용함.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 03:32:43 +00:00
thisgunandClaude Opus 4.7 f1f2150c67 [security]KVE-2026-0795 게시물 이동/복사 시 대상 게시판 권한 검증 누락 수정
bbs/move_update.php 가 원본 게시판 기준 $is_admin 만 검사하고 사용자
입력 chk_bo_table[] 의 대상 게시판에 대해서는 존재 여부만 확인하던
문제를 수정. 게시판 관리자(board)·그룹 관리자(group) 권한일 경우
대상 게시판의 bo_admin 또는 그룹의 gr_admin 이 본인인지 재검증하고,
일치하지 않으면 해당 대상 게시판 처리를 건너뛰도록 함. super 관리자는
기존 동작 유지.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 03:32:18 +00:00
thisgunandClaude Opus 4.7 3de722d3df [security]KVE-2026-0787 alert() JavaScript 이스케이프 누락 Stored XSS 수정
bbs/alert.php, bbs/alert_close.php 가 alert("$msg") 형태로 메시지를
JS 문자열 컨텍스트에 직접 삽입하던 부분을 수정. lib/common.lib.php 에
PHP 5.2 호환 폴백을 갖춘 get_js_safe_string() 헬퍼를 추가하고,
호출부에는 function_exists 가드를 걸어 부분 패치 환경에서도 안전하게
폴백되도록 함.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 03:31:24 +00:00
thisgunandClaude Opus 4.7 7119b4f612 [security]KVE-2026-0711 PG 리턴 처리 POST 키 이름 Reflected XSS 수정
XenoPostToForm::makeInputArray() 에서 POST 값·배열 인덱스는 이스케이프
되지만 최상위 POST 키 이름이 name 속성에 그대로 삽입되던 문제를 수정.
재귀 진입 시점에 htmlspecialchars() 로 키를 이스케이프하여 모든 깊이에서
안전하도록 함.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 03:30:47 +00:00
thisgunandClaude Opus 4.7 efaefbbd0e [security]KVE-2026-0687 쇼핑몰 쿠폰 다운로드 TOCTOU Race Condition 수정
MySQL GET_LOCK 으로 동일 회원·동일 쿠폰 다운로드 요청을 직렬화하여,
동시 요청 시 is_coupon_downloaded() 체크를 중복 통과해 쿠폰이 중복
발급되는 문제를 방지함.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 03:30:19 +00:00
thisgun b12bf551ec [security]XSS 취약점 및 token 추가 2026-05-26 03:29:51 +00:00
230 changed files with 7525 additions and 1087 deletions
+1
View File
@@ -1,2 +1,3 @@
.gitattributes export-ignore
.gitignore export-ignore
*.php whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
+4
View File
@@ -3,6 +3,10 @@ define('G5_IS_ADMIN', true);
require_once '../common.php';
require_once G5_ADMIN_PATH . '/admin.lib.php';
if (function_exists('g5_check_data_htaccess')) {
g5_check_data_htaccess();
}
if (isset($token)) {
$token = @htmlspecialchars(strip_tags($token), ENT_QUOTES);
}
+105 -1
View File
@@ -610,6 +610,110 @@ function admin_menu_find_by($call, $search_key)
return '';
}
function admin_menu_local_path($url)
{
$url = (string) $url;
if (!$url) {
return '';
}
$url = preg_replace('/[?#].*$/', '', $url);
$maps = array(
G5_ADMIN_URL => G5_ADMIN_PATH,
);
if (defined('G5_SMS5_ADMIN_URL') && defined('G5_SMS5_ADMIN_PATH')) {
$maps[G5_SMS5_ADMIN_URL] = G5_SMS5_ADMIN_PATH;
}
foreach ($maps as $base_url => $base_path) {
if (strpos($url, $base_url) !== 0) {
continue;
}
$path = $base_path.substr($url, strlen($base_url));
if (substr($path, -1) === '/') {
$path .= 'index.php';
}
return $path;
}
return '';
}
function admin_menu_is_super_only($menu_item)
{
static $cache = array();
$sub_menu = isset($menu_item[0]) ? (string) $menu_item[0] : '';
if (!$sub_menu) {
return false;
}
if (isset($cache[$sub_menu])) {
return $cache[$sub_menu];
}
// 향후 메뉴 정의에서 명시적으로 최고관리자 전용 표시가 필요할 때 사용한다.
if (isset($menu_item[4]) && $menu_item[4] === 'super') {
return $cache[$sub_menu] = true;
}
$path = admin_menu_local_path(isset($menu_item[2]) ? $menu_item[2] : '');
if (!$path || !is_readable($path)) {
return $cache[$sub_menu] = false;
}
$content = file_get_contents($path, false, null, 0, 12000);
if ($content === false) {
return $cache[$sub_menu] = false;
}
$pattern = '/if\s*\([^\)]*\$is_admin\s*(?:!==|!=)\s*[\'"]super[\'"][^\)]*\)\s*\{?[\s\S]{0,250}(?:alert|alert_close|die)\s*\([^\;]*(?:최고관리자만|최고관리자로)/u';
return $cache[$sub_menu] = (bool) preg_match($pattern, $content);
}
function admin_get_assignable_auth_menu()
{
global $menu;
$assignable_auth_menu = array();
if (!isset($menu) || !is_array($menu)) {
return $assignable_auth_menu;
}
foreach ($menu as $menu_group) {
if (!is_array($menu_group)) {
continue;
}
for ($i=1; $i<count($menu_group); $i++) {
if (!isset($menu_group[$i]) || !is_array($menu_group[$i])) {
continue;
}
$sub_menu = isset($menu_group[$i][0]) ? $menu_group[$i][0] : '';
if (!$sub_menu || $sub_menu === '-' || substr($sub_menu, -3) === '000') {
continue;
}
if (admin_menu_is_super_only($menu_group[$i])) {
continue;
}
$assignable_auth_menu[$sub_menu] = isset($menu_group[$i][1]) ? $menu_group[$i][1] : '';
}
}
return $assignable_auth_menu;
}
// 접근 권한 검사
if (!$member['mb_id']) {
alert('로그인 하십시오.', G5_BBS_URL . '/login.php?url=' . urlencode(correct_goto_url(G5_ADMIN_URL)));
@@ -698,4 +802,4 @@ if (run_replace('safe_admin_add_script_boolean', false) === false) {
$config['cf_analytics'] = '';
$config['cf_add_script'] = '';
$config['cf_add_meta'] = '';
}
}
+7
View File
@@ -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');
}
+6 -4
View File
@@ -54,6 +54,8 @@ $listall = '<a href="' . $_SERVER['SCRIPT_NAME'] . '" class="ov_listall btn_ov02
$g5['title'] = "관리권한설정";
require_once './admin.head.php';
$assignable_auth_menu = admin_get_assignable_auth_menu();
$colspan = 5;
?>
@@ -105,8 +107,8 @@ $colspan = 5;
$is_continue = true;
}
// 메뉴번호가 바뀌는 경우에 현재 없는 저장된 메뉴는 삭제함
if (!isset($auth_menu[$row['au_menu']])) {
// 메뉴번호가 바뀌거나 권한 부여 대상이 아닌 메뉴는 삭제함
if (!isset($assignable_auth_menu[$row['au_menu']])) {
sql_query(" delete from {$g5['auth_table']} where au_menu = '{$row['au_menu']}' ");
$is_continue = true;
}
@@ -130,7 +132,7 @@ $colspan = 5;
<td class="td_auth_mbnick"><?php echo $mb_nick ?></td>
<td class="td_menu">
<?php echo $row['au_menu'] ?>
<?php echo $auth_menu[$row['au_menu']] ?>
<?php echo $assignable_auth_menu[$row['au_menu']] ?>
</td>
<td class="td_auth"><?php echo $row['au_auth'] ?></td>
</tr>
@@ -205,7 +207,7 @@ echo $pagelist;
<select id="au_menu" name="au_menu" required class="required">
<option value=''>선택하세요</option>
<?php
foreach ($auth_menu as $key => $value) {
foreach ($assignable_auth_menu as $key => $value) {
if (!(substr($key, -3) == '000' || $key == '-' || !$key)) {
echo '<option value="' . $key . '">' . $key . ' ' . $value . '</option>';
}
+5
View File
@@ -19,6 +19,11 @@ if (!(isset($mb['mb_id']) && $mb['mb_id'])) {
check_admin_token();
$assignable_auth_menu = admin_get_assignable_auth_menu();
if (!$au_menu || !isset($assignable_auth_menu[$au_menu])) {
alert('해당 메뉴는 관리권한을 부여할 수 없습니다.');
}
require_once G5_CAPTCHA_PATH . '/captcha.lib.php';
if (!chk_captcha()) {
+1 -1
View File
@@ -12,7 +12,7 @@ $bo_table = isset($_POST['bo_table']) ? substr(preg_replace('/[^a-z0-9_]/i
$target_table = isset($_POST['target_table']) ? trim($_POST['target_table']) : '';
$target_subject = isset($_POST['target_subject']) ? trim($_POST['target_subject']) : '';
$target_subject = strip_tags(clean_xss_attributes($target_subject));
$target_subject = addslashes(strip_tags(clean_xss_attributes(stripslashes($target_subject))));
$file_copy = array();
+13 -3
View File
@@ -12,8 +12,8 @@ check_admin_token();
$gr_id = isset($_POST['gr_id']) ? preg_replace('/[^a-z0-9_]/i', '', (string)$_POST['gr_id']) : '';
$bo_admin = isset($_POST['bo_admin']) ? preg_replace('/[^a-z0-9_\, \|\#]/i', '', $_POST['bo_admin']) : '';
$bo_subject = isset($_POST['bo_subject']) ? strip_tags(clean_xss_attributes($_POST['bo_subject'])) : '';
$bo_mobile_subject = isset($_POST['bo_mobile_subject']) ? strip_tags(clean_xss_attributes($_POST['bo_mobile_subject'])) : '';
$bo_subject = isset($_POST['bo_subject']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['bo_subject'])))) : '';
$bo_mobile_subject = isset($_POST['bo_mobile_subject']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['bo_mobile_subject'])))) : '';
if (!$gr_id) {
alert('그룹 ID는 반드시 선택하세요.');
@@ -176,7 +176,17 @@ $bo_write_min = isset($_POST['bo_write_min']) ? (int) $_POST['bo_write_min'] : 0
$bo_write_max = isset($_POST['bo_write_max']) ? (int) $_POST['bo_write_max'] : 0;
$bo_comment_min = isset($_POST['bo_comment_min']) ? (int) $_POST['bo_comment_min'] : 0;
$bo_comment_max = isset($_POST['bo_comment_max']) ? (int) $_POST['bo_comment_max'] : 0;
$bo_sort_field = isset($_POST['bo_sort_field']) ? addslashes(clean_xss_tags(stripslashes($_POST['bo_sort_field']), 1, 1)) : '';
$bo_sort_field = isset($_POST['bo_sort_field']) ? trim(stripslashes($_POST['bo_sort_field'])) : '';
$bo_allowed_sort_field = array('');
if (function_exists('get_board_sort_fields')) {
foreach (get_board_sort_fields(isset($board) ? $board : array()) as $bo_sort_v) {
$bo_allowed_sort_field[] = $bo_sort_v[0];
}
}
if (!in_array($bo_sort_field, $bo_allowed_sort_field, true)) {
$bo_sort_field = '';
}
$bo_sort_field = addslashes($bo_sort_field);
if (strpbrk($bo_skin.$bo_mobile_skin, "?%*:|\"<>") !== false) {
alert('스킨 디렉토리명 오류!');
+1 -1
View File
@@ -46,7 +46,7 @@ if ($act_button === "선택수정") {
}
}
$p_bo_subject = is_array($_POST['bo_subject']) ? strip_tags(clean_xss_attributes($_POST['bo_subject'][$k])) : '';
$p_bo_subject = is_array($_POST['bo_subject']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['bo_subject'][$k])))) : '';
$sql = " update {$g5['board_table']}
set gr_id = '" . sql_real_escape_string($post_gr_id) . "',
+1 -1
View File
@@ -39,7 +39,7 @@ for ($i = 1; $i <= 10; $i++) {
foreach ($check_keys as $key => $value) {
if ($key === 'gr_subject') {
$posts[$key] = isset($_POST[$key]) ? strip_tags(clean_xss_attributes($_POST[$key])) : '';
$posts[$key] = isset($_POST[$key]) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST[$key])))) : '';
} else {
$posts[$key] = isset($_POST[$key]) ? $_POST[$key] : '';
}
+2 -2
View File
@@ -21,7 +21,7 @@ if (!$chk_count) {
for ($i = 0; $i < $chk_count; $i++) {
$k = isset($post_chk[$i]) ? (int) $post_chk[$i] : 0;
$gr_id = preg_replace('/[^a-z0-9_]/i', '', $post_group_id[$k]);
$gr_subject = isset($_POST['gr_subject'][$k]) ? strip_tags(clean_xss_attributes($_POST['gr_subject'][$k])) : '';
$gr_subject = isset($_POST['gr_subject'][$k]) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['gr_subject'][$k])))) : '';
$gr_admin = isset($_POST['gr_admin'][$k]) ? strip_tags(clean_xss_attributes($_POST['gr_admin'][$k])) : '';
$gr_device = isset($_POST['gr_device'][$k]) ? clean_xss_tags($_POST['gr_device'][$k], 1, 1, 10) : '';
$gr_use_access = isset($_POST['gr_use_access'][$k]) ? (int) $_POST['gr_use_access'][$k] : 0;
@@ -36,7 +36,7 @@ for ($i = 0; $i < $chk_count; $i++) {
gr_order = '" . $gr_order . "'
where gr_id = '{$gr_id}' ";
if ($is_admin != 'super') {
$sql .= " and gr_admin = '{$gr_admin}' ";
$sql .= " and gr_admin = '" . sql_real_escape_string($gr_admin) . "' ";
}
sql_query($sql);
} elseif ($act_button == '선택삭제') {
+1 -1
View File
@@ -21,7 +21,7 @@ if (!is_file(G5_DATA_PATH . '/cache/browscap_cache.php')) {
}
require_once G5_PLUGIN_PATH . '/browscap/Browscap.php';
$browscap = new phpbrowscap\Browscap(G5_DATA_PATH . '/cache');
$browscap = new Browscap(G5_DATA_PATH . '/cache');
$browscap->doAutoUpdate = false;
$browscap->cacheFilename = 'browscap_cache.php';
+1 -1
View File
@@ -17,7 +17,7 @@ if ($is_admin != 'super') {
require_once G5_PLUGIN_PATH . '/browscap/Browscap.php';
$browscap = new phpbrowscap\Browscap(G5_DATA_PATH . '/cache');
$browscap = new Browscap(G5_DATA_PATH . '/cache');
$browscap->updateMethod = 'cURL';
$browscap->cacheFilename = 'browscap_cache.php';
$browscap->updateCache();
+33 -10
View File
@@ -415,10 +415,10 @@ if (!isset($config['cf_cert_use_seed'])) {
sql_query($sql, false);
}
if (!isset($config['cf_cert_kcp_enckey'])) {
$sql = "ALTER TABLE `{$g5['config_table']}`
$sql = "ALTER TABLE `{$g5['config_table']}`
ADD COLUMN `cf_cert_kcp_enckey` VARCHAR(100) NOT NULL DEFAULT '' AFTER `cf_cert_kcp_cd`; ";
sql_query($sql, false);
$config['cf_cert_kcp_enckey'] = '';
}
@@ -1068,7 +1068,24 @@ if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) {
<?php echo option_selected("", $config['cf_cert_hp'], "사용안함"); ?>
<?php echo option_selected("kcb", $config['cf_cert_hp'], "코리아크레딧뷰로(KCB) 휴대폰 본인확인"); ?>
<?php echo option_selected("kcp", $config['cf_cert_hp'], "NHN KCP 휴대폰 본인확인"); ?>
<?php echo option_selected("kcp_v2", $config['cf_cert_hp'], "NHN KCP 휴대폰 본인확인(api_v2)"); ?>
</select>
<div id="cf_cert_hp_kcp_v2_notice" style="display:<?php echo ($config['cf_cert_hp'] == 'kcp_v2') ? 'block' : 'none'; ?>; margin-top:8px; padding:10px 12px; background:#fff8e1; border:1px solid #ffd54f; border-radius:4px; color:#5d4037; line-height:1.5;">
<strong>NHN KCP 휴대폰 본인확인(api_v2)</strong> 사용 시,<br>
NHN KCP 상점관리자 &gt; 부가서비스 &gt; 휴대폰본인확인 &gt; 연동방식 설정 에서 <strong>신규 연동방식(V2) 사용여부를 &lsquo;사용&rsquo;</strong> 으로 변경해야 정상 동작합니다.<br>
PHP 7.0 이상 환경에서만 동작하며, PHP 7.0 미만에서는 사용할 수 없습니다.
</div>
<script>
jQuery(function($){
function toggle_kcp_v2_notice() {
var is_kcp_v2 = $('#cf_cert_hp').val() === 'kcp_v2';
$('#cf_cert_hp_kcp_v2_notice').toggle(is_kcp_v2);
}
$('#cf_cert_hp').on('change', toggle_kcp_v2_notice);
toggle_kcp_v2_notice();
});
</script>
</td>
</tr>
<tr>
@@ -1104,16 +1121,22 @@ if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) {
<tr>
<th scope="row" class="cf_cert_service"><label for="cf_cert_kcp_cd">NHN KCP 사이트코드</label></th>
<td class="cf_cert_service">
<?php
$cf_cert_kcp_cd = get_sanitize_input($config['cf_cert_kcp_cd']);
if (preg_match('/^SM([A-Z0-9]{3})$/i', $cf_cert_kcp_cd, $matches)) {
$cf_cert_kcp_cd = $matches[1];
}
?>
<?php echo help('SM으로 시작하는 5자리 사이트 코드중 뒤의 3자리만 입력해 주십시오.<br>서비스에 가입되어 있지 않다면, 본인확인 서비스 신청페이지에서 서비스 신청 후 사이트코드를 발급 받으실 수 있습니다.') ?>
<span class="sitecode">SM</span>
<input type="text" name="cf_cert_kcp_cd" value="<?php echo get_sanitize_input($config['cf_cert_kcp_cd']); ?>" id="cf_cert_kcp_cd" class="frm_input" size="3"> <a href="http://sir.kr/main/service/p_cert.php" target="_blank" class="btn_frmline">NHN KCP 휴대폰 본인확인 서비스 신청페이지</a>
<span class="sitecode" id="cf_cert_kcp_cd_prefix">SM</span>
<input type="text" name="cf_cert_kcp_cd" value="<?php echo $cf_cert_kcp_cd; ?>" id="cf_cert_kcp_cd" class="frm_input" size="3" maxlength="3"> <a href="http://sir.kr/main/service/p_cert.php" target="_blank" class="btn_frmline">NHN KCP 휴대폰 본인확인 서비스 신청페이지</a>
</td>
</tr>
<tr>
<th scope="row" class="cf_cert_service"><label for="cf_cert_kcp_enckey">NHN KCP 가맹점 인증키</label></th>
<td class="cf_cert_service">
<?php echo help('(선택사항, 추후 NHN_KCP 상점관리자에서 인증키 발급 메뉴 오픈일정 이후부터 적용되는 내용입니다.)<br>NHN_KCP 상점관리자 > 기술관리센터 > 인증센터 > 가맹점 인증키관리 에서 인증키 발급 후에 인증키 정보를 입력') ?>
<input type="text" name="cf_cert_kcp_enckey" value="<?php echo get_sanitize_input($config['cf_cert_kcp_enckey']); ?>" id="cf_cert_kcp_enckey" class="frm_input" maxlength="100" size="40"> <a href="https://partner.kcp.co.kr" target="_blank" class="btn_frmline">NHN KCP 상점관리자</a>
<?php echo help('NHN KCP 상점관리자 > 기술관리센터 > 인증센터 > 가맹점 인증키관리 에서 인증키를 발급받아 입력해 주십시오.<br>NHN KCP 휴대폰 본인확인(api_v2)도 이 인증키 값을 사용합니다.') ?>
<input type="text" name="cf_cert_kcp_enckey" value="<?php echo get_sanitize_input($config['cf_cert_kcp_enckey']); ?>" id="cf_cert_kcp_enckey" class="frm_input" maxlength="100" size="70"> <a href="https://partner.kcp.co.kr" target="_blank" class="btn_frmline">NHN KCP 상점관리자</a>
</td>
</tr>
<tr>
@@ -1386,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>
@@ -1396,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>
@@ -1412,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>
@@ -1428,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>
+3 -3
View File
@@ -13,8 +13,8 @@ if ($is_admin != 'super') {
$sql = " select * from {$g5['config_table']} limit 1";
$ori_config = sql_fetch($sql);
$cf_title = isset($_POST['cf_title']) ? strip_tags(clean_xss_attributes($_POST['cf_title'])) : '';
$cf_admin = isset($_POST['cf_admin']) ? clean_xss_tags($_POST['cf_admin'], 1, 1) : '';
$cf_title = isset($_POST['cf_title']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['cf_title'])))) : '';
$cf_admin = isset($_POST['cf_admin']) ? safe_replace_regex($_POST['cf_admin']) : '';
$mb = get_member($cf_admin);
@@ -173,7 +173,7 @@ foreach ($check_keys as $k => $v) {
if (in_array($k, array('cf_analytics', 'cf_add_meta', 'cf_add_script', 'cf_stipulation', 'cf_privacy'))) {
$_POST[$k] = isset($_POST[$k]) ? $_POST[$k] : '';
} else {
$_POST[$k] = isset($_POST[$k]) ? strip_tags(clean_xss_attributes($_POST[$k])) : '';
$_POST[$k] = isset($_POST[$k]) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST[$k])))) : '';
}
}
}
+12 -1
View File
@@ -26,9 +26,20 @@ if ($w == "" || $w == "u") {
}
$co_id = isset($_REQUEST['co_id']) ? preg_replace('/[^a-z0-9_]/i', '', $_REQUEST['co_id']) : '';
$co_subject = isset($_POST['co_subject']) ? strip_tags(clean_xss_attributes($_POST['co_subject'])) : '';
$co_subject = isset($_POST['co_subject']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['co_subject'])))) : '';
$co_include_head = isset($_POST['co_include_head']) ? preg_replace(array("#[\\\]+$#", "#(<\?php|<\?)#i"), "", substr($_POST['co_include_head'], 0, 255)) : '';
$co_include_tail = isset($_POST['co_include_tail']) ? preg_replace(array("#[\\\]+$#", "#(<\?php|<\?)#i"), "", substr($_POST['co_include_tail'], 0, 255)) : '';
// 최고 관리자가 아니면 include 경로 변경 불가 (board_form_update.php 와 동일 정책)
if ($is_admin !== 'super') {
if ($w == 'u') {
$co_include_head = isset($co_row['co_include_head']) ? $co_row['co_include_head'] : '';
$co_include_tail = isset($co_row['co_include_tail']) ? $co_row['co_include_tail'] : '';
} else {
$co_include_head = '';
$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;
+2 -2
View File
@@ -1083,8 +1083,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;}
+258 -1
View File
@@ -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');
+1 -1
View File
@@ -20,7 +20,7 @@ check_admin_token();
$fm_id = isset($_REQUEST['fm_id']) ? (int) $_REQUEST['fm_id'] : 0;
$fm_himg_del = isset($_POST['fm_himg_del']) ? (int) $_POST['fm_himg_del'] : 0;
$fm_timg_del = isset($_POST['fm_timg_del']) ? (int) $_POST['fm_timg_del'] : 0;
$fm_subject = isset($_POST['fm_subject']) ? strip_tags(clean_xss_attributes($_POST['fm_subject'])) : '';
$fm_subject = isset($_POST['fm_subject']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['fm_subject'])))) : '';
$fm_head_html = isset($_POST['fm_head_html']) ? $_POST['fm_head_html'] : '';
$fm_tail_html = isset($_POST['fm_tail_html']) ? $_POST['fm_tail_html'] : '';
$fm_mobile_head_html = isset($_POST['fm_mobile_head_html']) ? $_POST['fm_mobile_head_html'] : '';
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

+4
View File
@@ -35,6 +35,10 @@ if (!auth_check_menu($auth, '200100', 'r', true)) {
$sod = "desc";
}
$allowed_sst = array('mb_datetime');
if ($sst && !in_array($sst, $allowed_sst)) $sst = 'mb_datetime';
if ($sod && !in_array(strtolower($sod), array('asc', 'desc'))) $sod = '';
$sql_order = " order by {$sst} {$sod} ";
$sql = " SELECT count(*) as cnt {$sql_common} {$sql_search} {$sql_order} ";
+1 -1
View File
@@ -11,7 +11,7 @@ auth_check_menu($auth, $sub_menu, 'w');
check_admin_token();
$ma_id = isset($_POST['ma_id']) ? (int) $_POST['ma_id'] : 0;
$ma_subject = isset($_POST['ma_subject']) ? strip_tags(clean_xss_attributes($_POST['ma_subject'])) : '';
$ma_subject = isset($_POST['ma_subject']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['ma_subject'])))) : '';
$ma_content = isset($_POST['ma_content']) ? $_POST['ma_content'] : '';
if ($w == '') {
+5 -5
View File
@@ -275,7 +275,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
<th scope="row"><label for="mb_level">회원 권한</label></th>
<td><?php echo get_member_level_select('mb_level', 1, $member['mb_level'], $mb['mb_level']) ?></td>
<th scope="row">포인트</th>
<td><a href="./point_list.php?sfl=mb_id&amp;stx=<?php echo $mb['mb_id'] ?>" target="_blank"><?php echo number_format($mb['mb_point']) ?></a> 점</td>
<td><a href="./point_list.php?sfl=mb_id&amp;stx=<?php echo $mb['mb_id'] ?>" target="_blank"><?php echo number_format(isset($mb['mb_point']) ? $mb['mb_point'] : 0) ?></a> 점</td>
</tr>
<tr>
<th scope="row"><label for="mb_email">E-mail<strong class="sound_only">필수</strong></label></th>
@@ -338,7 +338,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
<?php echo help('이미지 크기는 <strong>넓이 ' . $config['cf_member_icon_width'] . '픽셀 높이 ' . $config['cf_member_icon_height'] . '픽셀</strong>로 해주세요.') ?>
<input type="file" name="mb_icon" id="mb_icon">
<?php
$mb_dir = substr($mb['mb_id'], 0, 2);
$mb_dir = substr(isset($mb['mb_id']) ? $mb['mb_id'] : '', 0, 2);
$icon_file = G5_DATA_PATH . '/member/' . $mb_dir . '/' . get_mb_icon_name($mb['mb_id']) . '.gif';
if (file_exists($icon_file)) {
$icon_url = str_replace(G5_DATA_PATH, G5_DATA_URL, $icon_file);
@@ -355,7 +355,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
<?php echo help('이미지 크기는 <strong>넓이 ' . $config['cf_member_img_width'] . '픽셀 높이 ' . $config['cf_member_img_height'] . '픽셀</strong>로 해주세요.') ?>
<input type="file" name="mb_img" id="mb_img">
<?php
$mb_dir = substr($mb['mb_id'], 0, 2);
$mb_dir = substr(isset($mb['mb_id']) ? $mb['mb_id'] : '', 0, 2);
$icon_file = G5_DATA_PATH . '/member_image/' . $mb_dir . '/' . get_mb_icon_name($mb['mb_id']) . '.gif';
if (file_exists($icon_file)) {
echo get_member_profile_img($mb['mb_id']);
@@ -559,7 +559,7 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
<span class="provider_name"><?php echo $provider_name; //서비스이름 ?> ( <?php echo $account['displayname']; ?> )</span>
<span class="account_hidden" style="display:none"><?php echo $account['mb_id']; ?></span>
</div>
<div class="btn_info"><a href="<?php echo G5_SOCIAL_LOGIN_URL . '/unlink.php?mp_no=' . $account['mp_no'] ?>" class="social_unlink" data-provider="<?php echo $account['mp_no']; ?>">연동해제</a> <span class="sound_only"><?php echo substr($account['mp_register_day'], 2, 14); ?></span></div>
<div class="btn_info"><a href="<?php echo G5_SOCIAL_LOGIN_URL . '/unlink.php?mp_no=' . $account['mp_no'] ?>" class="social_unlink" data-provider="<?php echo $account['mp_no']; ?>">연동해제</a> <span class="sound_only"><?php echo substr(isset($account['mp_register_day']) ? $account['mp_register_day'] : '', 2, 14); ?></span></div>
</div>
<?php } //end foreach ?>
</li>
@@ -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 } ?>
+7 -2
View File
@@ -127,6 +127,11 @@ $sql_common = " mb_name = '{$posts['mb_name']}',
mb_9 = '{$posts['mb_9']}',
mb_10 = '{$posts['mb_10']}' ";
// 부여하려는 mb_level 상한 검증 (자기보다 높은 권한 부여 차단)
if ($is_admin !== 'super' && (int) $posts['mb_level'] >= (int) $member['mb_level']) {
alert('자신보다 권한이 높거나 같은 등급은 부여할 수 없습니다.');
}
if ($w == '') {
$mb = get_member($mb_id);
if (isset($mb['mb_id']) && $mb['mb_id']) {
@@ -147,7 +152,7 @@ if ($w == '') {
alert('이미 존재하는 이메일입니다.\\nID : ' . $row['mb_id'] . '\\n이름 : ' . $row['mb_name'] . '\\n닉네임 : ' . $row['mb_nick'] . '\\n메일 : ' . $row['mb_email']);
}
$agree_items = [];
$agree_items = array();
// 마케팅 목적의 개인정보 수집 및 이용
if ($mb_marketing_agree == 1) {
$sql_common .= " , mb_marketing_date = '".G5_TIME_YMDHIS."' ";
@@ -230,7 +235,7 @@ if ($w == '') {
// 현재 데이터 조회
$row = sql_fetch("select * from {$g5['member_table']} where mb_id = '{$mb_id}' ");
$agree_items = [];
$agree_items = array();
// 마케팅 목적의 개인정보 수집 및 이용
$sql_marketing_date = "";
+4
View File
@@ -42,6 +42,10 @@ if (!$sst) {
$sod = "desc";
}
$allowed_sst = array('mb_datetime', 'mb_id', 'mb_name', 'mb_nick', 'mb_level', 'mb_point', 'mb_today_login', 'mb_open', 'mb_mailling', 'mb_sms', 'mb_adult', 'mb_certify', 'mb_email_certify', 'mb_intercept_date', 'mb_leave_date');
if ($sst && !in_array($sst, $allowed_sst)) $sst = 'mb_datetime';
if ($sod && !in_array(strtolower($sod), array('asc', 'desc'))) $sod = '';
$sql_order = " order by {$sst} {$sod} ";
$sql = " select count(*) as cnt {$sql_common} {$sql_search} {$sql_order} ";
+27 -21
View File
@@ -21,8 +21,8 @@ define('MEMBER_LOG_DIR', G5_DATA_PATH . "/" . MEMBER_BASE_DIR . "/" . "log");
*/
function get_export_config($type = null)
{
$config = [
'sfl_list' => [
$config = array(
'sfl_list' => array(
'mb_id'=>'아이디',
'mb_name'=>'이름',
'mb_nick'=>'닉네임',
@@ -30,26 +30,26 @@ function get_export_config($type = null)
'mb_tel'=>'전화번호',
'mb_hp'=>'휴대폰번호',
'mb_addr1'=>'주소'
],
'point_cond_map' => [
),
'point_cond_map' => array(
'gte'=>'≥',
'lte'=>'≤',
'eq'=>'='
],
'intercept_list' => [
),
'intercept_list' => array(
'exclude'=>'차단회원 제외',
'only'=>'차단회원만'
],
'ad_range_list' => [
),
'ad_range_list' => array(
'all' => '수신동의 회원 전체',
'mailling_only' => '이메일 수신동의 회원만',
'sms_only' => 'SMS/카카오톡 수신동의 회원만',
'month_confirm' => date('m월').' 수신동의 확인 대상만',
'custom_period' => '수신동의 기간 직접 입력'
],
];
),
);
return $type ? (isset($config[$type]) ? $config[$type] : []) : $config;
return $type ? (isset($config[$type]) ? $config[$type] : array()) : $config;
}
/**
@@ -59,14 +59,14 @@ function get_member_export_params()
{
// 친구톡 양식 - 엑셀 양식에 포함할 항목
$fieldArray = array_map('trim', explode(',', isset($_GET['fields']) ? $_GET['fields'] : ''));
$vars = [];
$vars = array();
foreach ($fieldArray as $index => $field) {
if(!empty($field)){
$vars['var' . ($index + 1)] = $field;
}
}
$params = [
$params = array(
'page' => 1,
'formatType' => (int)(isset($_GET['formatType']) ? $_GET['formatType'] : 1),
'use_stx' => isset($_GET['use_stx']) ? $_GET['use_stx'] : 0,
@@ -92,24 +92,30 @@ function get_member_export_params()
'use_intercept' => isset($_GET['use_intercept']) ? $_GET['use_intercept'] : 0,
'intercept' => clean_xss_tags(isset($_GET['intercept']) ? $_GET['intercept'] : 'exclude'),
'vars' => $vars,
];
);
// 레벨 범위 검증
if ($params['level_start'] > $params['level_end']) {
[$params['level_start'] , $params['level_end']] = [$params['level_end'], $params['level_start']];
$tmp_level = $params['level_start'];
$params['level_start'] = $params['level_end'];
$params['level_end'] = $tmp_level;
}
// 가입기간 - 날짜 범위 검증
if ($params['use_date'] && $params['date_start'] && $params['date_end']) {
if ($params['date_start'] > $params['date_end']) {
[$params['date_start'] , $params['date_end']] = [$params['date_end'], $params['date_start']];
$tmp_date = $params['date_start'];
$params['date_start'] = $params['date_end'];
$params['date_end'] = $tmp_date;
}
}
// 수신동의기간 - 날짜 범위 검증
if ($params['ad_range_type'] == 'custom_period' && $params['agree_date_start'] && $params['agree_date_end']) {
if ($params['agree_date_start'] > $params['agree_date_end']) {
[$params['agree_date_start'] , $params['agree_date_end']] = [$params['agree_date_end'], $params['agree_date_start']];
$tmp_agree_date = $params['agree_date_start'];
$params['agree_date_start'] = $params['agree_date_end'];
$params['agree_date_end'] = $tmp_agree_date;
}
}
@@ -141,7 +147,7 @@ function member_export_get_total_count($params)
function member_export_build_where($params)
{
global $config;
$conditions = [];
$conditions = array();
// 기본 조건 - 탈퇴하지 않은 사용자
$conditions[] = "mb_leave_date = ''";
@@ -241,8 +247,8 @@ function member_export_build_where($params)
} else {
// 수신동의기간 직접 입력 - custom_period
$date_start = isset($params['agree_date_start']) ? $params['agree_date_start'] : '';
$date_end = isset($params['agree_date_end']) ? $params['agree_date_end'] : '';
$date_start = isset($params['agree_date_start']) ? sql_escape_string(trim($params['agree_date_start'])) : '';
$date_end = isset($params['agree_date_end']) ? sql_escape_string(trim($params['agree_date_end'])) : '';
if ($date_start && $date_end) {
$emailDateCond = "mb_mailling_date BETWEEN '{$date_start} 00:00:00' AND '{$date_end} 23:59:59'";
@@ -263,7 +269,7 @@ function member_export_build_where($params)
$conditions[] = "0=1"; // 둘 다 해제 ⇒ 결과 0건
} else {
// 조건 조립
$parts = [];
$parts = array();
if ($useEmail) $parts[] = "(mb_mailling = 1 AND {$emailDateCond})";
if ($useSms) $parts[] = "(mb_sms = 1 AND {$smsDateCond})";
+4 -4
View File
@@ -191,12 +191,12 @@ $colspan = 14;
<?php
$thirdpartyLbl = (!empty($config['cf_sms_use'])) ? ' / <b>개인정보 제3자 제공</b>' : '';
$ad_range_text = [
$ad_range_text = array(
'all' => "* <b>광고성 정보 수신(이메일 또는 SMS/카카오톡)</b> / <b>마케팅 목적의 개인정보 수집 및 이용</b>{$thirdpartyLbl}에 모두 동의한 회원을 선택합니다.",
'mailling_only' => "* <b>광고성 이메일 수신</b> / <b>마케팅 목적의 개인정보 수집 및 이용</b>{$thirdpartyLbl}에 모두 동의한 회원을 선택합니다.",
'sms_only' => "* <b>광고성 SMS/카카오톡 수신</b> / <b>마케팅 목적의 개인정보 수집 및 이용</b>{$thirdpartyLbl}에 모두 동의한 회원을 선택합니다.",
'month_confirm' => "* 23개월 전(" . date('Y년 m월', strtotime('-23 month')) . ") <b>광고성 정보 수신 동의(이메일 또는 SMS/카카오톡)</b>한 회원을 선택합니다."
];
);
if (isset($_GET['ad_range_only'], $_GET['ad_range_type']) && isset($ad_range_text[$_GET['ad_range_type']])) {
echo '<div class="ad_range_box"><p>' . $ad_range_text[$_GET['ad_range_type']] . '</p></div>';
@@ -210,7 +210,7 @@ $colspan = 14;
</div>
<!-- 채널 체크박스 -->
<div class="sch_row <?php echo isset($_GET['ad_range_only']) && in_array($_GET['ad_range_type'], ['month_confirm', 'custom_period']) ? '' : 'is-hidden'; ?>">
<div class="sch_row <?php echo isset($_GET['ad_range_only']) && in_array($_GET['ad_range_type'], array('month_confirm', 'custom_period')) ? '' : 'is-hidden'; ?>">
<div class="ad_range_wrap">
<div class="ad_range_box">
<div class="label">
@@ -480,4 +480,4 @@ function triggerAutoDownload(url, filename) {
</script>
<?php
require_once './admin.tail.php';
require_once './admin.tail.php';
+67 -53
View File
@@ -14,7 +14,7 @@ session_write_close(); // 세션 종료 및 잠금 해제 (백그라운드 작
$params = get_member_export_params();
if (!$params || !is_array($params)) {
member_export_send_progress("error", "데이터가 올바르게 전달되지 않아 작업에 실패하였습니다.");
member_export_write_log([], ['success' => false, 'error' => '데이터가 올바르게 전달되지 않아 작업에 실패하였습니다.']);
member_export_write_log(array(), array('success' => false, 'error' => '데이터가 올바르게 전달되지 않아 작업에 실패하였습니다.'));
exit;
}
@@ -28,7 +28,7 @@ member_export_set_sse_headers();
$mode = isset($_GET['mode']) ? $_GET['mode'] : '';
if ($mode !== 'start') {
member_export_send_progress("error", "잘못된 요청 입니다.");
member_export_write_log($params, ['success' => false, 'error' => '잘못된 요청 입니다.']);
member_export_write_log($params, array('success' => false, 'error' => '잘못된 요청 입니다.'));
exit;
}
@@ -43,7 +43,7 @@ catch (Exception $e)
// 에러 로그 저장 및 SSE 에러 전송
error_log("[Member Export Error] " . $e->getMessage());
member_export_send_progress("error", $e->getMessage());
member_export_write_log($params, ['success' => false, 'error' => $e->getMessage()]);
member_export_write_log($params, array('success' => false, 'error' => $e->getMessage()));
}
/**
@@ -62,7 +62,7 @@ function main_member_export($params)
}
$fileName = 'member_'.MEMBER_BASE_DATE;
$fileList = [];
$fileList = array();
$zipFileName = '';
if ($total > MEMBER_EXPORT_PAGE_SIZE) {
@@ -88,7 +88,7 @@ function main_member_export($params)
$zipResult = member_export_create_zip($fileList, $fileName); // 압축 파일 생성
if($zipResult['error']){
member_export_write_log($params, ['success' => false, 'error' => $zipResult['error']]);
member_export_write_log($params, array('success' => false, 'error' => $zipResult['error']));
member_export_send_progress("zippingError", $zipResult['error']);
}
@@ -107,19 +107,19 @@ function main_member_export($params)
member_export_send_progress("progress", "", 1, $total, $total);
}
member_export_write_log($params, ['success' => true, 'total' => $total, 'files' => $fileList, 'zip' => isset($zipFileName) ? $zipFileName : null]);
member_export_write_log($params, array('success' => true, 'total' => $total, 'files' => $fileList, 'zip' => isset($zipFileName) ? $zipFileName : null));
member_export_send_progress("done", "", 2, $total, $total, $pages, $pages, $fileList, $zipFileName);
}
/**
* 진행률 전송
*/
function member_export_send_progress($status, $message = "", $downloadType = 1, $total = 1, $current = 1, $totalChunks = 1, $currentChunk = 1, $files = [], $zipFile = '')
function member_export_send_progress($status, $message = "", $downloadType = 1, $total = 1, $current = 1, $totalChunks = 1, $currentChunk = 1, $files = array(), $zipFile = '')
{
// 연결 상태 확인
if (connection_aborted()) return;
$data = [
$data = array(
'status' => $status,
'message' => $message,
'downloadType' => $downloadType,
@@ -130,9 +130,10 @@ function member_export_send_progress($status, $message = "", $downloadType = 1,
'files' => $files,
'zipFile' => $zipFile,
'filePath' => G5_DATA_URL . "/" . MEMBER_BASE_DIR . "/" . MEMBER_BASE_DATE,
];
);
echo "data: " . json_encode($data, JSON_UNESCAPED_UNICODE) . "\n\n";
$json_options = defined('JSON_UNESCAPED_UNICODE') ? JSON_UNESCAPED_UNICODE : 0;
echo "data: " . json_encode($data, $json_options) . "\n\n";
// 더 안정적인 플러시
if (ob_get_level()) ob_end_flush();
@@ -145,18 +146,18 @@ function member_export_send_progress($status, $message = "", $downloadType = 1,
function member_export_get_config()
{
$type = 1;
$configs = [
1 => [
'title' => ["회원관리파일(일반)"],
'headers' => ['아이디', '이름', '닉네임', '휴대폰번호', '전화번호', '이메일', '주소', '회원권한', '포인트', '가입일', '차단',
$configs = array(
1 => array(
'title' => array("회원관리파일(일반)"),
'headers' => array('아이디', '이름', '닉네임', '휴대폰번호', '전화번호', '이메일', '주소', '회원권한', '포인트', '가입일', '차단',
'광고성 이메일 수신동의', '광고성 이메일 동의일자', '광고성 SMS/카카오톡 수신동의', '광고성 SMS/카카오톡 동의일자',
'마케팅목적의개인정보수집및이용동의', '마케팅목적의개인정보수집및이용동의일자', '개인정보제3자제공동의', '개인정보제3자제공동의일자'],
'fields' => ['mb_id', 'mb_name', 'mb_nick', 'mb_hp', 'mb_tel', 'mb_email', 'mb_addr1', 'mb_level', 'mb_point', 'mb_datetime', 'mb_intercept_date',
'마케팅목적의개인정보수집및이용동의', '마케팅목적의개인정보수집및이용동의일자', '개인정보제3자제공동의', '개인정보제3자제공동의일자'),
'fields' => array('mb_id', 'mb_name', 'mb_nick', 'mb_hp', 'mb_tel', 'mb_email', 'mb_addr1', 'mb_level', 'mb_point', 'mb_datetime', 'mb_intercept_date',
'mb_mailling','mb_mailling_date', 'mb_sms','mb_sms_date', 'mb_marketing_agree',
'mb_marketing_date', 'mb_thirdparty_agree', 'mb_thirdparty_date'],
'widths' => [20, 20, 20, 20, 20, 30, 30, 10, 15, 25, 10, 20, 25, 20, 25, 20, 25, 20, 25],
],
];
'mb_marketing_date', 'mb_thirdparty_agree', 'mb_thirdparty_date'),
'widths' => array(20, 20, 20, 20, 20, 30, 30, 10, 15, 25, 10, 20, 25, 20, 25, 20, 25, 20, 25),
),
);
return isset($configs[$type]) ? $configs[$type] : $configs[1];
}
@@ -195,7 +196,7 @@ function member_export_get_data($params)
$fields = array_unique($fields);
// SQL 변환 맵 (가공이 필요한 필드만 정의)
$sqlTransformMap = [
$sqlTransformMap = array(
'mb_datetime' => "IF(mb_datetime = '0000-00-00 00:00:00', '', mb_datetime) AS mb_datetime",
'mb_intercept_date' => "IF(mb_intercept_date != '', '차단됨', '정상') AS mb_intercept_date",
'mb_sms' => "IF(mb_sms = '1', '동의', '미동의') AS mb_sms",
@@ -206,10 +207,10 @@ function member_export_get_data($params)
'mb_marketing_date' => "IF(mb_marketing_agree != '1' OR mb_marketing_date = '0000-00-00 00:00:00', '', mb_marketing_date) AS mb_marketing_date",
'mb_thirdparty_agree' => "IF(mb_thirdparty_agree = '1', '동의', '미동의') AS mb_thirdparty_agree",
'mb_thirdparty_date' => "IF(mb_thirdparty_agree != '1' OR mb_thirdparty_date = '0000-00-00 00:00:00', '', mb_thirdparty_date) AS mb_thirdparty_date",
];
);
// SQL 필드 생성
$sqlFields = [];
$sqlFields = array();
foreach ($fields as $field) {
$sqlFields[] = isset($sqlTransformMap[$field]) ? $sqlTransformMap[$field] : $field;
}
@@ -228,12 +229,16 @@ function member_export_get_data($params)
throw new Exception("데이터 조회에 실패하였습니다");
}
$excelData = [$config['title'], $config['headers']];
$excelData = array($config['title'], $config['headers']);
while ($row = sql_fetch_array($result)) {
$rowData = [];
$rowData = array();
foreach ($fields as $field) {
$rowData[] = isset($row[$field]) ? $row[$field] : '';
if (isset($row[$field])) {
$rowData[] = function_exists('csv_safe_cell') ? csv_safe_cell($row[$field]) : $row[$field];
} else {
$rowData[] = '';
}
}
$excelData[] = $rowData;
}
@@ -257,10 +262,10 @@ function member_export_create_excel($data, $fileName, $index = 0)
$currentCache = PHPExcel_Settings::getCacheStorageMethod();
// 캐싱 모드 설정 (엑셀 생성 전용)
$cacheMethods = [
$cacheMethods = array(
PHPExcel_CachedObjectStorageFactory::cache_to_discISAM,
PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized
];
);
foreach ($cacheMethods as $method) {
if (PHPExcel_Settings::setCacheStorageMethod($method)) {
@@ -274,12 +279,12 @@ function member_export_create_excel($data, $fileName, $index = 0)
// 헤더 스타일 적용
$last_char = member_export_column_char(count($config['headers']) - 1);
$sheet->getStyle("A2:{$last_char}2")->applyFromArray([
'fill' => [
$sheet->getStyle("A2:{$last_char}2")->applyFromArray(array(
'fill' => array(
'type' => PHPExcel_Style_Fill::FILL_SOLID,
'startcolor' => ['rgb' => 'D9E1F2'], // 연파랑 배경
],
]);
'startcolor' => array('rgb' => 'D9E1F2'), // 연파랑 배경
),
));
// 셀 정렬 및 줄바꿈 설정
$sheet->getStyle("A:{$last_char}")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)->setWrapText(true);
@@ -309,14 +314,15 @@ function member_export_create_excel($data, $fileName, $index = 0)
}
catch (Exception $e)
{
throw new Exception("엑셀 파일 생성에 실패하였습니다: " . $e->getMessage());
}
finally
{
// 캐싱 모드 원래 상태로 복원
if ($currentCache) {
PHPExcel_Settings::setCacheStorageMethod($currentCache);
}
throw new Exception("엑셀 파일 생성에 실패하였습니다: " . $e->getMessage());
}
// 캐싱 모드 원래 상태로 복원
if ($currentCache) {
PHPExcel_Settings::setCacheStorageMethod($currentCache);
}
return $filename;
@@ -329,7 +335,7 @@ function member_export_create_zip($files, $zipFileName)
{
if (!class_exists('ZipArchive')) {
error_log('[Member Export Error] ZipArchive 클래스를 사용할 수 없습니다.');
return ['error' => '파일을 압축하는 중 문제가 발생했습니다. 개별 파일로 제공됩니다.<br>: ZipArchive 클래스를 사용할 수 없습니다.'];
return array('error' => '파일을 압축하는 중 문제가 발생했습니다. 개별 파일로 제공됩니다.<br>: ZipArchive 클래스를 사용할 수 없습니다.');
}
member_export_ensure_directory(MEMBER_EXPORT_DIR);
@@ -337,7 +343,7 @@ function member_export_create_zip($files, $zipFileName)
$zip = new ZipArchive();
if ($zip->open($destinationZipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
return ['error' => "파일을 압축하는 중 문제가 발생했습니다. 개별 파일로 제공됩니다."];
return array('error' => "파일을 압축하는 중 문제가 발생했습니다. 개별 파일로 제공됩니다.");
}
foreach ($files as $file) {
@@ -349,11 +355,11 @@ function member_export_create_zip($files, $zipFileName)
$result = $zip->close();
return [
return array(
'result' => $result,
'zipFile' => $zipFileName . ".zip",
'zipPath' => $destinationZipPath,
];
);
}
/**
@@ -378,7 +384,7 @@ function member_export_ensure_directory($dir)
* - 알집 생성 완료 시 엑셀 파일 제거
* - 작업 전 오늘 날짜 폴더 및 log 폴더를 제외한 나머지 파일 모두 제거
*/
function member_export_delete($fileList = [])
function member_export_delete($fileList = array())
{
$cnt = 0;
@@ -397,7 +403,7 @@ function member_export_delete($fileList = [])
function deleteFolder($dir) {
foreach (glob($dir . '/{.,}*', GLOB_BRACE) as $item) {
if (in_array(basename($item), ['.', '..'])) continue;
if (in_array(basename($item), array('.', '..'))) continue;
is_dir($item) ? deleteFolder($item) : unlink($item);
}
rmdir($dir);
@@ -424,7 +430,7 @@ function member_export_delete($fileList = [])
/**
* 로그 작성
*/
function member_export_write_log($params, $result = [])
function member_export_write_log($params, $result = array())
{
global $member;
@@ -438,10 +444,13 @@ function member_export_write_log($params, $result = [])
@chmod(MEMBER_LOG_DIR, G5_DIR_PERMISSION);
}
$logFiles = glob(MEMBER_LOG_DIR . "/export_log_*.log") ?: [];
$logFiles = glob(MEMBER_LOG_DIR . "/export_log_*.log");
if (!$logFiles) {
$logFiles = array();
}
// 최신 파일 기준 정렬 (최신 → 오래된)
usort($logFiles, fn($a, $b) => filemtime($b) - filemtime($a));
usort($logFiles, 'member_export_compare_log_mtime');
$latestLogFile = isset($logFiles[0]) ? $logFiles[0] : null;
@@ -464,7 +473,7 @@ function member_export_write_log($params, $result = [])
$status = $success ? '성공' : '실패';
// 조건 정리
$condition = [];
$condition = array();
// 검색 조건
if ($params['use_stx'] == 1 && !empty($params['stx'])) {
@@ -506,11 +515,11 @@ function member_export_write_log($params, $result = [])
$condition[] = "수신동의일: {$params['agree_date_start']}~{$params['agree_date_end']}";
}
if (in_array($params['ad_range_type'], ["month_confirm", "custom_period"])){
$channels = array_filter([
if (in_array($params['ad_range_type'], array("month_confirm", "custom_period"))){
$channels = array_filter(array(
!empty($params['ad_mailling']) && (int)$params['ad_mailling'] === 1 ? '이메일' : null,
!empty($params['ad_sms']) && (int)$params['ad_sms'] === 1 ? 'SMS/카카오톡' : null,
]);
));
if ($channels) {
$condition[] = '수신채널: ' . implode(', ', $channels);
@@ -531,7 +540,7 @@ function member_export_write_log($params, $result = [])
// 성공일 경우 추가 정보
if ($success) {
$total = isset($result['total']) ? $result['total'] : 0;
$fileCount = isset($result['zip']) ? 1 : count(isset($result['files']) ? $result['files'] : []);
$fileCount = isset($result['zip']) ? 1 : count(isset($result['files']) ? $result['files'] : array());
$line1 .= " | 총 {$total}건 | 파일: {$fileCount}개";
}
@@ -548,4 +557,9 @@ function member_export_write_log($params, $result = [])
if (@file_put_contents($latestLogFile, $logEntry, FILE_APPEND | LOCK_EX) === false) {
error_log("[Member Export Error] 로그 파일 기록 실패: {$latestLogFile}");
}
}
}
function member_export_compare_log_mtime($a, $b)
{
return filemtime($b) - filemtime($a);
}
+3 -1
View File
@@ -27,7 +27,7 @@ if ($_POST['act_button'] == "선택수정") {
$post_mb_sms = isset($_POST['mb_sms'][$k]) ? (int) $_POST['mb_sms'][$k] : 0;
$post_mb_open = isset($_POST['mb_open'][$k]) ? (int) $_POST['mb_open'][$k] : 0;
$agree_items = [];
$agree_items = array();
// 광고성 이메일 수신동의 일자 추가
$post_mb_mailling_default = isset($_POST['mb_mailling_default'][$k]) ? (int) $_POST['mb_mailling_default'][$k] : 0;
$sql_mailling_date = "";
@@ -57,6 +57,8 @@ if ($_POST['act_button'] == "선택수정") {
$msg .= $mb['mb_id'] . ' : 회원자료가 존재하지 않습니다.\\n';
} elseif ($is_admin != 'super' && $mb['mb_level'] >= $member['mb_level']) {
$msg .= $mb['mb_id'] . ' : 자신보다 권한이 높거나 같은 회원은 수정할 수 없습니다.\\n';
} elseif ($is_admin != 'super' && $post_mb_level >= (int) $member['mb_level']) {
$msg .= $mb['mb_id'] . ' : 자신보다 권한이 높거나 같은 등급은 부여할 수 없습니다.\\n';
} elseif ($member['mb_id'] == $mb['mb_id']) {
$msg .= $mb['mb_id'] . ' : 로그인 중인 관리자는 수정 할 수 없습니다.\\n';
} else {
+1 -1
View File
@@ -30,7 +30,7 @@ for ($i = 0; $i < $count; $i++) {
$code = is_array($_POST['code']) ? strip_tags($_POST['code'][$i]) : '';
$me_name = is_array($_POST['me_name']) ? strip_tags($_POST['me_name'][$i]) : '';
$me_link = (preg_match('/^javascript/i', $_POST['me_link'][$i]) || preg_match('/script:/i', $_POST['me_link'][$i])) ? G5_URL : strip_tags(clean_xss_attributes($_POST['me_link'][$i]));
$me_link = (preg_match('/^javascript/i', $_POST['me_link'][$i]) || preg_match('/script:/i', $_POST['me_link'][$i])) ? G5_URL : addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['me_link'][$i]))));
if (!$code || !$me_name || !$me_link) {
continue;
+2 -2
View File
@@ -16,7 +16,7 @@ if ($w == 'd') {
check_admin_token();
$nw_subject = isset($_POST['nw_subject']) ? strip_tags(clean_xss_attributes($_POST['nw_subject'])) : '';
$nw_subject = isset($_POST['nw_subject']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['nw_subject'])))) : '';
$posts = array();
$check_keys = array(
@@ -37,7 +37,7 @@ foreach ($check_keys as $key => $val) {
if ($val === 'int') {
$posts[$key] = isset($_POST[$key]) ? (int) $_POST[$key] : 0;
} elseif ($val === 'str') {
$posts[$key] = isset($_POST[$key]) ? clean_xss_tags($_POST[$key], 1, 1) : 0;
$posts[$key] = isset($_POST[$key]) ? addslashes(clean_xss_tags(stripslashes($_POST[$key]), 1, 1)) : 0;
} else {
$posts[$key] = isset($_POST[$key]) ? trim($_POST[$key]) : 0;
}
+7 -2
View File
@@ -43,11 +43,16 @@ foreach ($_POST as $key => $value) {
}
if (in_array($key, $check_keys)) {
$_POST[$key] = strip_tags(clean_xss_attributes($value));
if (preg_match('/^po_cnt[1-9]$/', $key) || in_array($key, array('po_level', 'po_point', 'po_id'), true)) {
$_POST[$key] = (int) $value;
} else {
$_POST[$key] = addslashes(strip_tags(clean_xss_attributes(stripslashes($value))));
}
}
}
$po_id = isset($_POST['po_id']) ? $_POST['po_id'] : '';
$po_id = isset($_POST['po_id']) ? (int) $_POST['po_id'] : 0;
$_POST['po_use'] = isset($_POST['po_use']) ? (int) $_POST['po_use'] : 0;
if ($w == '') {
$sql = " insert {$g5['poll_table']}
+2
View File
@@ -6,6 +6,8 @@ auth_check_menu($auth, $sub_menu, 'r');
// 체크된 자료 삭제
if (isset($_POST['chk']) && is_array($_POST['chk'])) {
check_admin_token();
for ($i = 0; $i < count($_POST['chk']); $i++) {
$pp_id = (int) $_POST['chk'][$i];
+7 -1
View File
@@ -15,12 +15,18 @@ $qaconfig = get_qa_config();
$check_keys = array('qa_title', 'qa_category', 'qa_skin', 'qa_mobile_skin', 'qa_use_email', 'qa_req_email', 'qa_use_hp', 'qa_req_hp', 'qa_use_sms', 'qa_send_number', 'qa_admin_hp', 'qa_admin_email', 'qa_subject_len', 'qa_mobile_subject_len', 'qa_page_rows', 'qa_mobile_page_rows', 'qa_image_width', 'qa_upload_size');
foreach ($check_keys as $key) {
$$key = $_POST[$key] = isset($_POST[$key]) ? strip_tags(clean_xss_attributes($_POST[$key])) : '';
$$key = $_POST[$key] = isset($_POST[$key]) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST[$key])))) : '';
}
$qa_include_head = isset($qa_include_head) ? preg_replace(array("#[\\\]+$#", "#(<\?php|<\?)#i"), "", substr($qa_include_head, 0, 255)) : '';
$qa_include_tail = isset($qa_include_tail) ? preg_replace(array("#[\\\]+$#", "#(<\?php|<\?)#i"), "", substr($qa_include_tail, 0, 255)) : '';
// 최고 관리자가 아니면 include 경로 변경 불가 (board_form_update.php 와 동일 정책)
if ($is_admin !== 'super') {
$qa_include_head = isset($qaconfig['qa_include_head']) ? $qaconfig['qa_include_head'] : '';
$qa_include_tail = isset($qaconfig['qa_include_tail']) ? $qaconfig['qa_include_tail'] : '';
}
// 관리자가 자동등록방지를 사용해야 할 경우
if ($board && ($qaconfig['qa_include_head'] !== $qa_include_head || $qaconfig['qa_include_tail'] !== $qa_include_tail) && function_exists('get_admin_captcha_by') && get_admin_captcha_by()) {
include_once G5_CAPTCHA_PATH . '/captcha.lib.php';
+61 -24
View File
@@ -9,40 +9,76 @@ if (!$config['cf_email_use'])
include_once(G5_LIB_PATH.'/mailer.lib.php');
$token = get_token();
$g5['title'] = '메일 테스트';
include_once('./admin.head.php');
if (isset($_POST['email'])) {
check_admin_token();
$_POST['email'] = strip_tags($_POST['email']);
$email = explode(',', $_POST['email']);
$real_email = array();
$sent_email = array(); // 발송 요청 성공
$failed_email = array(); // 발송 실패 (메일 서버에서 거부/오류)
for ($i=0; $i<count($email); $i++){
if (!preg_match("/([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)\.([0-9a-zA-Z_-]+)/", $email[$i])) continue;
$real_email[] = $email[$i];
mailer($config['cf_admin_email_name'], $config['cf_admin_email'], trim($email[$i]), '[메일검사] 제목', '<span style="font-size:9pt;">[메일검사] 내용<p>이 내용이 제대로 보인다면 보내는 메일 서버에는 이상이 없는것입니다.<p>'.G5_TIME_YMDHIS.'<p>이 메일 주소로는 회신되지 않습니다.</span>', 1);
$to = trim($email[$i]);
$send_result = mailer($config['cf_admin_email_name'], $config['cf_admin_email'], $to, '[메일검사] 제목', '<span style="font-size:9pt;">[메일검사] 내용<p>이 내용이 제대로 보인다면 보내는 메일 서버에는 이상이 없는것입니다.<p>'.G5_TIME_YMDHIS.'<p>이 메일 주소로는 회신되지 않습니다.</span>', 1);
if ($send_result) {
$sent_email[] = $to;
} else {
$failed_email[] = $to;
}
}
if( $real_email ){
if( $sent_email || $failed_email ){
echo '<section>';
echo '<h2>결과메세지</h2>';
echo '<div class="local_desc01 local_desc"><p>';
echo '다음 '.count($real_email).'개의 메일 주소로 테스트 메일 발송이 완료되었습니다.';
echo '</p></div>';
echo '<ul>';
for ($i=0;$i<count($real_email);$i++) {
echo '<li>'.$real_email[$i].'</li>';
echo '<h2>결과 메시지</h2>';
if( $sent_email ){
echo '<div class="local_desc01 local_desc"><p>';
echo '다음 '.count($sent_email).'개의 메일 주소로 테스트 메일 <strong>발송 요청이 성공</strong>했습니다. <strong>수신함 도착 여부는 별도 확인이 필요합니다.</strong>';
echo '</p></div>';
echo '<ul>';
for ($i=0;$i<count($sent_email);$i++) {
echo '<li>'.get_text($sent_email[$i]).'</li>';
}
echo '</ul>';
echo '<div class="local_desc02 local_desc"><p>';
echo '<strong>발송 요청 성공은 사이트가 메일 서버에 메일을 넘겼다는 의미이며, 받은편지함 도착을 보장하지는 않습니다.</strong><br>';
echo '메일이 보이지 않는다면 아래 항목을 순서대로 확인해 주십시오.';
echo '</p></div>';
echo '<ol>';
echo '<li>받은편지함뿐 아니라 <strong>스팸함, 정크메일함, 프로모션함</strong>을 확인합니다.</li>';
echo '<li>네이버, 지메일, 회사메일 등 <strong>서로 다른 메일 주소</strong>로 다시 테스트합니다.</li>';
echo '<li>관리자 메일 주소가 사이트 도메인과 같은지 확인합니다. 도메인이 다르면 스팸으로 분류될 가능성이 높습니다.</li>';
echo '<li>도메인 메일을 사용한다면 <strong>SPF, DKIM, DMARC</strong> 설정을 확인합니다.</li>';
echo '<li>계속 도착하지 않으면 서버 개발자에게 메일 발송 로그를 확인해주세요.</li>';
echo '</ol>';
}
echo '</ul>';
echo '<div class="local_desc02 local_desc"><p>';
echo '해당 주소로 테스트 메일이 도착했는지 확인해 주십시오.<br>';
echo '만약, 테스트 메일이 오지 않는다면 더 다양한 계정의 메일 주소로 메일을 보내 보십시오.<br>';
echo '그래도 메일이 하나도 도착하지 않는다면 메일 서버(sendmail server)의 오류일 가능성이 높으니, 웹 서버관리자에게 문의하여 주십시오.<br>';
echo '도메인을 소유하고 있을시 SPF, DKIM 설정이 필요할수 있습니다.<br>';
echo '</p></div>';
if( $failed_email ){
echo '<div class="local_desc01 local_desc" style="color:#d9534f"><p>';
echo '다음 '.count($failed_email).'개의 메일 주소는 <strong>발송에 실패</strong>했습니다.';
echo '</p></div>';
echo '<ul>';
for ($i=0;$i<count($failed_email);$i++) {
echo '<li>'.get_text($failed_email[$i]).'</li>';
}
echo '</ul>';
echo '<div class="local_desc02 local_desc"><p>';
echo '발송 실패는 받는 사람의 문제가 아니라 <strong>보내는 서버(메일 발송) 설정 문제</strong>일 가능성이 높습니다.<br>';
echo 'SMTP 정보(주소/포트/인증)가 올바른지, 서버에서 메일 발송(sendmail/mail 함수)이 허용되어 있는지 확인하시고, 웹 서버 관리자(호스팅 업체)에게 문의해 주십시오.<br>';
echo '자세한 오류 내용은 서버의 PHP error_log 에 기록됩니다.<br>';
echo '</p></div>';
}
echo '</section>';
}
}
@@ -52,15 +88,16 @@ if (isset($_POST['email'])) {
<h2>테스트 메일 발송</h2>
<div class="local_desc02 local_desc">
<p>
메일서버가 정상적으로 동작 중인지 확인할 수 있습니다.<br>
사이트에서 메일 서버로 메일을 전달할 수 있는지 확인합니다. 이 테스트는 받은편지함 도착을 보장하지 않습니다.<br>
아래 입력칸에 테스트 메일을 발송하실 메일 주소를 입력하시면, [메일검사] 라는 제목으로 테스트 메일을 발송합니다.<br>
보내는 메일주소 : <?php echo get_sanitize_input($config['cf_admin_email']); ?><br>
<?php if (function_exists('domain_mail_host') && $config['cf_admin_email'] && stripos($config['cf_admin_email'], domain_mail_host()) === false) { ?>
<?php echo '외부메일설정이나 기타 설정을 하지 않았다면, 도메인과 다른 헤더로 여겨 스팸이나 차단될 가능성이 있습니다.<br>기본환경설정에서 관리자 메일 주소를 name'.domain_mail_host().' 과 같은 도메인 형식으로 설정할것을 권장합니다.'; ?>
<?php echo '외부메일설정이나 기타 설정을 하지 않았다면, 도메인과 다른 헤더로 여겨 스팸이나 차단될 가능성이 있습니다.<br>외부메일설정이나 기타 설정을 하지 않았다면, 기본환경설정에서 관리자 메일 주소를 name'.domain_mail_host().' 과 같은 도메인 형식으로 설정할것을 권장합니다.'; ?>
<?php } ?>
</p>
</div>
<form name="fsendmailtest" method="post">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<fieldset id="fsendmailtest">
<legend>테스트메일 발송</legend>
<label for="email">받는 메일주소<strong class="sound_only"> 필수</strong></label>
@@ -70,11 +107,11 @@ if (isset($_POST['email'])) {
</form>
<div class="local_desc02 local_desc">
<p>
만약 [메일검사] 라는 내용으로 테스트 메일이 도착하지 않는다면 보내는 메일서버 혹은 받는 메일서버 중 문제가 발생했을 가능성이 있습니다.<br>
따라서 보다 정확한 테스트를 원하신다면 여러 곳으로 테스트 메일을 발송하시기 바랍니다.<br>
테스트 결과가 발송 요청 성공으로 표시되어도 수신 메일 서버의 스팸 정책에 따라 도착하지 않을 수 있습니다.<br>
정확한 확인을 위해 여러 메일 서비스로 테스트하고, 도착하지 않으면 스팸함과 도메인 인증(SPF, DKIM, DMARC)을 확인해 주십시오.<br>
</p>
</div>
</section>
<?php
include_once('./admin.tail.php');
include_once('./admin.tail.php');
+7 -6
View File
@@ -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>
+237 -3
View File
@@ -1,6 +1,45 @@
<?php
if (!defined('_GNUBOARD_')) exit;
function get_shop_skin_dirs($is_mobile=false)
{
global $config;
$skin_path = $is_mobile ? G5_MOBILE_PATH.'/'.G5_SKIN_DIR : G5_SKIN_PATH;
$skins = get_skin_dir('shop', $skin_path);
if(defined('G5_THEME_PATH') && $config['cf_theme']) {
$theme_skin_path = $is_mobile ? G5_THEME_MOBILE_PATH.'/'.G5_SKIN_DIR : G5_THEME_PATH.'/'.G5_SKIN_DIR;
$dirs = get_skin_dir('shop', $theme_skin_path);
if(!empty($dirs)) {
foreach($dirs as $dir) {
$skins[] = 'theme/'.$dir;
}
}
}
return $skins;
}
function check_shop_skin_dir($skin_dir, $label, $is_mobile=false)
{
if( $skin_dir === '' ) {
return;
}
if( preg_match('#\.+(\/|\\\)#', $skin_dir) ){
alert($label.' 폴더명에 포함될수 없는 문자가 들어있습니다.');
}
if( ! is_include_path_check($skin_dir, 1) ){
alert('오류 : 데이터폴더가 포함된 path 또는 잘못된 path 를 포함할수 없습니다.');
}
if( ! in_array($skin_dir, get_shop_skin_dirs($is_mobile), true) ){
alert($label.'을 올바르게 선택해 주십시오.');
}
}
// 상품옵션별재고 또는 상품재고에 더하기
function add_io_stock($it_id, $ct_qty, $io_id="", $io_type=0)
{
@@ -161,6 +200,7 @@ function pg_setting_check($is_print=false){
}
function is_cancel_shop_pg_order($od){
global $default;
$is_od_pg_cancel = false;
@@ -176,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_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;
@@ -186,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);
@@ -201,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;
@@ -241,4 +475,4 @@ function check_order_inicis_tmps(){
set_cookie('admin_visit_time', G5_SERVER_TIME, 3600); //1시간 간격으로 체크
}
} //end function check_order_inicis_tmps;
} //end function check_order_inicis_tmps;
+7 -7
View File
@@ -20,14 +20,14 @@ $bn_bimg = isset($_FILES['bn_bimg']['tmp_name']) ? $_FILES['bn_bimg']['tmp_
$bn_bimg_name = isset($_FILES['bn_bimg']['name']) ? $_FILES['bn_bimg']['name'] : '';
$bn_id = isset($_REQUEST['bn_id']) ? preg_replace('/[^0-9]/', '', $_REQUEST['bn_id']) : 0;
$bn_bimg_del = (isset($_POST['bn_bimg_del']) && $_POST['bn_bimg_del']) ? preg_replace('/[^0-9]/', '', $_POST['bn_id']) : 0;
$bn_url = isset($_POST['bn_url']) ? strip_tags(clean_xss_attributes($bn_url)) : '';
$bn_alt = isset($_POST['bn_alt']) ? strip_tags(clean_xss_attributes($bn_alt)) : '';
$bn_device = isset($_POST['bn_device']) ? clean_xss_tags($_POST['bn_device'], 1, 1) : '';
$bn_position = isset($_POST['bn_position']) ? clean_xss_tags($_POST['bn_position'], 1, 1) : '';
$bn_url = isset($_POST['bn_url']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['bn_url'])))) : '';
$bn_alt = isset($_POST['bn_alt']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['bn_alt'])))) : '';
$bn_device = isset($_POST['bn_device']) ? safe_replace_regex($_POST['bn_device']) : '';
$bn_position = isset($_POST['bn_position']) ? addslashes(clean_xss_tags(stripslashes($_POST['bn_position']), 1, 1)) : '';
$bn_border = isset($_POST['bn_border']) ? (int) $_POST['bn_border'] : 0;
$bn_new_win = isset($_POST['bn_new_win']) ? (int) $_POST['bn_new_win'] : 0;
$bn_begin_time = isset($_POST['bn_begin_time']) ? clean_xss_tags($_POST['bn_begin_time'], 1, 1) : '';
$bn_end_time = isset($_POST['bn_end_time']) ? clean_xss_tags($_POST['bn_end_time'], 1, 1) : '';
$bn_begin_time = isset($_POST['bn_begin_time']) ? safe_replace_regex($_POST['bn_begin_time'], 'time') : '';
$bn_end_time = isset($_POST['bn_end_time']) ? safe_replace_regex($_POST['bn_end_time'], 'time') : '';
$bn_order = isset($_POST['bn_order']) ? (int) $_POST['bn_order'] : 0;
if ($bn_bimg_del) @unlink(G5_DATA_PATH."/banner/$bn_id");
@@ -99,4 +99,4 @@ if ($w == "" || $w == "u")
goto_url("./bannerform.php?w=u&amp;bn_id=$bn_id");
} else {
goto_url("./bannerlist.php");
}
}
+3 -3
View File
@@ -75,7 +75,7 @@ foreach( $check_str_keys as $key=>$val ){
if( $val === 'int' ){
$value = isset($_POST[$key]) ? (int) $_POST[$key] : 0;
} else {
$value = isset($_POST[$key]) ? clean_xss_tags($_POST[$key], 1, 1) : '';
$value = isset($_POST[$key]) ? addslashes(clean_xss_tags(stripslashes($_POST[$key]), 1, 1)) : '';
}
$$key = $_POST[$key] = $value;
}
@@ -123,7 +123,7 @@ if ($w == "" || $w == "u")
$sql = " select mb_id from {$g5['member_table']} where mb_id = '$ca_mb_id' ";
$row = sql_fetch($sql);
if (!$row['mb_id'])
alert("\'$ca_mb_id\' 은(는) 존재하는 회원아이디가 아닙니다.");
alert("'$ca_mb_id' 은(는) 존재하는 회원아이디가 아닙니다.");
}
}
@@ -256,4 +256,4 @@ if ($w == "" || $w == "u")
goto_url("./categoryform.php?w=u&amp;ca_id=$ca_id&amp;$qstr");
} else {
goto_url("./categorylist.php?$qstr");
}
}
+4 -4
View File
@@ -19,7 +19,7 @@ for ($i=0; $i<$post_ca_id_count; $i++)
$sql = " select mb_id from {$g5['member_table']} where mb_id = '".sql_real_escape_string($str_ca_mb_id)."' ";
$row = sql_fetch($sql);
if (!$row['mb_id'])
alert("\'{$str_ca_mb_id}\' 은(는) 존재하는 회원아이디가 아닙니다.", "./categorylist.php?$qstr");
alert("'{$str_ca_mb_id}' 은(는) 존재하는 회원아이디가 아닙니다.", "./categorylist.php?$qstr");
}
$check_files = array();
@@ -51,7 +51,7 @@ for ($i=0; $i<$post_ca_id_count; $i++)
alert('스킨파일명에 포함될수 없는 문자가 들어있습니다.');
}
if( ! is_include_path_check($file) ){
if( ! is_include_path_check($file, 1) ){
alert('오류 : 데이터폴더가 포함된 path 또는 잘못된 path 를 포함할수 없습니다.');
}
@@ -62,7 +62,7 @@ for ($i=0; $i<$post_ca_id_count; $i++)
}
}
$p_ca_name = is_array($_POST['ca_name']) ? strip_tags(clean_xss_attributes($_POST['ca_name'][$i])) : '';
$p_ca_name = is_array($_POST['ca_name']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['ca_name'][$i])))) : '';
$posts = array();
@@ -94,4 +94,4 @@ for ($i=0; $i<$post_ca_id_count; $i++)
}
goto_url("./categorylist.php?$qstr");
goto_url("./categorylist.php?$qstr");
+127 -7
View File
@@ -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>
&nbsp;
<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";
+38 -3
View File
@@ -167,6 +167,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이니시스 카카오페이 사용
@@ -247,12 +253,35 @@ $check_sanitize_keys = array(
foreach( $check_sanitize_keys as $key ){
if( in_array($key, array('de_bank_account')) ){
$$key = isset($_POST[$key]) ? clean_xss_tags($_POST[$key], 1, 1, 0, 0) : '';
$$key = isset($_POST[$key]) ? addslashes(clean_xss_tags(stripslashes($_POST[$key]), 1, 1, 0, 0)) : '';
} else {
$$key = isset($_POST[$key]) ? clean_xss_tags($_POST[$key], 1, 1) : '';
$$key = isset($_POST[$key]) ? addslashes(clean_xss_tags(stripslashes($_POST[$key]), 1, 1)) : '';
}
}
$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 +440,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']}',
@@ -480,4 +515,4 @@ if( $warning_msg ){
alert($warning_msg, "./configform.php");
} else {
goto_url("./configform.php");
}
}
+2 -2
View File
@@ -4,7 +4,7 @@ include_once('./_common.php');
auth_check_menu($auth, $sub_menu, "w");
$cp_id = isset($_REQUEST['cp_id']) ? clean_xss_tags($_REQUEST['cp_id'], 1, 1) : '';
$cp_id = isset($_REQUEST['cp_id']) ? safe_replace_regex($_REQUEST['cp_id'], 'cp_id') : '';
$cp = array(
'cp_method'=>'',
'cp_subject'=>'',
@@ -292,4 +292,4 @@ function form_check(f)
</script>
<?php
include_once (G5_ADMIN_PATH.'/admin.tail.php');
include_once (G5_ADMIN_PATH.'/admin.tail.php');
+4 -2
View File
@@ -6,6 +6,8 @@ auth_check_menu($auth, $sub_menu, "w");
check_admin_token();
$cp_id = isset($_REQUEST['cp_id']) ? safe_replace_regex($_REQUEST['cp_id'], 'cp_id') : '';
$_POST = array_map('trim', $_POST);
$check_sanitize_keys = array(
@@ -25,7 +27,7 @@ $check_sanitize_keys = array(
);
foreach( $check_sanitize_keys as $key ){
$$key = $_POST[$key] = isset($_POST[$key]) ? strip_tags(clean_xss_attributes($_POST[$key])) : '';
$$key = $_POST[$key] = isset($_POST[$key]) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST[$key])))) : '';
}
if(!$_POST['cp_subject'])
@@ -264,4 +266,4 @@ if ($w == '' && (isset($_POST['cp_sms_send']) || isset($_POST['cp_email_send']))
}
}
goto_url('./couponlist.php');
goto_url('./couponlist.php');
+4 -2
View File
@@ -6,6 +6,8 @@ auth_check_menu($auth, $sub_menu, "w");
check_admin_token();
$cz_id = isset($_REQUEST['cz_id']) ? (int) $_REQUEST['cz_id'] : 0;
@mkdir(G5_DATA_PATH."/coupon", G5_DIR_PERMISSION);
@chmod(G5_DATA_PATH."/coupon", G5_DIR_PERMISSION);
@@ -28,7 +30,7 @@ $check_sanitize_keys = array(
);
foreach( $check_sanitize_keys as $key ){
$$key = $_POST[$key] = isset($_POST[$key]) ? strip_tags(clean_xss_attributes($_POST[$key])) : '';
$$key = $_POST[$key] = isset($_POST[$key]) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST[$key])))) : '';
}
if(!$_POST['cz_subject'])
@@ -150,4 +152,4 @@ if($_FILES['cp_img']['tmp_name']) {
sql_query($sql);
}
goto_url('./couponzonelist.php?'.$qstr);
goto_url('./couponzonelist.php?'.$qstr);
+3
View File
@@ -15,6 +15,9 @@ if (!$sst) {
$sst = "cz_id";
$sod = "desc";
}
$allowed_sst = array('cz_id');
if ($sst && !in_array($sst, $allowed_sst)) $sst = 'cz_id';
if ($sod && !in_array(strtolower($sod), array('asc', 'desc'))) $sod = '';
$sql_order = " order by {$sst} {$sod} ";
$sql = " select count(*) as cnt
+425
View File
@@ -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 및 금액이 일치합니다.';
}
}
+77
View File
@@ -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_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');
+265
View File
@@ -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, '', '&amp;');
// 상세보기 링크는 목록으로 돌아올 때 현재 페이지까지 유지하도록 page를 포함한다.
$view_query_string = $query_string.'&amp;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']); ?>&amp;<?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']); ?>&amp;<?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&amp;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.'&amp;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');
+148
View File
@@ -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, '', '&amp;') : '');
$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&amp;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');
+12 -10
View File
@@ -20,6 +20,8 @@ if (!$od['od_id']) {
// 주문정보
$data = unserialize(base64_decode($od['dt_data']));
$data_od_cp_id = isset($data['od_cp_id']) ? safe_replace_regex($data['od_cp_id'], 'cp_id') : '';
$data_sc_cp_id = isset($data['sc_cp_id']) ? safe_replace_regex($data['sc_cp_id'], 'cp_id') : '';
$sql_common = " from {$g5['g5_shop_cart_table']} where od_id = '{$od['cart_id']}' and ct_status = '쇼핑' and ct_select = '1' ";
@@ -38,8 +40,8 @@ if($od['mb_id']) {
$it_cp_cnt = (isset($data['cp_id']) && is_array($data['cp_id'])) ? count($data['cp_id']) : 0;
$arr_it_cp_prc = array();
for($i=0; $i<$it_cp_cnt; $i++) {
$cid = $data['cp_id'][$i];
$it_id = $data['it_id'][$i];
$cid = isset($data['cp_id'][$i]) ? safe_replace_regex($data['cp_id'][$i], 'cp_id') : '';
$it_id = isset($data['it_id'][$i]) ? safe_replace_regex($data['it_id'][$i], 'it_id') : '';
$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'
@@ -98,10 +100,10 @@ if($od['mb_id']) {
$tot_od_price -= $tot_it_cp_price;
// 주문쿠폰
if(isset($data['od_cp_id']) && $data['od_cp_id']) {
if($data_od_cp_id) {
$sql = " select cp_id, cp_type, cp_price, cp_trunc, cp_minimum, cp_maximum
from {$g5['g5_shop_coupon_table']}
where cp_id = '{$data['od_cp_id']}'
where cp_id = '$data_od_cp_id'
and mb_id IN ( '{$od['mb_id']}', '전체회원' )
and cp_method = '2' ";
$cp = sql_fetch($sql);
@@ -134,10 +136,10 @@ $od_send_cost = get_sendcost($od['cart_id']);
$tot_sc_cp_price = 0;
if($od['mb_id'] && $od_send_cost > 0) {
// 배송쿠폰
if($data['sc_cp_id']) {
if($data_sc_cp_id) {
$sql = " select cp_id, cp_type, cp_price, cp_trunc, cp_minimum, cp_maximum
from {$g5['g5_shop_coupon_table']}
where cp_id = '{$data['sc_cp_id']}'
where cp_id = '$data_sc_cp_id'
and mb_id IN ( '{$od['mb_id']}', '전체회원' )
and cp_method = '3' ";
$cp = sql_fetch($sql);
@@ -485,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>
@@ -526,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>
@@ -536,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>
@@ -571,4 +573,4 @@ function del_confirm()
</script>
<?php
include_once(G5_ADMIN_PATH.'/admin.tail.php');
include_once(G5_ADMIN_PATH.'/admin.tail.php');
+27 -19
View File
@@ -30,6 +30,8 @@ if($w == 'd') {
// 주문정보
$data = unserialize(base64_decode($od['dt_data']));
$data_od_cp_id = isset($data['od_cp_id']) ? safe_replace_regex($data['od_cp_id'], 'cp_id') : '';
$data_sc_cp_id = isset($data['sc_cp_id']) ? safe_replace_regex($data['sc_cp_id'], 'cp_id') : '';
$sql_common = " from {$g5['g5_shop_cart_table']} where od_id = '{$od['cart_id']}' and ct_status = '쇼핑' ";
@@ -53,8 +55,8 @@ if($od['mb_id']) {
$it_cp_cnt = (isset($data['cp_id']) && is_array($data['cp_id'])) ? count($data['cp_id']) : 0;
$arr_it_cp_prc = array();
for($i=0; $i<$it_cp_cnt; $i++) {
$cid = $data['cp_id'][$i];
$it_id = $data['it_id'][$i];
$cid = isset($data['cp_id'][$i]) ? safe_replace_regex($data['cp_id'][$i], 'cp_id') : '';
$it_id = isset($data['it_id'][$i]) ? safe_replace_regex($data['it_id'][$i], 'it_id') : '';
$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'
@@ -113,10 +115,10 @@ if($od['mb_id']) {
$tot_od_price -= $tot_it_cp_price;
// 주문쿠폰
if(isset($data['od_cp_id']) && $data['od_cp_id']) {
if($data_od_cp_id) {
$sql = " select cp_id, cp_type, cp_price, cp_trunc, cp_minimum, cp_maximum
from {$g5['g5_shop_coupon_table']}
where cp_id = '{$data['od_cp_id']}'
where cp_id = '$data_od_cp_id'
and mb_id IN ( '{$od['mb_id']}', '전체회원' )
and cp_method = '2' ";
$cp = sql_fetch($sql);
@@ -149,10 +151,10 @@ $od_send_cost = get_sendcost($od['cart_id']);
$tot_sc_cp_price = 0;
if($od['mb_id'] && $od_send_cost > 0) {
// 배송쿠폰
if($data['sc_cp_id']) {
if($data_sc_cp_id) {
$sql = " select cp_id, cp_type, cp_price, cp_trunc, cp_minimum, cp_maximum
from {$g5['g5_shop_coupon_table']}
where cp_id = '{$data['sc_cp_id']}'
where cp_id = '$data_sc_cp_id'
and mb_id IN ( '{$od['mb_id']}', '전체회원' )
and cp_method = '3' ";
$cp = sql_fetch($sql);
@@ -221,7 +223,7 @@ $od_zip2 = substr($od_zip, 3);
$od_addr1 = addslashes(clean_xss_tags($data['od_addr1']));
$od_addr2 = addslashes(clean_xss_tags($data['od_addr2']));
$od_addr3 = addslashes(clean_xss_tags($data['od_addr3']));
$od_addr_jibeon = preg_match("/^(N|R)$/", $data['od_addr_jibeon']) ? $data['od_addr_jibeon'] : '';
$od_addr_jibeon = preg_match("/^(N|R|J)$/", $data['od_addr_jibeon']) ? $data['od_addr_jibeon'] : '';
$od_b_name = addslashes(clean_xss_tags($data['od_b_name']));
$od_b_tel = addslashes(clean_xss_tags($data['od_b_tel']));
$od_b_hp = addslashes(clean_xss_tags($data['od_b_hp']));
@@ -231,7 +233,7 @@ $od_b_zip2 = substr($od_b_zip, 3);
$od_b_addr1 = addslashes(clean_xss_tags($data['od_b_addr1']));
$od_b_addr2 = addslashes(clean_xss_tags($data['od_b_addr2']));
$od_b_addr3 = addslashes(clean_xss_tags($data['od_b_addr3']));
$od_b_addr_jibeon = preg_match("/^(N|R)$/", $data['od_b_addr_jibeon']) ? $data['od_b_addr_jibeon'] : '';
$od_b_addr_jibeon = preg_match("/^(N|R|J)$/", $data['od_b_addr_jibeon']) ? $data['od_b_addr_jibeon'] : '';
$od_memo = addslashes(clean_xss_tags($data['od_memo'], 0, 1, 0, 0));
$od_deposit_name = addslashes(clean_xss_tags($data['od_deposit_name']));
$od_tax_flag = $default['de_tax_flag_use'];
@@ -240,10 +242,10 @@ $od_receipt_point = $od_temp_point;
$od_receipt_time = $od['dt_time'];
$od_misu = 0;
$od_status = '입금';
$od_bank_account = isset($data['od_bank_account']) ? clean_xss_tags($data['od_bank_account'], 1, 1) : '';
$od_bank_account = isset($data['od_bank_account']) ? addslashes(clean_xss_tags(stripslashes($data['od_bank_account']), 1, 1)) : '';
$od_tno = '';
$od_app_no = '';
$od_hope_date = isset($data['od_hope_date']) ? clean_xss_tags($data['od_hope_date'], 1, 1) : '';
$od_hope_date = isset($data['od_hope_date']) ? addslashes(clean_xss_tags(stripslashes($data['od_hope_date']), 1, 1)) : '';
// 주문서에 입력
$sql = " insert {$g5['g5_shop_order_table']}
@@ -321,8 +323,8 @@ if ($od['mb_id'] && $od_receipt_point)
if($od['mb_id']) {
$it_cp_cnt = (isset($data['cp_id']) && is_array($data['cp_id'])) ? count($data['cp_id']) : 0;
for($i=0; $i<$it_cp_cnt; $i++) {
$cid = $data['cp_id'][$i];
$cp_it_id = $data['it_id'][$i];
$cid = isset($data['cp_id'][$i]) ? safe_replace_regex($data['cp_id'][$i], 'cp_id') : '';
$cp_it_id = isset($data['it_id'][$i]) ? safe_replace_regex($data['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(trim($cid)) {
@@ -346,9 +348,9 @@ if($od['mb_id']) {
sql_query($sql);
}
if(isset($data['od_cp_id']) && $data['od_cp_id']) {
if($data_od_cp_id) {
$sql = " insert into {$g5['g5_shop_coupon_log_table']}
set cp_id = '{$data['od_cp_id']}',
set cp_id = '$data_od_cp_id',
mb_id = '{$od['mb_id']}',
od_id = '$od_id',
cp_price = '$tot_od_cp_price',
@@ -356,9 +358,9 @@ if($od['mb_id']) {
sql_query($sql);
}
if(isset($data['sc_cp_id']) && $data['sc_cp_id']) {
if($data_sc_cp_id) {
$sql = " insert into {$g5['g5_shop_coupon_log_table']}
set cp_id = '{$data['sc_cp_id']}',
set cp_id = '$data_sc_cp_id',
mb_id = '{$od['mb_id']}',
od_id = '$od_id',
cp_price = '$tot_sc_cp_price',
@@ -384,10 +386,16 @@ sql_query($sql);
$sql = " delete from {$g5['g5_shop_order_data_table']} where od_id = '$od_id' and dt_pg = '$od_pg' ";
sql_query($sql, true);
$orderform_url = './orderform.php?od_id='.$od_id;
$inorderlist_url = './inorderlist.php?'.str_replace('&amp;', '&', $qstr);
$js_replace = array('\\' => '\\\\', '"' => '\\"', "'" => '\\u0027', '/' => '\\/', "\r" => '\\r', "\n" => '\\n', "\t" => '\\t', '<' => '\\u003C', '>' => '\\u003E', '&' => '\\u0026', "\xE2\x80\xA8" => '\\u2028', "\xE2\x80\xA9" => '\\u2029');
$js_orderform_url = function_exists('get_js_safe_string') ? get_js_safe_string($orderform_url) : '"'.strtr((string)$orderform_url, $js_replace).'"';
$js_inorderlist_url = function_exists('get_js_safe_string') ? get_js_safe_string($inorderlist_url) : '"'.strtr((string)$inorderlist_url, $js_replace).'"';
echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">'.PHP_EOL;
echo '<script>'.PHP_EOL;
echo 'if(confirm("복구하신 주문 상세페이지로 이동하시겠습니까?"))'.PHP_EOL;
echo 'document.location.href = "./orderform.php?od_id='.$od_id.'";'.PHP_EOL;
echo 'document.location.href = '.$js_orderform_url.';'.PHP_EOL;
echo 'else'.PHP_EOL;
echo 'document.location.href = "./inorderlist.php?'.str_replace('&amp;', '&', $qstr).'";'.PHP_EOL;
echo '</script>'.PHP_EOL;
echo 'document.location.href = '.$js_inorderlist_url.';'.PHP_EOL;
echo '</script>'.PHP_EOL;
+10 -1
View File
@@ -24,6 +24,9 @@ if (!$sst) {
$sst = "od_id";
$sod = "desc";
}
$allowed_sst = array('od_id');
if ($sst && !in_array($sst, $allowed_sst)) $sst = 'od_id';
if ($sod && !in_array(strtolower($sod), array('asc', 'desc'))) $sod = '';
$sql_order = " order by {$sst} {$sod} ";
$sql = " select count(*) as cnt
@@ -104,6 +107,12 @@ $colspan = 10;
case 'lg':
$pg = 'LGU+';
break;
case 'toss':
$pg = '토스페이먼츠';
break;
case 'nicepay':
$pg = 'NICEPAY';
break;
default:
$pg = 'KCP';
break;
@@ -127,7 +136,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']; ?>&amp;<?php echo $qstr; ?>" class="btn btn_03"><span class="sound_only"><?php echo $row['od_id']; ?> </span>보기</a>
+2 -2
View File
@@ -33,7 +33,7 @@ $ev_mobile_list_row = isset($_POST['ev_mobile_list_row']) ? (int) $_POST['ev_mob
$ev_use = isset($_POST['ev_use']) ? (int) $_POST['ev_use'] : 0;
$ev_subject_strong = isset($_POST['ev_subject_strong']) ? (int) $_POST['ev_subject_strong'] : 0;
$ev_subject = isset($_POST['ev_subject']) ? clean_xss_tags($_POST['ev_subject'], 1, 1) : '';
$ev_subject = isset($_POST['ev_subject']) ? addslashes(clean_xss_tags(stripslashes($_POST['ev_subject']), 1, 1)) : '';
$ev_head_html = isset($_POST['ev_head_html']) ? $_POST['ev_head_html'] : '';
$ev_tail_html = isset($_POST['ev_tail_html']) ? $_POST['ev_tail_html'] : '';
@@ -129,4 +129,4 @@ if ($w == "" || $w == "u")
else
{
goto_url("./itemevent.php");
}
}
+2
View File
@@ -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++)
+2
View File
@@ -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);
+2 -2
View File
@@ -105,7 +105,7 @@ else if ($w == "u")
and b.ca_mb_id = '{$member['mb_id']}' ";
$row = sql_fetch($sql);
if (!$row['it_id'])
alert("\'{$member['mb_id']}\' 님께서 수정 할 권한이 없는 상품입니다.");
alert("'{$member['mb_id']}' 님께서 수정 할 권한이 없는 상품입니다.");
}
$it = get_shop_item($it_id);
@@ -1901,4 +1901,4 @@ categorychange(document.fitemform);
</script>
<?php
include_once (G5_ADMIN_PATH.'/admin.tail.php');
include_once (G5_ADMIN_PATH.'/admin.tail.php');
+16 -4
View File
@@ -319,7 +319,7 @@ for($i=0; $i<$count_ii_article; $i++) {
}
$it_info_value = addslashes(serialize($value_array));
$it_name = isset($_POST['it_name']) ? strip_tags(clean_xss_attributes(trim($_POST['it_name']))) : '';
$it_name = isset($_POST['it_name']) ? addslashes(strip_tags(clean_xss_attributes(trim(stripslashes($_POST['it_name']))))) : '';
// KVE-2019-0708
$check_sanitize_keys = array(
@@ -356,7 +356,7 @@ $check_sanitize_keys = array(
);
foreach( $check_sanitize_keys as $key ){
$$key = isset($_POST[$key]) ? strip_tags(clean_xss_attributes($_POST[$key])) : '';
$$key = isset($_POST[$key]) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST[$key])))) : '';
}
$it_basic = preg_replace('#<script(.*?)>(.*?)<\/script>#is', '', $it_basic);
@@ -365,6 +365,18 @@ $it_explan = isset($_POST['it_explan']) ? $_POST['it_explan'] : '';
if ($it_name == "")
alert("상품명을 입력해 주십시오.");
// 상품 스킨은 파일 경로가 아니라 스킨 디렉토리명(basic, theme/basic 등)을 저장한다.
$it_skin = isset($_POST['it_skin']) ? trim(strip_tags(clean_xss_attributes(stripslashes($_POST['it_skin'])))) : '';
$it_mobile_skin = isset($_POST['it_mobile_skin']) ? trim(strip_tags(clean_xss_attributes(stripslashes($_POST['it_mobile_skin'])))) : '';
if (function_exists('check_shop_skin_dir')) {
check_shop_skin_dir($it_skin, 'PC용 스킨');
check_shop_skin_dir($it_mobile_skin, '모바일용 스킨', true);
}
$it_skin = addslashes($it_skin);
$it_mobile_skin = addslashes($it_mobile_skin);
$sql_common = " ca_id = '$ca_id',
ca_id2 = '$ca_id2',
ca_id3 = '$ca_id3',
@@ -384,7 +396,7 @@ $sql_common = " ca_id = '$ca_id',
it_type5 = '$it_type5',
it_basic = '$it_basic',
it_explan = '$it_explan',
it_explan2 = '".strip_tags(trim(clean_xss_attributes($it_explan)))."',
it_explan2 = '".addslashes(strip_tags(trim(clean_xss_attributes(stripslashes($it_explan)))))."',
it_mobile_explan = '$it_mobile_explan',
it_cust_price = '$it_cust_price',
it_price = '$it_price',
@@ -487,7 +499,7 @@ else if ($w == "d")
and b.ca_mb_id = '{$member['mb_id']}' ";
$row = sql_fetch($sql);
if (!$row['it_id'])
alert("\'{$member['mb_id']}\' 님께서 삭제 할 권한이 없는 상품입니다.");
alert("'{$member['mb_id']}' 님께서 삭제 할 권한이 없는 상품입니다.");
}
itemdelete($it_id);
+9 -4
View File
@@ -29,17 +29,22 @@ if ($post_act_button == "선택수정") {
$p_ca_id = (isset($_POST['ca_id']) && is_array($_POST['ca_id'])) ? strip_tags($_POST['ca_id'][$k]) : '';
$p_ca_id2 = (isset($_POST['ca_id2']) && is_array($_POST['ca_id2'])) ? strip_tags($_POST['ca_id2'][$k]) : '';
$p_ca_id3 = (isset($_POST['ca_id3']) && is_array($_POST['ca_id3'])) ? strip_tags($_POST['ca_id3'][$k]) : '';
$p_it_name = (isset($_POST['it_name']) && is_array($_POST['it_name'])) ? strip_tags(clean_xss_attributes($_POST['it_name'][$k])) : '';
$p_it_name = (isset($_POST['it_name']) && is_array($_POST['it_name'])) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['it_name'][$k])))) : '';
$p_it_cust_price = (isset($_POST['it_cust_price']) && is_array($_POST['it_cust_price'])) ? strip_tags($_POST['it_cust_price'][$k]) : '';
$p_it_price = (isset($_POST['it_price']) && is_array($_POST['it_price'])) ? strip_tags($_POST['it_price'][$k]) : '';
$p_it_stock_qty = (isset($_POST['it_stock_qty']) && is_array($_POST['it_stock_qty'])) ? strip_tags($_POST['it_stock_qty'][$k]) : '';
$p_it_skin = (isset($_POST['it_skin']) && is_array($_POST['it_skin'])) ? strip_tags($_POST['it_skin'][$k]) : '';
$p_it_mobile_skin = (isset($_POST['it_mobile_skin']) && is_array($_POST['it_mobile_skin'])) ? strip_tags($_POST['it_mobile_skin'][$k]) : '';
$p_it_skin = (isset($_POST['it_skin']) && is_array($_POST['it_skin'])) ? trim(strip_tags(clean_xss_attributes(stripslashes($_POST['it_skin'][$k])))) : '';
$p_it_mobile_skin = (isset($_POST['it_mobile_skin']) && is_array($_POST['it_mobile_skin'])) ? trim(strip_tags(clean_xss_attributes(stripslashes($_POST['it_mobile_skin'][$k])))) : '';
$p_it_use = isset($_POST['it_use'][$k]) ? clean_xss_tags($_POST['it_use'][$k], 1, 1) : 0;
$p_it_soldout = isset($_POST['it_soldout'][$k]) ? clean_xss_tags($_POST['it_soldout'][$k], 1, 1) : 0;
$p_it_order = (isset($_POST['it_order']) && is_array($_POST['it_order'])) ? strip_tags($_POST['it_order'][$k]) : '';
$p_it_id = isset($_POST['it_id'][$k]) ? preg_replace('/[^a-z0-9_\-]/i', '', $_POST['it_id'][$k]) : '';
if (function_exists('check_shop_skin_dir')) {
check_shop_skin_dir($p_it_skin, 'PC용 스킨');
check_shop_skin_dir($p_it_mobile_skin, '모바일용 스킨', true);
}
if ($is_admin != 'super') { // 최고관리자가 아니면 체크
$sql = "select a.it_id, b.ca_mb_id from {$g5['g5_shop_item_table']} a , {$g5['g5_shop_category_table']} b where (a.ca_id = b.ca_id) and a.it_id = '$p_it_id'";
$checks = sql_fetch($sql);
@@ -89,4 +94,4 @@ if ($post_act_button == "선택수정") {
}
}
goto_url("./itemlist.php?sca=$sca&amp;sst=$sst&amp;sod=$sod&amp;sfl=$sfl&amp;stx=$stx&amp;page=$page");
goto_url("./itemlist.php?sca=$sca&amp;sst=$sst&amp;sod=$sod&amp;sfl=$sfl&amp;stx=$stx&amp;page=$page");
+4 -2
View File
@@ -18,8 +18,10 @@ foreach($check_keys as $key){
if( in_array($key, array('is_content', 'is_reply_content')) ){
$posts[$key] = isset($_POST[$key]) ? $_POST[$key] : '';
} else if( $key === 'is_id' ) {
$posts[$key] = isset($_POST[$key]) ? (int) $_POST[$key] : 0;
} else {
$posts[$key] = isset($_POST[$key]) ? clean_xss_tags($_POST[$key], 1, 1) : '';
$posts[$key] = isset($_POST[$key]) ? addslashes(clean_xss_tags(stripslashes($_POST[$key]), 1, 1)) : '';
}
}
@@ -46,4 +48,4 @@ if ($w == "u")
else
{
alert();
}
}
+11 -11
View File
@@ -30,17 +30,17 @@ if(! function_exists('column_char')) {
$rows = array();
for($i=1; $row=sql_fetch_array($result); $i++) {
$rows[] =
array(' '.$row['od_id'],
$row['od_name'],
' '.$row['od_tel'],
' '.$row['od_hp'],
$row['od_b_name'],
' '.$row['od_b_tel'],
' '.$row['od_b_hp'],
print_address($row['od_b_addr1'], $row['od_b_addr2'], $row['od_b_addr3'], $row['od_b_addr_jibeon']),
$row['od_delivery_company'],
$row['od_invoice']);
$rows[] =
array(' '.$row['od_id'],
function_exists('csv_safe_cell') ? csv_safe_cell($row['od_name']) : $row['od_name'],
' '.$row['od_tel'],
' '.$row['od_hp'],
function_exists('csv_safe_cell') ? csv_safe_cell($row['od_b_name']) : $row['od_b_name'],
' '.$row['od_b_tel'],
' '.$row['od_b_hp'],
function_exists('csv_safe_cell') ? csv_safe_cell(print_address($row['od_b_addr1'], $row['od_b_addr2'], $row['od_b_addr3'], $row['od_b_addr_jibeon'])) : print_address($row['od_b_addr1'], $row['od_b_addr2'], $row['od_b_addr3'], $row['od_b_addr_jibeon']),
function_exists('csv_safe_cell') ? csv_safe_cell($row['od_delivery_company']) : $row['od_delivery_company'],
function_exists('csv_safe_cell') ? csv_safe_cell($row['od_invoice']) : $row['od_invoice']);
}
$data = array_merge(array($headers), $rows);
+2
View File
@@ -6,6 +6,8 @@ include_once(G5_LIB_PATH.'/mailer.lib.php');
auth_check_menu($auth, $sub_menu, "w");
check_admin_token();
define("_ORDERMAIL_", true);
$sms_count = 0;
+9 -3
View File
@@ -382,8 +382,8 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js
<input type="hidden" name="sel_field" value="<?php echo $sel_field; ?>">
<input type="hidden" name="search" value="<?php echo $search; ?>">
<input type="hidden" name="page" value="<?php echo $page; ?>">
<input type="hidden" name="od_name" value="<?php echo $od['od_name']; ?>">
<input type="hidden" name="od_hp" value="<?php echo $od['od_hp']; ?>">
<input type="hidden" name="od_name" value="<?php echo get_text($od['od_name']); ?>">
<input type="hidden" name="od_hp" value="<?php echo get_text($od['od_hp']); ?>">
<input type="hidden" name="od_tno" value="<?php echo $od['od_tno']; ?>">
<input type="hidden" name="od_escrow" value="<?php echo $od['od_escrow']; ?>">
<input type="hidden" name="od_pg" value="<?php echo $od['od_pg']; ?>">
@@ -1110,7 +1110,13 @@ function form_submit(f)
var cancel_pg = "PG사의 <?php echo $od['od_settle_case']; ?>";
<?php } ?>
if(chk_cnt == chked_cnt) {
// 체크하지 않은 나머지 품목이 모두 취소류 상태이면 이번 처리로 주문 전체가 취소된다.
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(confirm(cancel_pg+" 결제를 함께 취소하시겠습니까?\n\n한번 취소한 결제는 다시 복구할 수 없습니다.")) {
f.pg_cancel.value = 1;
msg = cancel_pg+" 결제 취소와 함께 ";
+143 -9
View File
@@ -19,6 +19,133 @@ if (in_array($_POST['ct_status'], $status_normal) || in_array($_POST['ct_status'
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;
}
}
}
}
}
}
}
$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) : '';
@@ -227,15 +354,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') {
@@ -376,6 +507,9 @@ $qstr = "sort1=$sort1&amp;sort2=$sort2&amp;sel_field=$sel_field&amp;search=$sear
$url = "./orderform.php?od_id=$od_id&amp;$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 +520,4 @@ if($pg_cancel == 1 && $pg_res_cd && $pg_res_msg) {
alert("포인트로 결제한 주문은,\\n\\n주문상태 변경으로 인해 포인트의 가감이 발생하는 경우\\n\\n회원관리 > 포인트관리에서 수작업으로 포인트를 맞추어 주셔야 합니다.", $url);
else
goto_url($url);
}
}
+2 -2
View File
@@ -35,7 +35,7 @@ $check_keys = array(
$posts = array();
foreach($check_keys as $key){
$posts[$key] = isset($_POST[$key]) ? clean_xss_tags($_POST[$key], 1, 1) : '';
$posts[$key] = isset($_POST[$key]) ? addslashes(clean_xss_tags(stripslashes($_POST[$key]), 1, 1)) : '';
}
$od_send_mail = $posts['od_send_mail'];
@@ -175,4 +175,4 @@ if($posts['od_tno'] && $posts['od_escrow'] == 1)
$qstr = "sort1=$sort1&amp;sort2=$sort2&amp;sel_field=$sel_field&amp;search=$search&amp;page=$page";
goto_url("./orderform.php?od_id=$od_id&amp;$qstr");
goto_url("./orderform.php?od_id=$od_id&amp;$qstr");
+20 -18
View File
@@ -2,9 +2,11 @@
$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']) ? strip_tags($_POST['od_shop_memo']) : '';
$od_shop_memo = isset($_POST['od_shop_memo']) ? addslashes(strip_tags(stripslashes($_POST['od_shop_memo']))) : '';
$od_id = isset($_POST['od_id']) ? safe_replace_regex($_POST['od_id'], 'od_id') : '';
$search = isset($_REQUEST['search']) ? get_search_string($_REQUEST['search']) : '';
@@ -17,22 +19,22 @@ if(isset($_POST['mod_type']) && $_POST['mod_type'] === 'info') {
$od_zip2 = isset($_POST['od_zip']) ? preg_replace('/[^0-9]/', '', substr($_POST['od_zip'], 3)) : '';
$od_b_zip1 = isset($_POST['od_b_zip']) ? preg_replace('/[^0-9]/', '', substr($_POST['od_b_zip'], 0, 3)) : '';
$od_b_zip2 = isset($_POST['od_b_zip']) ? preg_replace('/[^0-9]/', '', substr($_POST['od_b_zip'], 3)) : '';
$od_email = isset($_POST['od_email']) ? strip_tags(clean_xss_attributes($_POST['od_email'])) : '';
$od_name = isset($_POST['od_name']) ? clean_xss_tags($_POST['od_name'], 1, 1) : '';
$od_tel = isset($_POST['od_tel']) ? clean_xss_tags($_POST['od_tel'], 1, 1) : '';
$od_hp = isset($_POST['od_hp']) ? clean_xss_tags($_POST['od_hp'], 1, 1) : '';
$od_addr1 = isset($_POST['od_addr1']) ? clean_xss_tags($_POST['od_addr1'], 1, 1) : '';
$od_addr2 = isset($_POST['od_addr2']) ? clean_xss_tags($_POST['od_addr2'], 1, 1) : '';
$od_addr3 = isset($_POST['od_addr3']) ? clean_xss_tags($_POST['od_addr3'], 1, 1) : '';
$od_addr_jibeon = isset($_POST['od_addr_jibeon']) ? clean_xss_tags($_POST['od_addr_jibeon'], 1, 1) : '';
$od_b_name = isset($_POST['od_b_name']) ? clean_xss_tags($_POST['od_b_name'], 1, 1) : '';
$od_b_tel = isset($_POST['od_b_tel']) ? clean_xss_tags($_POST['od_b_tel'], 1, 1) : '';
$od_b_hp = isset($_POST['od_b_hp']) ? clean_xss_tags($_POST['od_b_hp'], 1, 1) : '';
$od_b_addr1 = isset($_POST['od_b_addr1']) ? clean_xss_tags($_POST['od_b_addr1'], 1, 1) : '';
$od_b_addr2 = isset($_POST['od_b_addr2']) ? clean_xss_tags($_POST['od_b_addr2'], 1, 1) : '';
$od_b_addr3 = isset($_POST['od_b_addr3']) ? clean_xss_tags($_POST['od_b_addr3'], 1, 1) : '';
$od_b_addr_jibeon = isset($_POST['od_b_addr_jibeon']) ? clean_xss_tags($_POST['od_b_addr_jibeon'], 1, 1) : '';
$od_hope_date = isset($_POST['od_hope_date']) ? clean_xss_tags($_POST['od_hope_date'], 1, 1) : '';
$od_email = isset($_POST['od_email']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['od_email'])))) : '';
$od_name = isset($_POST['od_name']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_name']), 1, 1)) : '';
$od_tel = isset($_POST['od_tel']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_tel']), 1, 1)) : '';
$od_hp = isset($_POST['od_hp']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_hp']), 1, 1)) : '';
$od_addr1 = isset($_POST['od_addr1']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_addr1']), 1, 1)) : '';
$od_addr2 = isset($_POST['od_addr2']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_addr2']), 1, 1)) : '';
$od_addr3 = isset($_POST['od_addr3']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_addr3']), 1, 1)) : '';
$od_addr_jibeon = isset($_POST['od_addr_jibeon']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_addr_jibeon']), 1, 1)) : '';
$od_b_name = isset($_POST['od_b_name']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_b_name']), 1, 1)) : '';
$od_b_tel = isset($_POST['od_b_tel']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_b_tel']), 1, 1)) : '';
$od_b_hp = isset($_POST['od_b_hp']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_b_hp']), 1, 1)) : '';
$od_b_addr1 = isset($_POST['od_b_addr1']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_b_addr1']), 1, 1)) : '';
$od_b_addr2 = isset($_POST['od_b_addr2']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_b_addr2']), 1, 1)) : '';
$od_b_addr3 = isset($_POST['od_b_addr3']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_b_addr3']), 1, 1)) : '';
$od_b_addr_jibeon = isset($_POST['od_b_addr_jibeon']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_b_addr_jibeon']), 1, 1)) : '';
$od_hope_date = isset($_POST['od_hope_date']) ? addslashes(clean_xss_tags(stripslashes($_POST['od_hope_date']), 1, 1)) : '';
$sql = " update {$g5['g5_shop_order_table']}
set od_name = '$od_name',
@@ -66,4 +68,4 @@ sql_query($sql);
$qstr = "sort1=$sort1&amp;sort2=$sort2&amp;sel_field=$sel_field&amp;search=$search&amp;page=$page";
goto_url("./orderform.php?od_id=$od_id&amp;$qstr");
goto_url("./orderform.php?od_id=$od_id&amp;$qstr");
+2
View File
@@ -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;
+2
View File
@@ -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);
+5 -1
View File
@@ -70,13 +70,17 @@ $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 free_mny = 0;
if(typeof f.mod_free.mny.value != "undefined")
if(typeof f.mod_free_mny.value != "undefined")
free_mny = parseInt(f.mod_free_mny.value.replace("/[^0-9]/g", ""));
if(!tax_mny && !free_mny) {
+2
View File
@@ -4,6 +4,8 @@ include_once('./_common.php');
auth_check_menu($auth, $sub_menu, "w");
check_admin_token();
$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;
+14 -14
View File
@@ -118,21 +118,21 @@ if ($csv == 'csv')
}
echo '"\''.$row['od_b_zip1'].$row['od_b_zip2'].'"\''.',';
echo '"'.$pull_address.'"'.',';
echo '"'.$row['od_b_name'].'"'.',';
echo '"'.(function_exists('csv_safe_cell') ? csv_safe_cell($pull_address) : $pull_address).'"'.',';
echo '"'.(function_exists('csv_safe_cell') ? csv_safe_cell($row['od_b_name']) : $row['od_b_name']).'"'.',';
//echo '"'.multibyte_digit((string)$row[od_b_tel]).'"'.',';
//echo '"'.multibyte_digit((string)$row[od_b_hp]).'"'.',';
echo '"'.conv_telno($row['od_b_tel']) . '"'.',';
echo '"'.conv_telno($row['od_b_hp']) . '"'.',';
echo '"'.preg_replace("/\"/", "&#034;", $row['it_name']) . '"'.',';
echo '"'.(function_exists('csv_safe_cell') ? csv_safe_cell(preg_replace("/\"/", "&#034;", $row['it_name'])) : preg_replace("/\"/", "&#034;", $row['it_name'])) . '"'.',';
echo '"'.$row['ct_qty'].'"'.',';
echo '"'.$row['ct_option'].'"'.',';
echo '"'.(function_exists('csv_safe_cell') ? csv_safe_cell($row['ct_option']) : $row['ct_option']).'"'.',';
echo '"'.$ct_send_cost.'"'.',';
echo '"\''.$row['it_id'].'\'"'.',';
echo '"\''.$row['od_id'].'\'"'.',';
echo '"'.$row['od_invoice'].'"'.',';
echo '"'.(function_exists('csv_safe_cell') ? csv_safe_cell($row['od_invoice']) : $row['od_invoice']).'"'.',';
//echo '"'.preg_replace("/\"/", "&#034;", preg_replace("/\n/", "", $row[od_memo])).'"';
echo '"'.preg_replace("/\"/", "&#034;", $row['od_memo']).'"';
echo '"'.(function_exists('csv_safe_cell') ? csv_safe_cell(preg_replace("/\"/", "&#034;", $row['od_memo'])) : preg_replace("/\"/", "&#034;", $row['od_memo'])).'"';
echo "\n";
}
if ($i == 0)
@@ -217,18 +217,18 @@ if ($csv == 'xls')
}
$rows[] = array(' '.$row['od_b_zip1'].$row['od_b_zip2'],
$pull_address,
$row['od_b_name'],
' '.conv_telno($row['od_b_tel']),
' '.conv_telno($row['od_b_hp']),
preg_replace("/\"/", "&#034;", $row['it_name']),
' '.$row['ct_qty'],
$row['ct_option'],
function_exists('csv_safe_cell') ? csv_safe_cell($pull_address) : $pull_address,
function_exists('csv_safe_cell') ? csv_safe_cell($row['od_b_name']) : $row['od_b_name'],
' '.conv_telno($row['od_b_tel']),
' '.conv_telno($row['od_b_hp']),
function_exists('csv_safe_cell') ? csv_safe_cell(preg_replace("/\"/", "&#034;", $row['it_name'])) : preg_replace("/\"/", "&#034;", $row['it_name']),
' '.$row['ct_qty'],
function_exists('csv_safe_cell') ? csv_safe_cell($row['ct_option']) : $row['ct_option'],
$ct_send_cost,
' '.$row['it_id'],
' '.$row['od_id'],
' '.$row['od_invoice'],
preg_replace("/\"/", "&#034;", $row['od_memo']));
function_exists('csv_safe_cell') ? csv_safe_cell(preg_replace("/\"/", "&#034;", $row['od_memo'])) : preg_replace("/\"/", "&#034;", $row['od_memo']));
}
$data = array_merge(array($headers), $rows);
+2
View File
@@ -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'])
+4 -4
View File
@@ -4,7 +4,7 @@ include_once('./_common.php');
check_admin_token();
$pp_name = isset($_POST['pp_name']) ? strip_tags(clean_xss_attributes($_POST['pp_name'])) : '';
$pp_name = isset($_POST['pp_name']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_POST['pp_name'])))) : '';
$pp_id = isset($_REQUEST['pp_id']) ? preg_replace('/[^0-9]/', '', $_REQUEST['pp_id']) : 0;
$pp_price = isset($_POST['pp_price']) ? preg_replace('/[^0-9]/', '', $_REQUEST['pp_price']) : 0;
@@ -40,8 +40,8 @@ if($w == 'd') {
$post_pp_content = isset($_POST['pp_content']) ? $_POST['pp_content'] : '';
$post_pp_receipt_price = isset($_POST['pp_receipt_price']) ? (int) $_POST['pp_receipt_price'] : 0;
$post_pp_settle_case = isset($_POST['pp_settle_case']) ? clean_xss_tags($_POST['pp_settle_case'], 1, 1) : '';
$post_pp_receipt_time = isset($_POST['pp_receipt_time']) ? clean_xss_tags($_POST['pp_receipt_time'], 1, 1) : '';
$post_pp_settle_case = isset($_POST['pp_settle_case']) ? addslashes(clean_xss_tags(stripslashes($_POST['pp_settle_case']), 1, 1)) : '';
$post_pp_receipt_time = isset($_POST['pp_receipt_time']) ? safe_replace_regex($_POST['pp_receipt_time'], 'time') : '';
$post_pp_shop_memo = isset($_POST['pp_shop_memo']) ? $_POST['pp_shop_memo'] : '';
$post_pp_use = isset($_POST['pp_use']) ? (int) $_POST['pp_use'] : 0;
@@ -79,4 +79,4 @@ if($w == '') {
if($popup == 'yes')
alert_close('개인결제가 추가됐습니다.');
else
goto_url('./personalpayform.php?w=u&amp;pp_id='.$pp_id.'&amp;'.$qstr);
goto_url('./personalpayform.php?w=u&amp;pp_id='.$pp_id.'&amp;'.$qstr);
+3
View File
@@ -27,6 +27,9 @@ if (!$sst) {
$sst = "pp_id";
$sod = "desc";
}
$allowed_sst = array('pp_id', 'od_id', 'pp_receipt_time');
if ($sst && !in_array($sst, $allowed_sst)) $sst = 'pp_id';
if ($sod && !in_array(strtolower($sod), array('asc', 'desc'))) $sod = '';
$sql_order = " order by {$sst} {$sod} ";
$sql = " select count(*) as cnt
+1 -1
View File
@@ -87,7 +87,7 @@ $result = sql_query($sql);
?>
<tr>
<td class="td_alignc"><a href="./orderform.php?od_id=<?php echo $row['od_id']; ?>"><?php echo $row['od_id']; ?></a></td>
<td class="td_name"><?php echo $href; ?><?php echo $row['od_name']; ?></a></td>
<td class="td_name"><?php echo $href; ?><?php echo get_text($row['od_name']); ?></a></td>
<td class="td_numsum"><?php echo number_format($row['orderprice']); ?></td>
<td class="td_numincome"><?php echo number_format($row['couponprice']); ?></td>
<td class="td_numincome"><?php echo number_format($receipt_bank); ?></td>
+2 -2
View File
@@ -22,7 +22,7 @@ if($w == 'd') {
sql_query(" delete from {$g5['g5_shop_sendcost_table']} where sc_id = '$sc_id' ");
}
} else {
$sc_name = isset($_POST['sc_name']) ? trim(strip_tags(clean_xss_attributes($_POST['sc_name']))) : '';
$sc_name = isset($_POST['sc_name']) ? addslashes(trim(strip_tags(clean_xss_attributes(stripslashes($_POST['sc_name']))))) : '';
$sc_zip1 = isset($_POST['sc_zip1']) ? preg_replace('/[^0-9]/', '', $_POST['sc_zip1']) : '';
$sc_zip2 = isset($_POST['sc_zip2']) ? preg_replace('/[^0-9]/', '', $_POST['sc_zip2']) : '';
$sc_price = isset($_POST['sc_price']) ? preg_replace('/[^0-9]/', '', $_POST['sc_price']) : '';
@@ -43,4 +43,4 @@ if($w == 'd') {
sql_query($sql);
}
goto_url('./sendcostlist.php?page='.$page);
goto_url('./sendcostlist.php?page='.$page);
+3 -1
View File
@@ -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();
+2
View File
@@ -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') // 업데이트
+6 -5
View File
@@ -22,13 +22,14 @@ else
$st = clean_xss_tags($st);
$sv = clean_xss_tags($sv);
$sql_sv = sql_real_escape_string(stripslashes($sv));
if ($st == 'all') {
$sql_search = "and (fo_name like '%{$sv}%' or fo_content like '%{$sv}%')";
$sql_search = "and (fo_name like '%{$sql_sv}%' or fo_content like '%{$sql_sv}%')";
} else if ($st == 'name') {
$sql_search = "and fo_name like '%{$sv}%'";
$sql_search = "and fo_name like '%{$sql_sv}%'";
} else if ($st == 'content') {
$sql_search = "and fo_content like '%{$sv}%'";
$sql_search = "and fo_content like '%{$sql_sv}%'";
} else {
$sql_search = '';
}
@@ -65,7 +66,7 @@ function book_all_checked(chk)
function book_del(fo_no)
{
if (confirm("한번 삭제한 자료는 복구할 방법이 없습니다.\n\n그래도 삭제하시겠습니까?"))
location.href = "./form_update.php?w=d&fo_no=" + fo_no + "&page=<?php echo $page?>&fg_no=<?php echo $fg_no?>&st=<?php echo get_text($st); ?>&sv=<?php echo get_text($sv); ?>";
location.href = "./form_update.php?w=d&fo_no=" + fo_no + "&page=<?php echo $page?>&fg_no=<?php echo $fg_no?>&st=<?php echo get_text($st); ?>&sv=<?php echo get_text($sv); ?>&token=<?php echo $token; ?>";
}
function multi_update(sel)
@@ -238,4 +239,4 @@ function select_copy(sw, f) {
<?php
echo get_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $page, $total_page, $_SERVER['SCRIPT_NAME']."?fg_no=$fg_no&amp;st=$st&amp;sv=$sv&amp;page=");
include_once(G5_ADMIN_PATH.'/admin.tail.php');
include_once(G5_ADMIN_PATH.'/admin.tail.php');
+7 -3
View File
@@ -4,8 +4,12 @@ include_once("./_common.php");
auth_check_menu($auth, $sub_menu, "w");
$fo_name = isset($_REQUEST['fo_name']) ? strip_tags(clean_xss_attributes($_REQUEST['fo_name'])) : '';
$fo_content = isset($_REQUEST['fo_content']) ? strip_tags(clean_xss_attributes($_REQUEST['fo_content'])) : '';
check_admin_token();
$fo_no = isset($_REQUEST['fo_no']) ? (int) $_REQUEST['fo_no'] : 0;
$fg_no = isset($_REQUEST['fg_no']) ? (int) $_REQUEST['fg_no'] : 0;
$fo_name = isset($_REQUEST['fo_name']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_REQUEST['fo_name'])))) : '';
$fo_content = isset($_REQUEST['fo_content']) ? addslashes(strip_tags(clean_xss_attributes(stripslashes($_REQUEST['fo_content'])))) : '';
$fo_receipt = isset($_REQUEST['fo_receipt']) ? clean_xss_tags($_REQUEST['fo_receipt'], 1, 1) : '';
$get_fg_no = '';
@@ -79,4 +83,4 @@ else // 등록
}
$go_url = './form_list.php?page='.$page.'&amp;fg_no='.$get_fg_no;
goto_url($go_url);
goto_url($go_url);
+3
View File
@@ -4,6 +4,8 @@ include_once("./_common.php");
auth_check_menu($auth, $sub_menu, "w");
$token = get_token();
$g5['title'] = "이모티콘 ";
$fo_no = isset($_REQUEST['fo_no']) ? (int) $_REQUEST['fo_no'] : 0;
@@ -34,6 +36,7 @@ include_once(G5_ADMIN_PATH.'/admin.head.php');
<input type="hidden" name="page" value="<?php echo $page?>">
<input type="hidden" name="fo_no" value="<?php echo $write['fo_no']; ?>">
<input type="hidden" name="get_fg_no" value="<?php echo $fg_no?>">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<div class="tbl_frm01 tbl_wrap">
<table>
+7 -6
View File
@@ -161,11 +161,12 @@ function all_send()
if( $write['wr_memo'] ){
$tmp_wr_memo = @unserialize($write['wr_memo']);
if( count($tmp_wr_memo) && is_array($tmp_wr_memo) ){
if(function_exists('array_fill_keys')){
$tmp_wr_hp = array_replace($tmp_wr_memo['hp'],array_fill_keys(array_keys($tmp_wr_memo['hp'], null),''));
} else {
$tmp_wr_hp = $tmp_wr_memo['hp'];
}
$tmp_wr_hp = $tmp_wr_memo['hp'];
if (is_array($tmp_wr_hp)) {
foreach (array_keys($tmp_wr_hp, null) as $empty_key) {
$tmp_wr_hp[$empty_key] = '';
}
}
$arr_wr_memo = @array_count_values( $tmp_wr_hp );
?>
<h2>중복번호 <?php echo $tmp_wr_memo['total'];?>건</h2>
@@ -265,4 +266,4 @@ function all_send()
<?php echo sms5_sub_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $spage, $total_spage, $_SERVER['SCRIPT_NAME']."?wr_no=$wr_no&amp;wr_renum=$wr_renum&amp;page=$page&amp;st=$st&amp;sv=$sv&amp;sst=$sst&amp;ssv=$ssv", "", "spage"); ?>
<?php
include_once(G5_ADMIN_PATH.'/admin.tail.php');
include_once(G5_ADMIN_PATH.'/admin.tail.php');
+30 -12
View File
@@ -37,21 +37,39 @@ include_once(G5_ADMIN_PATH.'/admin.head.php');
$( "#mb_update_form" ).submit(function( e ) {
e.preventDefault();
$("#res_msg").html('업데이트 중입니다. 잠시만 기다려 주십시오...');
var params = { mtype : 'json' };
var action = $(this).attr("action");
$.ajax({
url: $(this).attr("action"),
cache:false,
timeout : 30000,
dataType:"json",
data:params,
success: function(data) {
if(data.error){
alert( data.error );
url: '<?php echo G5_ADMIN_URL; ?>/ajax.token.php',
type: 'POST',
dataType: 'json',
data: { admin_csrf_token_key: '<?php echo admin_csrf_token_key(1); ?>' },
success: function(tokenData) {
if(tokenData.error){
alert(tokenData.error);
$("#res_msg").html("");
} else {
$("#datetime").html( data.datetime );
$("#res_msg").html( data.res_msg );
return;
}
$.ajax({
url: action,
type: 'POST',
cache:false,
timeout : 30000,
dataType:"json",
data: { mtype : 'json', token : tokenData.token },
success: function(data) {
if(data.error){
alert( data.error );
$("#res_msg").html("");
} else {
$("#datetime").html( data.datetime );
$("#res_msg").html( data.res_msg );
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
+2
View File
@@ -26,6 +26,8 @@ if( $mtype == "json" ){
auth_check_menu($auth, $sub_menu, "w");
}
check_admin_token();
$count = 0;
$hp_yes = 0;
$hp_no = 0;
+3 -2
View File
@@ -3,6 +3,7 @@ $sub_menu = "900900";
include_once("./_common.php");
$bg_no = isset($_REQUEST['bg_no']) ? clean_xss_tags($_REQUEST['bg_no'], 1, 1) : '';
$bg_no = ($bg_no === 'all') ? 'all' : (int) $bg_no;
$no_hp = isset($_REQUEST['no_hp']) ? clean_xss_tags($_REQUEST['no_hp'], 1, 1) : '';
auth_check_menu($auth, $sub_menu, "r");
@@ -46,7 +47,7 @@ for($i=1; $res=sql_fetch_array($qry); $i++)
if ($no_hp && $res['bk_hp'] != '' && !$hp) continue;
$rows[] = array($res['bk_name'], ' '.$hp);
$rows[] = array(function_exists('csv_safe_cell') ? csv_safe_cell($res['bk_name']) : $res['bk_name'], ' '.$hp);
}
$data = array_merge(array($headers), $rows);
@@ -66,4 +67,4 @@ header("Cache-Control: max-age=0");
$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
$writer->save('php://output');
exit;
exit;
+3 -1
View File
@@ -4,7 +4,9 @@ include_once("./_common.php");
auth_check_menu($auth, $sub_menu, "w");
$upload_bg_no = isset($_REQUEST['upload_bg_no']) ? clean_xss_tags($_REQUEST['upload_bg_no'], 1, 1) : '';
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) : '';
if (!$upload_bg_no)
+2
View File
@@ -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();
+2
View File
@@ -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;
+7 -5
View File
@@ -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++)
@@ -13,7 +15,7 @@ if ($w == 'u') // 업데이트
// 실제 번호를 넘김
$k = $post_chk[$i];
$bg_no = isset($_POST['bg_no'][$k]) ? (int) $_POST['bg_no'][$k] : 0;
$bg_name = isset($_POST['bg_name'][$k]) ? strip_tags(clean_xss_attributes($_POST['bg_name'][$k])) : '';
$bg_name = isset($_POST['bg_name'][$k]) ? strip_tags(clean_xss_attributes(stripslashes($_POST['bg_name'][$k]))) : '';
if (!is_numeric($bg_no))
alert('그룹 고유번호가 없습니다.');
@@ -65,16 +67,16 @@ else if ($w == 'em') // 비우기
}
else // 등록
{
$bg_name = isset($_REQUEST['bg_name']) ? strip_tags(clean_xss_attributes($_REQUEST['bg_name'])) : '';
$bg_name = isset($_REQUEST['bg_name']) ? strip_tags(clean_xss_attributes(stripslashes($_REQUEST['bg_name']))) : '';
if (!strlen(trim($bg_name)))
alert('그룹명을 입력해주세요');
$res = sql_fetch("select bg_name from {$g5['sms5_book_group_table']} where bg_name='$bg_name'");
$res = sql_fetch("select bg_name from {$g5['sms5_book_group_table']} where bg_name='".sql_real_escape_string($bg_name)."'");
if ($res)
alert('같은 그룹명이 존재합니다.');
sql_query("insert into {$g5['sms5_book_group_table']} set bg_name='$bg_name'");
sql_query("insert into {$g5['sms5_book_group_table']} set bg_name='".sql_real_escape_string($bg_name)."'");
}
goto_url('./num_group.php');
goto_url('./num_group.php');
+3 -1
View File
@@ -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();
+1 -1
View File
@@ -8,7 +8,7 @@ $list = $hps = array();
$overlap = 0;
$send_list = isset($_REQUEST['send_list']) ? clean_xss_tags($_REQUEST['send_list'], 1, 1) : '';
$send_list = isset($_REQUEST['send_list']) ? addslashes(clean_xss_tags(stripslashes($_REQUEST['send_list']), 1, 1)) : '';
if( !$send_list ){
die("넘어온 데이터 값이 없습니다.");
+2 -2
View File
@@ -25,8 +25,8 @@ if ( ! (($config['cf_icode_id'] && $config['cf_icode_pw']) || $config['cf_icode_
}
$wr_reply = isset($_REQUEST['wr_reply']) ? preg_replace('#[^0-9\-]#', '', trim($_REQUEST['wr_reply'])) : '';
$wr_message = isset($_REQUEST['wr_message']) ? clean_xss_tags(trim($_REQUEST['wr_message']), 1, 1, 0, 0) : '';
$send_list = isset($_REQUEST['send_list']) ? clean_xss_tags(trim($_REQUEST['send_list']), 1, 1) : '';
$wr_message = isset($_REQUEST['wr_message']) ? addslashes(clean_xss_tags(stripslashes(trim($_REQUEST['wr_message'])), 1, 1, 0, 0)) : '';
$send_list = isset($_REQUEST['send_list']) ? addslashes(clean_xss_tags(stripslashes(trim($_REQUEST['send_list'])), 1, 1)) : '';
$wr_by = isset($_REQUEST['wr_by']) ? clean_xss_tags(trim($_REQUEST['wr_by']), 1, 1) : '';
$wr_bm = isset($_REQUEST['wr_bm']) ? clean_xss_tags(trim($_REQUEST['wr_bm']), 1, 1) : '';
+2
View File
@@ -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
View File
@@ -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&amp;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&amp;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');
+1 -1
View File
@@ -96,7 +96,7 @@ if(isset($sfl) && $sfl && !in_array($sfl, array('vi_ip','vi_date','vi_time','vi_
$referer = iconv('euc-kr', 'utf-8', $referer);
}
$title = str_replace(array("<", ">"), array("&lt;", "&gt;"), $referer);
$title = str_replace(array("<", ">", "\"", "'"), array("&lt;", "&gt;", "&#034;", "&#039;"), $referer);
$link = '<a href="'.get_text($row['vi_referer']).'" target="_blank" title="'.$title.'">';
}
+121 -116
View File
@@ -1,116 +1,121 @@
<?php
global $lo_location;
global $lo_url;
include_once('./_common.php');
if($error) {
$g5['title'] = "오류안내 페이지";
} else {
$g5['title'] = "결과안내 페이지";
}
include_once(G5_PATH.'/head.sub.php');
// 필수 입력입니다.
// 양쪽 공백 없애기
// 필수 (선택 혹은 입력)입니다.
// 전화번호 형식이 올바르지 않습니다. 하이픈(-)을 포함하여 입력하세요.
// 이메일주소 형식이 아닙니다.
// 한글이 아닙니다. (자음, 모음만 있는 한글은 처리하지 않습니다.)
// 한글이 아닙니다.
// 한글, 영문, 숫자가 아닙니다.
// 한글, 영문이 아닙니다.
// 숫자가 아닙니다.
// 영문이 아닙니다.
// 영문 또는 숫자가 아닙니다.
// 영문, 숫자, _ 가 아닙니다.
// 최소 글자 이상 입력하세요.
// 이미지 파일이 아닙니다..gif .jpg .png 파일만 가능합니다.
// 파일만 가능합니다.
// 공백이 없어야 합니다.
$msg = isset($msg) ? strip_tags($msg) : '';
$msg2 = str_replace("\\n", "<br>", $msg);
$url = isset($url) ? clean_xss_tags($url, 1) : '';
if (!$url) $url = isset($_SERVER['HTTP_REFERER']) ? clean_xss_tags($_SERVER['HTTP_REFERER'], 1) : '';
$url = preg_replace("/[\<\>\'\"\\\'\\\"\(\)]/", "", $url);
$url = preg_replace('/\r\n|\r|\n|[^\x20-\x7e]/','', $url);
// url 체크
check_url_host($url, $msg);
if($error) {
$header2 = "다음 항목에 오류가 있습니다.";
} else {
$header2 = "다음 내용을 확인해 주세요.";
}
?>
<script>
alert("<?php echo $msg; ?>");
<?php if ($url) { ?>
document.location.replace("<?php echo str_replace('&amp;', '&', $url); ?>");
<?php } else { ?>
history.back();
<?php } ?>
</script>
<noscript>
<div id="validation_check">
<h1><?php echo $header2 ?></h1>
<p class="cbg">
<?php echo $msg2 ?>
</p>
<?php if($post) { ?>
<form method="post" action="<?php echo $url ?>">
<?php
foreach($_POST as $key => $value) {
$key = clean_xss_tags($key);
$value = clean_xss_tags($value);
if(strlen($value) < 1)
continue;
if(preg_match("/pass|pwd|capt|url/", $key))
continue;
?>
<input type="hidden" name="<?php echo htmlspecialchars($key); ?>" value="<?php echo htmlspecialchars($value); ?>">
<?php
}
?>
<input type="submit" value="돌아가기">
</form>
<?php } else { ?>
<div class="btn_confirm">
<a href="<?php echo $url ?>">돌아가기</a>
</div>
<?php } ?>
<?php /*
<article id="validation_check">
<header>
<hgroup>
<!-- <h1>회원가입 정보 입력 확인</h1> --> <!-- 수행 중이던 작업 내용 -->
<h1><?php echo $header ?></h1> <!-- 수행 중이던 작업 내용 -->
<h2><?php echo $header2 ?></h2>
</hgroup>
</header>
<p>
<!-- <strong>항목</strong> 오류내역 -->
<!--
<strong>이름</strong> 필수 입력입니다. 한글만 입력할 수 있습니다.<br>
<strong>이메일</strong> 올바르게 입력하지 않았습니다.<br>
-->
<?php echo $msg2 ?>
</p>
<a href="<?php echo $url ?>">돌아가기</a>
</article>
*/ ?>
</div>
</noscript>
<?php
include_once(G5_PATH.'/tail.sub.php');
<?php
global $lo_location;
global $lo_url;
include_once('./_common.php');
if($error) {
$g5['title'] = "오류안내 페이지";
} else {
$g5['title'] = "결과안내 페이지";
}
include_once(G5_PATH.'/head.sub.php');
// 필수 입력입니다.
// 양쪽 공백 없애기
// 필수 (선택 혹은 입력)입니다.
// 전화번호 형식이 올바르지 않습니다. 하이픈(-)을 포함하여 입력하세요.
// 이메일주소 형식이 아닙니다.
// 한글이 아닙니다. (자음, 모음만 있는 한글은 처리하지 않습니다.)
// 한글이 아닙니다.
// 한글, 영문, 숫자가 아닙니다.
// 한글, 영문이 아닙니다.
// 숫자가 아닙니다.
// 영문이 아닙니다.
// 영문 또는 숫자가 아닙니다.
// 영문, 숫자, _ 가 아닙니다.
// 최소 글자 이상 입력하세요.
// 이미지 파일이 아닙니다..gif .jpg .png 파일만 가능합니다.
// 파일만 가능합니다.
// 공백이 없어야 합니다.
$msg = isset($msg) ? strip_tags($msg) : '';
$msg2 = str_replace(array("\\r\\n", "\\n", "\\r"), "<br>", $msg);
$alert_msg = str_replace(array("\\r\\n", "\\n", "\\r"), "\n", $msg);
$url = isset($url) ? clean_xss_tags($url, 1) : '';
if (!$url) $url = isset($_SERVER['HTTP_REFERER']) ? clean_xss_tags($_SERVER['HTTP_REFERER'], 1) : '';
$url = preg_replace("/[\<\>\'\"\\\'\\\"\(\)]/", "", $url);
$url = preg_replace('/\r\n|\r|\n|[^\x20-\x7e]/','', $url);
// url 체크
check_url_host($url, $msg);
$alert_url = str_replace('&amp;', '&', $url);
$js_replace = array('\\' => '\\\\', '"' => '\\"', "'" => '\\u0027', '/' => '\\/', "\r" => '\\r', "\n" => '\\n', "\t" => '\\t', '<' => '\\u003C', '>' => '\\u003E', '&' => '\\u0026', "\xE2\x80\xA8" => '\\u2028', "\xE2\x80\xA9" => '\\u2029');
$js_alert_msg = function_exists('get_js_safe_string') ? get_js_safe_string($alert_msg) : '"'.strtr((string)$alert_msg, $js_replace).'"';
$js_alert_url = function_exists('get_js_safe_string') ? get_js_safe_string($alert_url) : '"'.strtr((string)$alert_url, $js_replace).'"';
if($error) {
$header2 = "다음 항목에 오류가 있습니다.";
} else {
$header2 = "다음 내용을 확인해 주세요.";
}
?>
<script>
alert(<?php echo $js_alert_msg; ?>);
<?php if ($url) { ?>
document.location.replace(<?php echo $js_alert_url; ?>);
<?php } else { ?>
history.back();
<?php } ?>
</script>
<noscript>
<div id="validation_check">
<h1><?php echo $header2 ?></h1>
<p class="cbg">
<?php echo $msg2 ?>
</p>
<?php if($post) { ?>
<form method="post" action="<?php echo $url ?>">
<?php
foreach($_POST as $key => $value) {
$key = clean_xss_tags($key);
$value = clean_xss_tags($value);
if(strlen($value) < 1)
continue;
if(preg_match("/pass|pwd|capt|url/", $key))
continue;
?>
<input type="hidden" name="<?php echo htmlspecialchars($key); ?>" value="<?php echo htmlspecialchars($value); ?>">
<?php
}
?>
<input type="submit" value="돌아가기">
</form>
<?php } else { ?>
<div class="btn_confirm">
<a href="<?php echo $url ?>">돌아가기</a>
</div>
<?php } ?>
<?php /*
<article id="validation_check">
<header>
<hgroup>
<!-- <h1>회원가입 정보 입력 확인</h1> --> <!-- 수행 중이던 작업 내용 -->
<h1><?php echo $header ?></h1> <!-- 수행 중이던 작업 내용 -->
<h2><?php echo $header2 ?></h2>
</hgroup>
</header>
<p>
<!-- <strong>항목</strong> 오류내역 -->
<!--
<strong>이름</strong> 필수 입력입니다. 한글만 입력할 수 있습니다.<br>
<strong>이메일</strong> 올바르게 입력하지 않았습니다.<br>
-->
<?php echo $msg2 ?>
</p>
<a href="<?php echo $url ?>">돌아가기</a>
</article>
*/ ?>
</div>
</noscript>
<?php
include_once(G5_PATH.'/tail.sub.php');
+6 -3
View File
@@ -4,7 +4,10 @@ include_once(G5_PATH.'/head.sub.php');
$msg = isset($msg) ? strip_tags($msg) : '';
$msg2 = str_replace("\\n", "<br>", $msg);
$msg2 = str_replace(array("\\r\\n", "\\n", "\\r"), "<br>", $msg);
$alert_msg = str_replace(array("\\r\\n", "\\n", "\\r"), "\n", $msg);
$js_replace = array('\\' => '\\\\', '"' => '\\"', "'" => '\\u0027', '/' => '\\/', "\r" => '\\r', "\n" => '\\n', "\t" => '\\t', '<' => '\\u003C', '>' => '\\u003E', '&' => '\\u0026', "\xE2\x80\xA8" => '\\u2028', "\xE2\x80\xA9" => '\\u2029');
$js_alert_msg = function_exists('get_js_safe_string') ? get_js_safe_string($alert_msg) : '"'.strtr((string)$alert_msg, $js_replace).'"';
if($error) {
$header2 = "다음 항목에 오류가 있습니다.";
@@ -16,7 +19,7 @@ if($error) {
?>
<script>
alert("<?php echo $msg; ?>");
alert(<?php echo $js_alert_msg; ?>);
try {
window.close();
} catch(error) {
@@ -69,4 +72,4 @@ setTimeout(function() {
</noscript>
<?php
include_once(G5_PATH.'/tail.sub.php');
include_once(G5_PATH.'/tail.sub.php');
+2 -2
View File
@@ -7,7 +7,7 @@ $count = (isset($_POST['chk_wr_id']) && is_array($_POST['chk_wr_id'])) ? count($
$post_btn_submit = isset($_POST['btn_submit']) ? clean_xss_tags($_POST['btn_submit'], 1, 1) : '';
if(!$count) {
alert(addcslashes($post_btn_submit, '"\\/').' 하실 항목을 하나 이상 선택하세요.');
alert($post_btn_submit.' 하실 항목을 하나 이상 선택하세요.');
}
if($post_btn_submit === '선택삭제') {
@@ -20,4 +20,4 @@ if($post_btn_submit === '선택삭제') {
include './move.php';
} else {
alert('올바른 방법으로 이용해 주세요.');
}
}
+10 -4
View File
@@ -14,6 +14,12 @@ $url3 = preg_replace($pattern2, "", $url3);
$msg = isset($msg) ? $msg : '';
$header = isset($header) ? $msg : '';
$confirm_msg = str_replace(array('<br>', '<br/>', '<br />'), "\n", $msg);
$confirm_msg = strip_tags($confirm_msg);
$js_replace = array('\\' => '\\\\', '"' => '\\"', "'" => '\\u0027', '/' => '\\/', "\r" => '\\r', "\n" => '\\n', "\t" => '\\t', '<' => '\\u003C', '>' => '\\u003E', '&' => '\\u0026', "\xE2\x80\xA8" => '\\u2028', "\xE2\x80\xA9" => '\\u2029');
$js_confirm_msg = function_exists('get_js_safe_string') ? get_js_safe_string($confirm_msg) : '"'.strtr((string)$confirm_msg, $js_replace).'"';
$js_url1 = function_exists('get_js_safe_string') ? get_js_safe_string($url1) : '"'.strtr((string)$url1, $js_replace).'"';
$js_url2 = function_exists('get_js_safe_string') ? get_js_safe_string($url2) : '"'.strtr((string)$url2, $js_replace).'"';
// url 체크
check_url_host($url1);
@@ -22,11 +28,11 @@ check_url_host($url3);
?>
<script>
var conf = "<?php echo strip_tags($msg); ?>";
var conf = <?php echo $js_confirm_msg; ?>;
if (confirm(conf)) {
document.location.replace("<?php echo $url1; ?>");
document.location.replace(<?php echo $js_url1; ?>);
} else {
document.location.replace("<?php echo $url2; ?>");
document.location.replace(<?php echo $js_url2; ?>);
}
</script>
@@ -49,4 +55,4 @@ if (confirm(conf)) {
</noscript>
<?php
include_once(G5_PATH.'/tail.sub.php');
include_once(G5_PATH.'/tail.sub.php');
+2 -2
View File
@@ -3,7 +3,7 @@ include_once('./_common.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
if (!$config['cf_email_use'])
alert_close('환경설정에서 \"메일발송 사용\"에 체크하셔야 메일을 발송할 수 있습니다.\\n\\n관리자에게 문의하시기 바랍니다.');
alert_close('환경설정에서 "메일발송 사용"에 체크하셔야 메일을 발송할 수 있습니다.\\n\\n관리자에게 문의하시기 바랍니다.');
if (!$is_member && $config['cf_formmail_is_member'])
alert_close('회원만 이용하실 수 있습니다.');
@@ -52,4 +52,4 @@ $type_checked[$type] = 'checked';
include_once($member_skin_path.'/formmail.skin.php');
include_once(G5_PATH.'/tail.sub.php');
include_once(G5_PATH.'/tail.sub.php');

Some files were not shown because too many files have changed in this diff Show More