让代理充值复用现有网页支付能力
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m7s

微信按当前 v2/v3 配置分别生成 MWEB/H5 链接,支付宝复用 C 端 WAP 链接,并让可用支付方式基于生效配置判断。

Constraint: 支付链接统一通过 qr_content 返回,由前端渲染二维码;按要求不运行测试

Rejected: 微信 Native 与支付宝当面付 | 会引入非当前商户配置所需的额外产品开通

Confidence: high

Scope-risk: moderate

Directive: 微信 H5/MWEB 二维码仅承诺系统相机或外部浏览器扫码链路

Tested: 相关 Go 包编译通过;gofmt 与 git diff --check 通过

Not-tested: 按用户要求未运行自动化测试及真实支付联调
This commit is contained in:
2026-07-30 11:41:50 +08:00
parent 0f4f0d1176
commit 8fc667daee
24 changed files with 692 additions and 352 deletions

View File

@@ -22,22 +22,22 @@
平台或超级管理员的 `offline` 线下代充 MUST 继续使用现有目标 `shop_id`、付款凭证和企业微信审批契约,在线充值 100 元最低金额 MUST NOT 改变线下代充金额规则。平台、超级管理员和企业账号 MUST NOT 创建代理在线扫码充值单。
在线创建 MUST 在同一 GORM 事务中保存充值单、支付单及请求幂等事实,再调用创建时选定的支付 Adapter微信 MUST 使用 Native 支付,支付宝 MUST 使用 `alipay.trade.precreate`。成功响应 MUST 使用统一 `{code,msg,data,timestamp}` 格式,并在 `data` 中至少返回 `recharge_id``recharge_no``payment_no``payment_method``recharge_source``recharge_source_name``amount``qr_content``status``status_name`后端 MUST 返回支付渠道原始付款字符串,不得生成或保存二维码图片。
在线创建 MUST 在同一 GORM 事务中保存充值单、支付单及请求幂等事实,再按当前生效支付配置调用选定 Adapter`provider_type=wechat` 使用微信 v3 H5 并返回 `h5_url``provider_type=wechat_v2` 使用微信 v2 MWEB 并返回 `mweb_url`,支付宝复用 C 端 `alipay.trade.wap.pay` 手机网站支付链接能力。成功响应 MUST 使用统一 `{code,msg,data,timestamp}` 格式,并在 `data` 中至少返回 `recharge_id``recharge_no``payment_no``payment_method``recharge_source``recharge_source_name``amount``qr_content``status``status_name``qr_content` MUST 支付渠道 HTTPS URL前端自行渲染二维码后端不得生成或保存二维码图片。
充值订单创建、列表、详情和在线支付状态响应 MUST 使用稳定来源枚举区分创建路径:`platform_offline` 表示平台线下代充,`agent_online` 表示代理在线自充。列表 MUST 支持使用 `recharge_source` 筛选;来源可由受控创建方式推导,不要求新增重复数据库字段。
支付单 MUST 同时保存创建时的收款身份快照:微信记录商户号,支付宝记录应用 ID并保留支付方式与 `payment_config_id`,供后续导出对账。创建响应 MUST NOT 返回该内部收款身份快照。
第三方预下单失败时,系统 MUST 记录 Integration Log将本次支付单标记为失败、充值单标记为已关闭;不得返回缺少有效 `qr_content` 的成功响应。
支付链接生成失败时,系统 MUST 将本次支付单标记为失败、充值单标记为已关闭;微信 H5/MWEB 外部下单尝试 MUST 记录 Integration Log支付宝本地签名生成 WAP URL 不得伪造外部调用日志。系统不得返回缺少有效 `qr_content` 的成功响应。
#### Scenario: 代理创建微信 Native 扫码充值
#### Scenario: 代理创建微信 H5/MWEB 链接扫码充值
- **WHEN** 代理提交 `amount=10000``payment_method=wechat` 和新的 `request_id`
- **THEN** 系统从登录上下文确定当前店铺主钱包,创建充值单和支付单,调用微信 Native 预下单,并将 `code_url` 映射为 `qr_content`
- **THEN** 系统从登录上下文确定当前店铺主钱包,创建充值单和支付单,按当前配置调用 v3 H5 或 v2 MWEB并将 `h5_url``mweb_url` 映射为 `qr_content`
- **THEN** 响应不得包含支付配置 ID、商户密钥或其他店铺信息
#### Scenario: 代理创建支付宝当面付扫码充值
#### Scenario: 代理创建支付宝 WAP 链接扫码充值
- **WHEN** 代理提交有效金额、`payment_method=alipay` 和新的 `request_id`
- **THEN** 系统创建充值单和支付单,`alipay.trade.precreate`,并将 `qr_code` 映射为 `qr_content`
- **THEN** 系统创建充值单和支付单,使`alipay.trade.wap.pay` 生成签名 HTTPS URL并将 URL 映射为 `qr_content`
#### Scenario: 区分平台代充与代理自充
- **WHEN** 调用方查询充值订单列表、详情或在线支付状态
@@ -53,14 +53,14 @@
#### Scenario: 相同请求重放
- **WHEN** 同一提交账号使用相同 `request_id` 和相同业务字段重试
- **THEN** 系统 MUST 返回首次创建的充值单、支付单和付款内容,不得再次创建业务单或再次向第三方预下单
- **THEN** 系统 MUST 返回首次创建的充值单、支付单和支付链接,不得再次创建业务单或再次调用支付渠道生成链接
#### Scenario: 幂等请求载荷冲突
- **WHEN** 同一提交账号使用已有 `request_id` 但改变金额或支付方式
- **THEN** 系统 MUST 返回 `CodeConflict`,不得改变原充值单或创建新单
#### Scenario: 支付方式不可用
- **WHEN** 所选支付方式缺少完整配置、扫码预下单能力或回调验签能力
- **WHEN** 所选支付方式缺少完整配置、支付链接生成能力或回调验签能力
- **THEN** 系统 MUST 返回统一支付配置不可用错误,且不得创建只有本地记录而无法付款的待支付订单
---
@@ -491,12 +491,12 @@ Outbox 消费者 MUST 在独立事务中复用统一代理主钱包入账能力
### Requirement: 查询代理在线充值可用支付方式
系统 SHALL 提供 `GET /api/admin/agent-recharges/payment-methods`,仅根据当前生效支付配置返回真正具备扫码预下单、回调验签和查单能力的在线支付方式。路由 MUST 注册在 `/:id` 动态路由之前。
系统 SHALL 提供 `GET /api/admin/agent-recharges/payment-methods`,仅根据当前生效支付配置返回真正具备支付链接生成、回调验签和查单能力的在线支付方式。路由 MUST 注册在 `/:id` 动态路由之前。
成功响应 MUST 使用统一 `{code,msg,data,timestamp}` 格式;`data.methods` MUST 为按 `wechat``alipay` 固定顺序排列的字符串数组,并同时返回 `min_amount=10000``max_amount=100000000`。接口不得返回支付配置 ID、商户号、应用 ID、密钥或具体缺失的敏感配置。
#### Scenario: 微信与支付宝均可用
- **WHEN** 当前支付配置完整支持微信 Native 和支付宝 PreCreate
- **WHEN** 当前支付配置完整支持对应协议的微信 H5/MWEB 和支付宝 WAP 支付
- **THEN** 接口 MUST 返回 `methods=["wechat","alipay"]` 及在线金额上下限
#### Scenario: 没有可用扫码支付方式
@@ -558,14 +558,14 @@ Outbox 消费者 MUST 在独立事务中复用统一代理主钱包入账能力
| 1 | 待支付(订单已创建,等待支付) |
| 2 | 已支付(第三方收款已确认,钱包入账处理中) |
| 3 | 已完成(钱包余额和唯一流水已提交) |
| 4 | 已关闭(第三方预下单失败或确认订单已关闭) |
| 4 | 已关闭(支付链接生成失败或确认订单已关闭) |
**支付方式枚举**
| 值 | 含义 |
|----|------|
| wechat | 微信 Native 扫码支付 |
| alipay | 支付宝当面付扫码支付 |
| wechat | 微信 H5/MWEB 支付链接扫码支付 |
| alipay | 支付宝 WAP 支付链接扫码支付 |
| offline | 线下转账(仅平台账号可用) |
**支付通道枚举**