Files
mpay_v2_webman/doc/project_progress.md
2026-03-20 10:31:13 +08:00

321 lines
7.8 KiB
Markdown
Raw 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.

# MPay V2 Development Progress
更新日期2026-03-13
本文档用于记录当前项目完成度、明显缺口和建议推进顺序,方便后续继续开发时快速接手。
## 1. 当前总体判断
项目已经完成了“支付中台基础骨架 + 后台配置能力 + Epay 协议首条链路”的主体搭建。
更准确地说:
- 数据模型已经比较完整
- 后台配置能力已经具备可用性
- 支付流程主链路已经跑通到“下单并返回拉起参数”
- 真正需要继续补的是“真实渠道闭环、规则执行、异步补偿、通用协议扩展”
## 2. 已完成
### 2.1 基础框架与环境
- Webman 项目骨架已搭建
- MySQL / Redis / JWT / Cache / Event / Redis Queue 依赖已接入
- 管理后台与 API 路由已拆分
### 2.2 管理后台能力
- 验证码登录
- JWT 鉴权中间件
- 管理员信息查询
- 菜单与系统配置读取
- 商户 CRUD
- 商户应用 CRUD
- 支付方式 CRUD
- 支付插件注册 CRUD
- 支付通道 CRUD
- 订单列表 / 详情 / 后台发起退款
### 2.3 核心支付数据结构
已建表并落地:
- 商户
- 商户应用
- 支付方式
- 插件注册
- 支付通道
- 支付订单
- 回调日志
- 商户通知任务
- 回调幂等收件箱
### 2.4 下单主链路
已打通:
- Epay 参数校验
- Epay MD5 验签
- 商户应用识别
- 幂等订单创建
- 通道路由
- 插件实例化
- 插件下单
- 订单回写支付参数
- 返回兼容 Epay 的响应结构
### 2.5 支付状态基础设施
- 订单状态机服务已存在
- 成功 / 失败 / 全额退款关单状态迁移已定义
- 回调日志记录能力已存在
- 回调幂等收件箱已存在
- 商户通知任务创建逻辑已存在
### 2.6 插件体系
已建立统一插件契约:
- `PaymentInterface`
- `PayPluginInterface`
- `BasePayment`
说明后续继续接入新渠道时,整体扩展方式已经明确。
## 3. 部分完成
### 3.1 Epay 兼容是“主路径”,但还不是“全量兼容”
当前已实现:
- `submit.php`
- `mapi.php`
- `api.php?act=order`
- `api.php?act=refund`
`doc/epay.md` 中提到的一些能力,如 `query``settle``orders` 等,代码中暂未实现。
### 3.2 支付宝插件代码较完整,但未在当前数据库启用
现状:
- `AlipayPayment.php` 已实现
- 当前开发库 `ma_pay_plugin` 中只有 `lakala`
这意味着支付宝更多处于“代码已写好、配置未接入”的状态。
### 3.3 回调后通知商户的基础逻辑存在,但补偿闭环还不完整
已完成:
- 创建通知任务
- 发送通知
- 失败重试时间计算
待确认 / 待补齐:
- 当前没有看到明确的任务投递入口
- 也没有看到定时调度 `NotifyMerchantJob` 的配置闭环
- `NotifyMerchantJob` 虽然存在,但尚未形成明确的可运行消费链路
更保守地说,商户通知补偿链路还没有真正闭环。
## 4. 待完成
### 4.1 通用 OpenAPI
当前状态:
- `PayController` 只有骨架
- `create/query/close/refund` 都返回 `501`
- `OpenApiAuthMiddleware` 已存在,但未挂到路由
建议判断:这是下一阶段最适合补完的能力之一。
### 4.2 拉卡拉真实对接
当前状态:
- `LakalaPayment::pay()` 只返回 mock 二维码
- `query/close/refund/notify` 全部未实现
影响:
- 现在只能用于打通订单创建流程
- 还不能进行真实线上支付联调
### 4.3 通道路由规则执行
数据库已设计的字段很多,但运行期并未全部生效:
- `daily_limit` 未校验
- `daily_cnt` 未校验
- `min_amount` 未校验
- `max_amount` 未校验
- `split_ratio` 当前只存储,未看到清算分账逻辑
- 路由策略目前只是“按排序取第一条可用通道”
这块是项目从“能下单”走向“可运营”的关键缺口。
### 4.4 Epay 协议映射细节
当前内部支付方式代码使用:
- `alipay`
- `wechat`
但传统 Epay 常见值通常还有:
- `wxpay`
- `qqpay`
当前代码里没有看到统一别名映射层,说明“协议兼容”仍偏接口形态兼容,而不是完整字段语义兼容。
### 4.5 插件注册与初始化数据同步
代码、SQL、数据库现状存在轻微偏差
- `database/dev_seed.sql` 里准备了 `alipay``lakala`
- 当前开发库只看到 `lakala`
建议后续把“代码存在但数据库未启用”的状态统一起来,减少联调歧义。
### 4.6 通道安全与敏感配置
当前通道配置直接存在 `config_json` 中,后续建议补充:
- 敏感字段加密存储
- 后台展示脱敏
- 配置变更审计日志
### 4.7 测试体系
当前仓库里没有看到成体系的:
- 单元测试
- 协议测试
- 插件对接测试
- 回调幂等测试
- 退款回归测试
这会让后续迭代的回归成本越来越高。
## 5. 风险与注意点
### 5.1 当前“多通道”能力更偏配置层,而不是调度层
虽然表结构和后台已经支持多通道,但运行时路由还比较简单,不能完全体现:
- 限额控制
- 金额区间控制
- 通道健康度切换
- 优先级与容灾
### 5.2 退款能力目前偏基础版
当前退款服务已存在,但从实现上看:
- 更适合单次退款 / 全额退款
- 全额退款后直接把订单关闭
- 没有独立退款单模型
- 没有完整的部分退款累计能力
### 5.3 回调成功后的订单与通知一致性要继续加强
当前已经有:
- 幂等收件箱
- 状态机
- 通知任务表
这是很好的基础。
但真正生产级还建议再补:
- 事务边界说明
- 异常重放工具
- 回调人工补单工具
- 通知签名
## 6. 建议优先级
### P0优先补完直接影响可用性
1. 实现真实渠道插件,至少先补完一个可联调通道
2. 补完 OpenAPI 主链路
3. 在路由阶段执行金额限制 / 限额 / 笔数规则
4. 打通商户通知任务的实际调度与重试闭环
### P1补齐可运营能力
1. 增加支付方式别名映射,提升 Epay 兼容度
2.`AlipayPayment` 正式接入插件注册与通道配置
3. 增加后台对通道能力、产品、环境的可视化说明
4. 增加日志检索与问题排查手段
### P2走向平台化
1. 增加更多协议兼容层
2. 增加清算 / 分账 / 对账
3. 增加风控规则
4. 增加监控、告警、报表
## 7. 建议后续开发方向
### 方向一:先做“一个真实可用通道”
建议优先把某一个通道做成完整闭环:
- 下单
- 回调
- 查单
- 关单
- 退款
这样项目就能从“框架完成”升级为“真实可上线联调”。
### 方向二:补通用 OpenAPI
原因:
- 你已经明确后续可能兼容更多接口
- 当前通用控制器和鉴权中间件已经有雏形
- 补完之后,项目会从“单协议适配器”升级为“统一支付网关”
### 方向三:把通道路由做成真正的策略引擎
建议把下面这些字段从“仅存储”升级为“真实执行”:
- 金额范围
- 单日限额
- 单日限笔
- 通道优先级
- 通道健康状态
- 权重或降级策略
### 方向四:补测试与排障工具
优先建议增加:
- 下单幂等测试
- 回调幂等测试
- 退款状态测试
- 协议字段兼容测试
- 一键重发通知工具
## 8. 推荐继续开发顺序
如果下一次直接继续往下做,我建议按这个顺序推进:
1. 选定一个真实渠道作为首个闭环目标
2. 补完该插件的 `notify/query/refund/close`
3. 接入并验证商户通知补偿链路
4.`ChannelRouterService` 前后补齐通道规则校验
5. 正式实现 `PayController`
6. 抽象协议适配层,准备支持更多接口
7. 增加测试与后台排障能力
## 9. 当前一句话结论
这是一个“骨架已经成型、第一条协议已打通、非常适合继续往生产级推进”的支付中台项目;下一阶段的重点不是重写,而是把已有设计真正补成闭环。