# NomadVIP | 异度星球 NomadVIP 前端(Next.js App Router),负责会员购买、支付跳转、支付状态轮询,以及与 `payjsapi` / PocketBase 联动完成 VIP 开通。 ## 核心流程 1. 前端调用 `app/api/pay` 发起支付。 2. `app/api/pay` 按设备分流: - 微信内:`xorpay` - PC / 手机浏览器:`zpay` 3. 支付成功后通过 `payjsapi` 异步通知写入 PocketBase。 4. 若通知延迟,前端会调用 `app/api/pay/confirm` 兜底写入 `payments` + `site_vip`。 ## 关键配置 复制 `.env.example` 为 `.env.local`,按需修改: | 变量 | 说明 | 默认值 | |------|------|--------| | `NEXT_PUBLIC_POCKETBASE_URL` | PocketBase 地址(浏览器侧) | `https://pocketbase.hackrobot.cn` | | `POCKETBASE_URL` | PocketBase 地址(服务端) | `http://127.0.0.1:8090` | | `PAYMENT_API_URL` / `NEXT_PUBLIC_API_URL` | payjsapi 公网地址 | `https://api.hackrobot.cn` | | `PAYMENT_API_INTERNAL_URL` | 同机部署时 payjsapi 内网地址 | `http://127.0.0.1:8007` | | `PAYMENT_DEFAULT_AMOUNT` | 默认支付金额(分) | `18800` | | `ZPAY_SUBMIT_URL` | ZPAY 收银台地址 | `https://zpayz.cn/submit.php` | | `POCKETBASE_EMAIL` / `POCKETBASE_PASSWORD` | confirm 兜底写库所需管理员账号 | - | ## 本地开发 ```bash npm install npm run dev ``` 访问 `http://localhost:3000`。 ## 自检与已修复问题(2026-04-01) - 已修复:`app/api/pay/confirm` 在兜底写 `payments` 时使用默认金额,可能导致测试价/临时调价场景记账错误。 - 修复后:优先使用支付网关返回的 `pay_price`(元)换算为分;只有拿不到实际金额时才回退默认金额。 ## 常见排查 - 支付发起失败:优先检查 `PAYMENT_API_INTERNAL_URL` / `PAYMENT_API_URL` 是否可达。 - 已支付但未开通:检查 `payjsapi` 的 `/nomadvip/order_status` 与异步通知日志。 - 账号已支付但 VIP 未识别:检查 `vip_email_link` 关联是否建立。