47 lines
2.0 KiB
Markdown
47 lines
2.0 KiB
Markdown
# 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` 关联是否建立。
|