Files
2026-08-18 17:13:20 +08:00

48 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Context
代理在线充值现有 `OnlinePaymentPort` 抽象只有微信直连 H5/MWEB 与支付宝 WAP 两个 Adapter`payment-methods` 只调用 `wechat.Available``alipay.Available`。当前生效配置为富友时,微信 Adapter 因 `provider_type=fuiou` 判定不可用,导致只返回 `alipay`。富友本质是微信支付上游通道,`pkg/fuiou` 已具备 XML/GBK/双重 URL 编码/RSA 签名验签与回调解析能力,但缺少主扫下单与订单查询。参见 proposal.md - Why。
## Goals / Non-Goals
**Goals:**
- 对外支付方式枚举保持 `wechat` / `alipay`,不暴露 `fuiou`
- 富友配置下 `wechat` 走富友主扫统一下单,复用现有 `qr_content` 契约。
- 富友通道下主动查单通过 `/commonQuery` 收敛状态,不重建支付链接。
- 回调与确认校验接受 `channel=fuiou` 对应业务方式 `wechat`
**Non-Goals:**
- 不新增对外 `fuiou` 支付方式,不改前端枚举。
- 不接入富友退款、撤销、条码支付(商户扫用户)等其它交易类型。
- 不改支付宝通道(仍走直接支付宝 WAP
## Decisions
### 新增富友扫码 Adapter 而非扩展微信 Adapter
新增 `FuiouScanAdapter` 实现 `OnlinePaymentPort``Available` 判定 `provider_type==fuiou` 且富友字段完整;`CreatePaymentURL` 调主扫下单返回 `qr_code``Query` 调订单查询映射 `trans_stat`。备选方案是在 `WechatWebAdapter` 内部分支,但会混淆微信直连与富友的日志提供方、错误语义与恢复策略,故放弃。
### Adapter 选择改为配置感知
`OnlineCreationService``RecoverOnlinePaymentService``adapter()` 增加 `config` 参数:`wechat` 方法 + `provider_type==fuiou` 返回富友 Adapter否则返回微信 Adapter。恢复阶段富友与微信一致只查单不重建链接。
### 业务方式与渠道分离存储
`Payment.PaymentMethod` 与充值记录 `PaymentMethod` 保持 `wechat`(业务语义),充值记录 `PaymentChannel``fuiou`(实际渠道);`paymentMerchantIdentity` 在富友下返回 `FyMchntCd`。回调 `PaymentMethod=fuiou` 在确认入口归一化为业务方式 `wechat`,领域校验允许 `channel=fuiou` 映射到 `method=wechat`
### 复用现有富友回调
异步通知复用 `FuiouPayCallback``VerifyNotify``NotifyRequest` 字段与主扫通知报文一致,不做改动。
## Risks / Trade-offs
- [富友主扫 `mchnt_order_no` 必须全局唯一,重复会被拒绝] → 复用本地 `payment_no` 作为商户订单号,且恢复阶段只查单不重建链接。
- [富友查询 `trans_stat``9999`/空/`1010` 时状态未知] → 映射为 unknown保持待恢复继续查不确认收款也不关闭。
- [富友 `reserved_*` 字段不参与签名且渠道会新增] → 复用 `pkg/fuiou` 现有 `structToMap` 排除 reserved 前缀的签名规则。
- [回调无支付时间或金额不一致] → 现有确认用例已校验金额、配置身份与支付时间,富友金额用 `order_amt`(分)、时间用 `reserved_txn_fin_ts`
## Migration Plan
无数据库迁移、无新外部依赖。代码上线后,将生效支付配置切为富友即可使代理在线充值展示微信扫码;回滚为恢复生效配置为微信直连或回退代码,不改变既有数据语义。