# 결제(PortOne V2 · 이니시스) 설정 가이드

결제 연동이 코드로 들어가 있습니다. 아래 값만 채우면 **테스트 결제**가 동작합니다.
(실제 카드 결제는 이니시스 정식 계약 후 — 마지막 단계 참고)

## 구성
```
[브라우저] checkout.html  →  PortOne 결제창(이니시스)
        ↓ 결제 후 paymentId
[Worker] /api/payment/complete  →  PortOne API로 실제 금액·상태 재검증 (위변조 방지)
[Worker] /api/payment/webhook   →  가상계좌 입금·취소 등 비동기 결과 수신
```
- 프론트: `checkout.html`
- 백엔드: **독립 Cloudflare Worker** `payment-worker/worker.js` (가격표 내장)

> 이 사이트는 정적 배포라 Pages Functions 가 동작하지 않아, 결제 백엔드는
> **별도 Worker**로 두고 `/api/payment/*` 경로만 그 Worker로 라우팅합니다.

---

## 1단계 — PortOne 콘솔에서 값 가져오기
1. https://admin.portone.io 로그인
2. **상점 ID(storeId)** `store-...` 복사
3. **채널 만들기**: [결제 연동] → [채널 관리] → 채널 추가 → 지금은 **테스트 채널**로 → **채널 키(channelKey)** `channel-key-...` 복사
4. **V2 API Secret** 발급: [결제 연동] → [API Keys] → V2 API Secret 생성/복사
   - ⚠️ 비밀값. checkout.html·깃허브에 넣지 말 것.

## 2단계 — 결제 Worker 배포
아래 (A) 또는 (B) 중 하나:

**(A) 대시보드에 붙여넣기 (CLI 불필요, 쉬움)**
1. Cloudflare 대시보드 → Workers & Pages → **Create → Worker** → 이름 `zionlabs-payment`
2. **Edit code** → `payment-worker/worker.js` 내용 전체를 붙여넣고 **Deploy**
3. **Settings → Variables and Secrets** → `PORTONE_V2_API_SECRET` 추가(1단계 값, Encrypt) → 저장
4. **Settings → Domains & Routes → Add route**:
   - Route: `zionlabs.org/api/payment/*` , Zone: `zionlabs.org`
   - (이 경로만 Worker가 처리, 나머지는 기존 사이트가 그대로 서빙)

**(B) 명령어(wrangler)**
```bash
cd payment-worker
npx wrangler deploy
npx wrangler secret put PORTONE_V2_API_SECRET   # 1단계 값 입력
```
(라우트는 wrangler.toml 에 포함되어 있음)

> 라우트를 못 쓰는 환경이면: Worker의 workers.dev 주소를 `checkout.html` 의 `CONFIG.API_BASE` 에
> 넣으면 됩니다(그 경우 Worker가 CORS 로 zionlabs.org 를 허용하도록 이미 설정됨).

## 3단계 — 프론트에 공개 값 입력
`checkout.html` 상단 `CONFIG`:
```js
const CONFIG = {
  STORE_ID:   "store-....",        // storeId
  CHANNEL_KEY:"channel-key-....",  // 테스트 channelKey
  API_BASE: "",                    // 같은 도메인 라우트면 "" (권장)
};
```
(storeId·channelKey 는 공개돼도 안전)

## 4단계 (선택) — 주문 기록 저장(KV)
1. 대시보드 → Storage & Databases → **KV** → 네임스페이스 생성(예: `zion-orders`)
2. `zionlabs-payment` Worker → Settings → **Variables → KV Namespace Bindings**
   - Variable name: `ORDERS` / 네임스페이스: 위에서 만든 것
- 없어도 결제·검증은 정상 동작(기록만 생략).

## 5단계 — 웹훅 등록
PortOne 콘솔 → [결제 연동] → **웹훅** → URL: `https://zionlabs.org/api/payment/webhook` → 저장·테스트(200 확인)

## 6단계 — 테스트 결제
1. `https://zionlabs.org/checkout.html?product=opc-standard`
2. 이름·휴대폰·이메일 입력 후 결제(테스트 채널은 실제 청구 없음)
3. “결제가 완료되었습니다” 화면 확인. 금액 불일치 시 자동 취소되는지도 확인.

## 7단계 — 실서비스 전환 (이니시스 정식 계약 후)
1. KG이니시스 상점 계약(MID). 카드 외 수기결제·에스크로는 별도 신청.
2. PortOne에서 **실 이니시스 채널** 생성 → 새 `channelKey` 를 checkout.html 에 반영
3. 소액 실결제 → 즉시 취소 테스트
4. 상품/가격 변경 시 **`payment-worker/worker.js` 의 CATALOG 와 `checkout.html` 의 PRODUCTS 를 함께** 수정 후 Worker 재배포

## 구매 링크
- Standard: `/checkout.html?product=opc-standard`
- Professional: `/checkout.html?product=opc-professional`

## 원칙
- API Secret 은 **Worker 환경변수에만**, 금액 검증은 **항상 서버(Worker)에서**.
- 문서: https://developers.portone.io/opi/ko/integration/pg/v2/inicis-v2?v=v2
