让代理充值复用现有网页支付能力
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m7s
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:
@@ -1,6 +1,6 @@
|
||||
# 新增需求 05:代理钱包扫码充值
|
||||
|
||||
> 状态:已冻结,本文保留为实施明细;如有冲突,以标准评审稿和 UR#34 PRD 为准。
|
||||
> 状态:2026-07-30 修正支付产品选择,本文保留为实施明细;如有冲突,以标准评审稿和 UR#34 PRD 为准。
|
||||
> 评审主文档:`../../7月迭代技术方案-标准评审稿.md`
|
||||
> 实施 PRD:`../../../../.scratch/ur34-agent-recharge/PRD.md`
|
||||
> 范围:代理在后台使用微信或支付宝扫码充值代理主钱包。
|
||||
@@ -12,8 +12,8 @@
|
||||
3. 单笔最低充值金额为 100 元,即 `10000` 分。
|
||||
4. 代理在线充值不进入企业微信审批;支付成功事实先落库,再由可靠 Worker 幂等增加代理主钱包余额。
|
||||
5. 平台员工线下代充值仍按 `02-企业微信审批接入.md` 走企微审批,与本方案隔离。
|
||||
6. 后端返回支付二维码内容,前端使用现有二维码组件渲染,不由后端生成或保存二维码图片文件。
|
||||
7. 微信使用 Native 支付,支付宝使用 `alipay.trade.precreate` 当面付预创建。
|
||||
6. 后端返回支付 URL,前端使用现有二维码组件渲染,不由后端生成或保存二维码图片文件。
|
||||
7. 微信按当前配置使用 v3 H5 或 v2 MWEB,支付宝复用 C 端 `alipay.trade.wap.pay` 手机网站支付;不要求开通 Native 或当面付产品。
|
||||
8. 支付回调、钱包入账、钱包流水和审计必须幂等,重复回调不能重复加钱。
|
||||
9. 当前代理充值复杂写逻辑迁移到 Application/Domain,旧 Service 不再保留另一套在线入账逻辑。
|
||||
|
||||
@@ -46,9 +46,9 @@ sequenceDiagram
|
||||
Agent->>Web: 输入金额并选择支付方式
|
||||
Web->>API: 创建扫码充值单
|
||||
API->>DB: 创建充值单和支付单
|
||||
API->>Pay: Native/PreCreate 预下单
|
||||
Pay-->>API: 二维码内容
|
||||
API-->>Web: 原样返回 qr_content
|
||||
API->>Pay: 生成 H5/WAP 支付链接
|
||||
Pay-->>API: HTTPS URL
|
||||
API-->>Web: URL 写入 qr_content 返回
|
||||
Web-->>Agent: 展示二维码并轮询支付状态
|
||||
Agent->>Pay: 扫码完成支付
|
||||
Pay->>Callback: 异步支付通知
|
||||
@@ -87,9 +87,9 @@ internal/
|
||||
│ ├── post_wallet.go 可靠任务执行钱包入账
|
||||
│ ├── sync_pending.go 受控查询待支付第三方订单
|
||||
│ └── get_payment_status.go 轻量支付状态查询
|
||||
├── infrastructure/adapter/payment/
|
||||
│ ├── wechat_native.go 微信 Native 预下单
|
||||
│ └── alipay_precreate.go 支付宝当面付预创建
|
||||
├── infrastructure/payment/
|
||||
│ ├── wechat_web.go 微信 H5/MWEB 支付链接与查单
|
||||
│ └── alipay_wap.go 支付宝 WAP 支付链接与查单
|
||||
├── infrastructure/persistence/
|
||||
│ └── agent_recharge_repository.go
|
||||
└── query/agentrecharge/
|
||||
@@ -123,7 +123,7 @@ internal/
|
||||
- 钱包乐观锁冲突时由 Application 重新加载后有限重试,不能重复创建流水。
|
||||
- 支付渠道成功不等于业务已经完成;只有钱包事务成功后充值单才变为已完成。
|
||||
|
||||
## 五、支付预下单
|
||||
## 五、支付链接
|
||||
|
||||
### 5.1 统一支付单
|
||||
|
||||
@@ -147,35 +147,35 @@ tb_payment.amount = recharge_amount
|
||||
tb_payment.payment_config_id = 创建时使用的配置ID
|
||||
```
|
||||
|
||||
先完成本地事务,再调用第三方预下单。预下单失败时把支付单标记为失败并关闭本次充值单,代理重新创建,不复用来源不明确的旧二维码。
|
||||
先完成本地事务,再生成支付链接。链接生成失败时把支付单标记为失败并关闭本次充值单,代理重新创建,不复用来源不明确的旧链接。
|
||||
|
||||
### 5.2 微信扫码
|
||||
|
||||
微信使用 Native 下单:
|
||||
微信按当前配置选择 H5/MWEB 下单:
|
||||
|
||||
```text
|
||||
微信支付 v3 TransactionNative
|
||||
-> 返回 code_url
|
||||
provider_type=wechat -> 微信 v3 TransactionH5 -> h5_url
|
||||
provider_type=wechat_v2 -> 微信 v2 MWEB -> mweb_url
|
||||
```
|
||||
|
||||
现有微信 SDK 已包含 `TransactionNative`,需要在项目支付 Adapter 中封装,不在 Handler 直接调用 SDK。
|
||||
代理充值 Adapter 复用统一 `CreateH5Order` 入口,不在 Handler 判断协议或重复调用 SDK。
|
||||
|
||||
若当前生效支付配置为:
|
||||
|
||||
- `wechat`:使用微信 v3 Native。
|
||||
- `wechat_v2`:补充 v2 Native 统一下单实现。
|
||||
- `fuiou`:只有现有富友配置明确支持后台扫码产品时才返回微信可用;不支持时前端隐藏微信扫码入口,不擅自用 JSAPI 代替。
|
||||
- `wechat`:使用微信 v3 H5。
|
||||
- `wechat_v2`:使用微信 v2 MWEB,并复用 v2 查单与回调验签。
|
||||
- `fuiou`:不在本需求扩展富友后台扫码产品,不返回微信可用。
|
||||
|
||||
### 5.3 支付宝扫码
|
||||
|
||||
支付宝使用当前 SDK 已提供的:
|
||||
支付宝复用 C 端现有手机网站支付链接:
|
||||
|
||||
```text
|
||||
alipay.trade.precreate
|
||||
-> 返回 qr_code
|
||||
alipay.trade.wap.pay
|
||||
-> 返回签名 HTTPS URL
|
||||
```
|
||||
|
||||
不复用现有 WAP 支付 URL。创建时校验当前支付配置中的:
|
||||
该方式不依赖支付宝当面付。创建时校验当前支付配置中的:
|
||||
|
||||
```text
|
||||
ali_app_id
|
||||
@@ -184,11 +184,11 @@ ali_public_key
|
||||
ali_notify_url
|
||||
```
|
||||
|
||||
配置不完整时支付宝方式显示为不可用,不能创建只有本地记录而没有有效二维码的充值单。
|
||||
配置不完整时支付宝方式显示为不可用,不能创建只有本地记录而没有有效支付链接的充值单。
|
||||
|
||||
### 5.4 二维码响应
|
||||
|
||||
后端统一返回二维码内容,不返回二维码图片:
|
||||
后端统一返回支付 URL,不返回二维码图片:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -197,7 +197,7 @@ ali_notify_url
|
||||
"payment_no": "ARCH20260715143000000001",
|
||||
"payment_method": "wechat",
|
||||
"amount": 10000,
|
||||
"qr_content": "weixin://wxpay/bizpayurl?...",
|
||||
"qr_content": "https://pay.example.com/...",
|
||||
"status": 1,
|
||||
"status_name": "待支付",
|
||||
"payment_status": 0,
|
||||
@@ -207,7 +207,7 @@ ali_notify_url
|
||||
}
|
||||
```
|
||||
|
||||
微信返回 `code_url`、支付宝返回 `qr_code`,Application 统一映射为 `qr_content`。
|
||||
微信返回 `h5_url`、支付宝返回签名 WAP URL,Application 统一映射为 `qr_content`,前端自行渲染二维码。
|
||||
|
||||
本地无法准确知道第三方订单的真实失效时间,因此接口不返回 `expires_at`,前端不展示本地推算的精确倒计时。第三方支付成功或关闭以回调和后端受控查单为准。
|
||||
|
||||
@@ -404,14 +404,14 @@ GET /api/admin/agent-recharges/{id}/payment-status
|
||||
|
||||
```text
|
||||
代理创建充值单
|
||||
支付预下单成功/失败
|
||||
支付链接生成成功/失败
|
||||
微信/支付宝支付回调成功/失败
|
||||
钱包入账成功/失败
|
||||
重复回调被幂等忽略
|
||||
第三方查单确认支付关闭或失效
|
||||
```
|
||||
|
||||
支付渠道交互写 `tb_integration_log`,钱包余额变化写关键 `Audit Event`,并关联充值单、支付单、代理钱包和钱包流水。
|
||||
微信 H5/MWEB 下单与支付渠道查单写 `tb_integration_log`;支付宝 WAP URL 本地签名不伪造外部调用日志。钱包余额变化写关键 `Audit Event`,并关联充值单、支付单、代理钱包和钱包流水。
|
||||
|
||||
在线充值不产生审批通知。目标代理主钱包实际入账后必须生成“充值到账”站内通知;在线实际提交账号与目标代理主账号不同时,两者分别通知并按充值单与接收人防重。平台线下代充值的真实提交人只接收 UR#37 的审批结果通知,除非其本身也是到账通知接收人。
|
||||
|
||||
@@ -423,8 +423,8 @@ GET /api/admin/agent-recharges/{id}/payment-status
|
||||
- `CreateAgentRechargeRequest.payment_method` 增加 `alipay`,金额校验改为 `min=10000`。
|
||||
- 创建代理在线充值时同时创建 `tb_payment` 记录。
|
||||
- 新增 `PaymentOrderTypeAgentRecharge`。
|
||||
- 微信支付 Adapter 增加 Native 预下单。
|
||||
- 支付宝 Adapter 增加 `TradePreCreate`。
|
||||
- 微信支付 Adapter 复用 C 端 H5 下单并返回 `h5_url`。
|
||||
- 支付宝 Adapter 复用 C 端 `BuildWapPayURL`。
|
||||
- 支付宝回调增加代理充值分发。
|
||||
- 微信/富友代理充值回调统一改为按支付单分发,不只依赖 `ARCH` 前缀。
|
||||
- 原 `agent_recharge.Service.HandlePaymentCallback` 迁入 `ConfirmAgentRechargePayment` 用例。
|
||||
@@ -444,8 +444,8 @@ GET /api/admin/agent-recharges/{id}/payment-status
|
||||
|
||||
1. 验证 99.99 元被后端拒绝,100 元可以创建充值单。
|
||||
2. 验证代理只能为自己的店铺创建微信或支付宝充值。
|
||||
3. 验证微信 Native 返回有效 `code_url`,前端能够扫码支付。
|
||||
4. 验证支付宝 PreCreate 返回有效 `qr_code`,前端能够扫码支付。
|
||||
3. 分别验证微信 v3 H5 与 v2 MWEB 返回有效 HTTPS URL,前端能够渲染二维码并通过外部浏览器扫码支付。
|
||||
4. 验证支付宝 WAP 返回有效签名 HTTPS URL,前端能够渲染二维码并扫码支付,且商户无需开通当面付。
|
||||
5. 验证支付回调通过支付单类型分发到代理充值用例。
|
||||
6. 验证微信、支付宝回调金额不一致时不会增加钱包余额。
|
||||
7. 验证支付成功后不创建企微审批实例,先固化支付事实,再由可靠 Worker 完成钱包入账。
|
||||
|
||||
Reference in New Issue
Block a user