Files
Gnuboard7/plugins/_bundled/sirsoft-pay_nicepayments
HeuJung b505ac7ba7 fix(core,board,ecommerce,page,gdpr): 목록 컨텍스트 왕복·엔진 렌더 파이프 결함 일괄 수정 + 공개문서 정리
세 갈래의 결함을 한 브랜치에서 정리한다.

## 목록 컨텍스트 왕복 시 URL 상태 소실 ( @jiwonpapa 님께서 제보해주셨습니다.)

목록에서 상세·형제 상세(이전/다음)·작성/수정 폼에 다녀오면 보고 있던
page/search/category/filters 가 사라지던 문제를 전 도메인에서 수정했다.

- 엔진(engine-v1.54.2): `mergeQuery: true` 만 적고 `query` 를 생략하면 병합이
 통째로 건너뛰어지던 함정을 교정 — `ActionDispatcher.handleNavigate`/`handleReplaceUrl`.
- 게시판·이커머스·페이지·회원·마이페이지·gdpr 등 9개 확장 레이아웃의 왕복 leg 전수
 적용(mergeQuery: true). 의도적 리셋(검색/필터 초기화·탭 전환·프리셋)은 면제 주석으로 구분.
- 무한스크롤 목록(브랜드·상품 공통정보·고시정보)의 새로고침이 URL 검색·정렬을 떨구던
 결함 수정.
- 재발 차단: audit 룰 `layout-list-context-navigate-merge-query`(목록 클러스터 자동 도출,
 page/필터 URL 신호 4종) + `layout-navigate-path-absolute`(navigate path 동작 키워드 금지).

## cellChildren 등 반복 렌더에서 단일 바인딩 파이프 미적용 ( @glitter-gim 님께서 제보해주셨습니다.)

목록 표의 각 칸에 넣은 날짜·숫자 서식(`{{row.x | datetime(...)}}`)이 빈 값이 되거나
서식 없는 원본으로 나오던 문제를, 표현식 판정 로직이 엔진 전역에 복제되며 갈라진
구조적 결함으로 진단하고 판정 경로를 단일화했다(engine-v1.54.3).

- `RenderHelpers`(renderItemChildren·evaluateIfCondition)·`ConditionEvaluator`·
 `DataBindingEngine.resolveObject`·`DynamicRenderer` props 5곳에 단일 바인딩 파이프 분기 추가.
- 계획: `g7-scalable-lobster.md`(렌더 경로 비대칭 결함 일괄 수정).

## 공개 문서 내부 도구 귀속 제거

release 에 포함되는 공개 문서(`docs/**`)에서 내부 audit 룰 ID 귀속 서술을
도구 비귀속 표현("정적 검사")으로 정리. 재발 차단 룰 `public-no-internal-audit-reference` 신설.

전 계층 테스트(PHPUnit·Vitest·Playwright)·회귀 테스트 동반, 버전/CHANGELOG/활성 디렉토리 동기 완료.
2026-07-26 15:17:56 +09:00
..

NicePayments Plugin for G7

나이스페이먼츠(NicePayments) PG 연동 플러그인입니다. G7 플랫폼의 sirsoft-ecommerce 모듈과 함께 동작합니다.

지원 결제 수단

결제 수단 PayMethod
신용카드 CARD
가상계좌 VBANK
계좌이체 BANK
휴대폰결제 CELLPHONE

설치

# 플러그인 디렉토리에 배치 후
composer install
npm install && npm run build

설정

관리자 → 플러그인 → NicePayments 설정에서 구성합니다.

항목 설명
테스트 모드 활성화 시 나이스페이먼츠 공용 테스트 MID를 사용합니다. 실제 카드 승인/출금 알림이 발생할 수 있으며, 테스트 계정 결제는 당일 23:30경 일괄 자동 취소됩니다.
테스트 MID 테스트 가맹점 ID (nicepay00m 기본값)
테스트 가맹점 키 나이스페이 공용 테스트 키
라이브 MID 실서비스 가맹점 ID
라이브 가맹점 키 실서비스 가맹점 키 (외부 노출 금지)
결제 성공 URL 결제 완료 후 리다이렉트 경로 ({orderId} 치환 지원)
결제 실패 URL 결제 실패 후 리다이렉트 경로

테스트 모드 주문은 실제 배송하지 마세요. 실제 카드 승인/출금 알림이 발생할 수 있으며, 테스트 계정 결제는 당일 23:30경 일괄 자동 취소됩니다.

웹훅 (가상계좌 입금 통보)

나이스페이먼츠 관리자에서 가상계좌 입금 통보 URL을 아래로 설정하세요:

