Files
junhong_cmp_fiber/openspec/changes/add-payment-config-management/proposal.md
huang 63ca12393b docs: 新增 OpenSpec 提案 add-payment-config-management
包含 proposal.md、design.md、tasks.md 及各模块 spec 文件(微信配置管理、富友支付、代理充值、订单支付、资产充值适配、微信支付留桩)

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-16 23:30:39 +08:00

6.6 KiB
Raw Blame History

Why

当前微信相关参数(公众号 OAuth、小程序、支付凭证硬编码在环境变量中只有一套配置无法动态切换。业务上微信公众号/小程序随时可能被封禁,需要在管理后台秒级切换到备用配置恢复 OAuth 登录和支付能力。同时需要接入富友支付作为备选通道,降低对微信直连的单一依赖。此外,代理预充值(余额钱包在线充值)当前只有 Store 层骨架,缺少完整的 Service/Handler/回调处理,需要补齐。

What Changes

本提案包含两个目标,按顺序实施:

Goal 1微信参数配置管理 + 支付流程改造

  • 新增微信参数配置管理模块:支持在管理后台 CRUD 管理多套微信参数配置,每套配置 = 完整的"微信身份"OAuth 公众号 + OAuth 小程序 + 支付凭证),支持全局唯一激活
  • 新建 tb_wechat_config:扁平字段存储 OAuth 参数(公众号 AppID/AppSecret、小程序 AppID/AppSecret、微信直连支付参数、富友支付参数支持多配置共存
  • 新增富友支付 SDK:基于富友 wxPreCreate 接口实现公众号 JSAPI 和小程序支付,移植 cc-coding 项目的 RSA 签名、XML 编解码、GBK 转换等核心逻辑
  • 改造订单支付流程:订单创建时从数据库/Redis 动态加载当前生效配置记录 payment_config_id支付发起WechatPayJSAPI/WechatPayH5本次留桩,添加 TODO 标记,保留单例调用——等下一阶段实现动态加载;同时删除启动时基于 YAML 创建 PaymentService 单例的相关代码
  • 订单关联配置tb_order 新增 payment_config_id 字段,回调按该字段加载对应配置验签,解决配置切换期间在途支付的竞态问题
  • 资产充值模块适配tb_asset_recharge_record 新增 payment_config_id 字段,充值回调按配置验签
  • 常量重命名pkg/constants/wallet.goCard* 前缀常量统一重命名为 Asset*,与模型层命名一致
  • 配置切换安全策略:切换配置时不取消在途订单,旧订单按原配置自然完成或超时过期;无生效配置时只允许钱包/线下支付
  • 仅平台用户可操作:通过路由层中间件限制仅平台用户访问
  • 审计日志:所有 CRUD 和激活/停用操作记录审计日志,复用现有 AuditServiceInterface

注意OAuth 配置字段本次只存储和管理(数据库 + 管理界面OfficialAccountService 的动态加载改造留待 H5/小程序重构时实施。客户端支付发起(调用第三方获取拉起支付参数)本次留桩不实现,在另一个 session 讨论。

Goal 2代理预充值系统

  • 新增代理余额钱包在线充值:完整的 Service + Handler + 回调处理,支持微信在线支付和线下充值
  • 代理只能选择微信支付:后端根据当前生效配置自动路由到微信直连或富友,对代理透明
  • 线下充值仅平台操作:需要操作密码二次验证
  • tb_agent_recharge_record 新增 payment_config_id 字段
  • 充值目标:仅充到余额钱包(wallet_type=main),佣金钱包通过分佣自动入账

注意:代理充值的客户端支付发起(调用第三方获取拉起参数)同样留桩不实现。回调处理完整实现(解析第三方支付成功通知)。

Capabilities

New Capabilities

  • wechat-config-management:微信参数配置的 CRUD 管理、激活/停用、全局唯一激活约束、Redis 缓存、接口脱敏、审计日志
  • fuiou-payment:富友支付集成,包括 wxPreCreate 下单(公众号 JSAPI + 小程序、支付回调验签处理、RSA 签名/XML 编解码
  • agent-recharge:代理余额钱包在线充值,创建充值订单、线下充值确认、回调处理、钱包余额更新

Modified Capabilities

  • wechat-payment配置来源从环境变量改为数据库动态加载Payment 实例从启动时单例改为按需创建(留桩)
  • order-payment:订单新增 payment_config_id 字段;下单时无生效配置则拒绝第三方支付;回调处理按 payment_config_id 加载对应配置验签
  • asset-recharge:充值表新增 payment_config_id 字段;回调处理按配置验签;修复 RechargeOrderPrefix 废弃问题(当前用 "RCH",实际前缀是 "CRCH"

Impact

  • 新增文件Modelwechat_config.go、DTO、Store、Service、Handler、迁移文件、富友 SDK 包(pkg/fuiou/)、常量、错误码、代理充值 Service/Handler
  • 修改文件internal/model/order.go(新增字段)、internal/model/asset_wallet.go(新增字段)、internal/model/agent_wallet.go(新增字段)、internal/service/order/service.go(动态加载配置 + 注入 wechatConfigServiceinternal/handler/callback/payment.go(支持富友回调 + 按配置验签 + 修复前缀匹配)、pkg/constants/wallet.goCard→Asset 重命名)、internal/bootstrap/(注册新模块)、internal/routes/(注册新路由)、cmd/api/docs.go + cmd/gendocs/main.go(文档生成器)
  • 删除/精简文件YAML 支付方案遗留代码,必须清理):
    • pkg/config/config.go:删除 PaymentConfig 结构体 + WechatConfig.Payment 字段(约 15 行),保留 OfficialAccountConfig 结构体
    • pkg/config/defaults/config.yaml:删除 wechat.payment: 配置节(约 10 行),保留 wechat.official_account:
    • pkg/wechat/config.go:删除 NewPaymentApp(cfg *config.Config, ...) 函数(整个函数,约 30 行),保留 NewOfficialAccountApp
    • cmd/api/main.go:从 validateWechatConfig 中删除所有 wechatCfg.Payment.* 校验代码(约 40 行),保留公众号校验部分
  • 新增 API 路由/api/admin/wechat-configs/*8 个端点)、/api/admin/agent-recharges/*4 个端点)、/api/callback/fuiou-pay(富友回调)
  • 数据库变更:新建 tb_wechat_config 表、tb_order 新增 payment_config_id 列、tb_asset_recharge_record 新增 payment_config_id 列、tb_agent_recharge_record 新增 payment_config_id
  • 新增依赖golang.org/x/textGBK 编解码,富友支付需要)
  • 保留不改造支付宝支付AlipayCallback、PaymentMethodAlipay 常量保持原样不动);OfficialAccountService 及其 YAML 配置OAuth 本次只存不用);WechatPayment 单例注入(留桩期间保留,等支付发起动态化后再移除)
  • 性能考虑:生效配置使用 Redis 缓存TTL 5 分钟Keywechat:config:active),避免每次支付查 DB配置切换时主动清缓存保证即时生效