ZPay
Nuxt 模板中支付宝风格的 ZPay 演示提供商。
ZPay 是面向中国(支付宝)的演示提供商。它在
server/payment/providers/zpay-provider.ts 中实现
PaymentProvider 接口,并在 NUXT_ZPAY_URL、
NUXT_ZPAY_MERCH_ID 与 NUXT_ZPAY_MERCH_KEY 全部设置时由工厂注册。
ZPay 作为非 Stripe、基于签名的网关的示例被包含进来。它无法通过
NUXT_PUBLIC_PAYMENT_PROVIDER 选择(该开关只在 Creem 与 Stripe 之间切换),并且
存在下文的金额注意事项。请将其视为参考,而非生产路径。
配置
| 变量 | 用途 |
|---|---|
NUXT_ZPAY_URL | ZPay API 端点。 |
NUXT_ZPAY_MERCH_ID | 商户 ID。 |
NUXT_ZPAY_MERCH_KEY | 用于 MD5 签名的商户密钥。 |
NUXT_ZPAY_NOTIFY_URL | ZPay 支付后回调的公开 URL。 |
见 环境变量。
结账
createPayment 构建一个支付宝类型的 ZPay 请求(type: "alipay"),用 MD5 + 商户密钥
对排序后的参数签名,并返回跳转 checkoutUrl。用户支付后经 NUXT_ZPAY_NOTIFY_URL 返回。
Webhook
- 路径:
GET /api/payment/notify/zpay(notify/zpay.get.ts)—— 这是一个 GET 回调,与 Creem/Stripe 的 POST webhook 不同。 - 校验: 对排序后的查询参数与商户密钥重新计算 MD5 签名,与
sign参数比较。 - 处理结果:
trade_status === "TRADE_SUCCESS"将订单标记为success并创建一条 一次性subscription;否则订单标记为失败。
ZPay 金额注意事项
create.post.ts 记录的金额/币种来自 app/config/payment-config.ts,但 ZPay 提供商的
createPayment 当前收取的是 shared/config/payment.ts 中的
Math.round(paymentConfig.amountCNY * 100) —— 即对每一笔订单都使用硬编码的样例
CNY 金额,与所选方案无关。
上线前请替换 shared/config/payment.ts,并将 ZPay 的收费金额映射到你真实的按方案定价。
验证
- 设置 ZPay 环境变量后,已登录用户可发起结账并创建一条
payment行。 - 带有效 MD5 签名且
TRADE_SUCCESS的回调将订单翻转为success;无效签名被拒绝。 - 收费金额与所选方案一致(在替换样例
amountCNY之后)。
