180e81e09015c521850fcd204919aeb2d0d90c22
NomadVIP | 异度星球
NomadVIP 前端(Next.js App Router),负责会员购买、支付跳转、支付状态轮询,以及与 payjsapi / PocketBase 联动完成 VIP 开通。
核心流程
- 前端调用
app/api/pay发起支付。 app/api/pay按设备分流:- 微信内:
xorpay - PC / 手机浏览器:
zpay
- 微信内:
- 支付成功后通过
payjsapi异步通知写入 PocketBase。 - 若通知延迟,前端会调用
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 兜底写库所需管理员账号 | - |
本地开发
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关联是否建立。
Description
Languages
TypeScript
86.7%
CSS
11.7%
JavaScript
1.6%