https://your-domain.com/plugins/sirsoft-pay_nicepayments/payment/vbank-notify

IP 화이트리스트

나이스페이먼츠 서버 IP만 허용됩니다. 로컬/테스트 환경에서는 자동으로 우회됩니다.

IP
121.133.126.10
121.133.126.11
211.33.136.39

결제 흐름

PC / 모바일 결제 (인증 + 승인 2단계)

브라우저  →  goPay(form) / 모바일 결제창 form POST
결제창    →  POST /payment/callback  →  authCallback() (1단계 인증)
서버      →  POST NextAppURL  →  승인 API 호출 (2단계)
승인 완료 →  completePayment()  →  성공 페이지 리다이렉트

결제창 취소 / 인증 실패

모바일 결제창에서 사용자가 취소버튼을 누르거나 PG 가 인증을 거부하면 (AuthResultCode != '0000') 결제 승인 (NextAppURL 호출) 이전이므로 사용자에게 generic 오류 메시지를 띄우지 않고 체크아웃으로 silent redirect 합니다. 운영 가시성은 로그(auth_result_code / auth_result_msg) 로 보존됩니다. 2단계 이후 hard failure (signature / mid / amount / authorize) 는 종전대로 ?error= 쿼리 부착하여 안내합니다.

결제 취소 / 부분취소

관리자 주문 취소 요청 (cancel_pg=true)
→ 코어가 sirsoft-ecommerce.payment.refund 필터 훅 발화
→ PaymentRefundListener 가 NicePayments cancelPayment API 호출
   · 전액취소: isPartial=0
   · 부분취소: isPartial=1
→ 코어가 환불 레코드 생성 + 쿠폰 / 마일리지 / 재고 복원
→ CancelActivityLogListener 가 PG 응답 시각·취소 TID를 활동 로그에 기록

배송비가 포함된 주문은 전체취소 시 배송비도 함께 환불 레코드에 반영되고, 쿠폰이 적용된 주문은 실결제금액(쿠폰 차감 후) 이 PG cancelAmt 로 전달됩니다. 부분취소 시 쿠폰 최소 주문금액 조건을 더 이상 충족하지 못하면 코어가 취소 자체를 거부 (422) 하여 PG 호출이 발생하지 않습니다. 가상계좌 입금 완료 건은 환불 계좌 정보가 필요해 일반 취소 API 가 아닌 별도 어드민 환불 계좌 API 경로로 처리됩니다.

가용 훅 (Hook)

다른 플러그인이나 리스너에서 아래 훅에 연결할 수 있습니다.

액션 훅

훅 이름 시점 인수
sirsoft-pay_nicepayments.payment.before_authorize 서버 승인 API 호출 직전 Order $order, array $pgParams
sirsoft-pay_nicepayments.payment.after_authorize 서버 승인 API 응답 직후 Order $order, array $pgResponse
sirsoft-pay_nicepayments.payment.before_cancel NicePayments 취소 API 호출 직전 Order $order, OrderPayment $payment, float $refundAmount
sirsoft-pay_nicepayments.payment.after_cancel NicePayments 취소 API 호출 직후 Order $order, OrderPayment $payment, array $pgResponse
sirsoft-pay_nicepayments.payment.refund_failed 환불 API 호출 실패 시 Order $order, OrderPayment $payment, array $context

refund_failed context 구조

[
    'tid'        => string,  // 나이스페이 거래번호
    'cancel_amt' => int,     // 환불 시도 금액 (원)
    'error'      => string,  // 오류 메시지
]

훅 등록 예시

use App\Extension\HookManager;

HookManager::addAction(
    'sirsoft-pay_nicepayments.payment.refund_failed',
    function (Order $order, OrderPayment $payment, array $context) {
        // 예: Slack 알림 발송
        SlackNotifier::send("환불 실패: 주문 #{$order->order_number}, 오류: {$context['error']}");
    },
    priority: 10
);

API 단건 조회

NicePaymentsApiService::queryTransaction(string $tid): array 메서드로 거래 상태를 조회할 수 있습니다.

$apiService = app(\Plugins\Sirsoft\PayNicepayments\Services\NicePaymentsApiService::class);
$result = $apiService->queryTransaction('NICE_TID_12345');
// $result['ResultCode'], $result['Amt'], ...

과세 처리

결제 요청 시 주문의 total_tax_amount, total_vat_amount, total_tax_free_amount 값을 자동으로 나이스페이 폼에 포함합니다. 세 값이 모두 0이면 과세 필드를 생략합니다.

테스트 실행

cd c:/g7
php artisan test --filter=Nicepayments

라이선스

MIT