Files
junhong_cmp_fiber/openspec/specs/external-integration/spec.md
2026-08-18 17:13:20 +08:00

7.3 KiB
Raw Blame History

external-integration 当前行为

Purpose

描述企业微信、支付渠道、Gateway 与运营商回调的当前失败、重试和幂等边界。

Requirements

Requirement: 企微审批状态

系统 SHALL 将审批状态按 0=提交中、1=审批中、2=已通过、3=已拒绝、4=已撤销、5=通过后撤销、6=已删除、7=提交失败、8=提交结果未知返回。

Scenario: 企微审批状态

  • GIVEN 审批实例存在
  • WHEN 查询审批
  • THEN 返回数值状态和对应中文名称

Requirement: 企微回调与补偿

系统 SHALL 对企业微信回调执行验签解密,并使回调、轮询和人工同步进入同一权威状态同步语义。

Scenario: 企微回调与补偿

  • GIVEN 同一审批变化由多个同步来源到达
  • WHEN 处理同步
  • THEN 审批终态和业务终态至多生效一次

Requirement: 外部失败边界

系统 SHALL 将第三方超时、渠道错误和无效响应转换为当前稳定的系统错误;已接入外部交互日志的渠道同时保留脱敏结果。

Scenario: 外部失败边界

  • GIVEN 外部系统超时或返回失败
  • WHEN 调用依赖该系统的操作
  • THEN 客户端收到当前稳定错误;已接入外部交互日志的调用记录脱敏渠道结果

Requirement: 外部调用重试边界

系统 SHALL 仅对 Gateway 客户端超时、连接失败和 DNS 失败自动重试默认最多重试两次且每次重新签名HTTP 非 200、响应解析失败、Gateway 业务失败和调用方取消不重试。企业微信审批只有确认尚未调用提交接口的失败可释放后重试,提交结果未知时不得盲目重建审批。

Scenario: 外部写请求结果未知

  • GIVEN 企业微信审批提交请求可能已到达渠道但本地未取得确定结果
  • WHEN Worker 处理该失败
  • THEN 系统保留提交结果未知状态且不自动创建第二张审批单

Requirement: 富友调用超时兼容行为

系统 SHALL 保持当前富友预下单客户端未设置独立 HTTP 超时的兼容行为;调用可能持续等待底层连接结束,此行为作为当前缺陷记录而不在基线任务中修复。

Scenario: 富友端点不返回响应

  • GIVEN 富友连接建立后持续不返回响应
  • WHEN 系统发起预下单
  • THEN 当前适配器没有自身超时门禁,调用结果保持未确定直到底层请求返回错误或响应

Requirement: 运营商回调幂等

系统 SHALL 以渠道业务标识与标准化载荷生成的幂等键记录运营商实名及网络状态回调;重复回调只应用一次,字段冲突作为独立冲突事实保留且不得覆盖已确认状态。

Scenario: 重复运营商回调

  • GIVEN 同一合法运营商回调已经成功应用
  • WHEN 渠道再次发送相同业务事实
  • THEN 系统返回渠道可接受响应且不重复推进卡状态

Requirement: 富友主扫统一下单与订单查询

系统 SHALL 通过富友主扫统一下单创建微信二维码支付并返回 qr_code 二维码链接;系统 SHALL 通过富友订单查询按 trans_stat 将状态映射为已支付、已关闭、待支付或未知,未知状态 MUST 保持待恢复。下单与查询失败 MUST 映射为项目稳定错误,已接入外部交互日志的调用保留脱敏结果。

Scenario: 主扫下单成功返回二维码链接

  • GIVEN 富友支付配置完整
  • WHEN 系统发起主扫统一下单且渠道返回成功
  • THEN 系统返回 qr_code 作为支付链接,业务以该链接生成二维码

Scenario: 查询映射支付成功

  • WHEN 富友订单查询返回 trans_stat=SUCCESS
  • THEN 系统将状态映射为已支付并取得渠道交易号、金额与支付时间

Scenario: 查询映射已关闭

  • WHEN 富友订单查询返回 trans_statPAYERRORCLOSEDREVOKED
  • THEN 系统将状态映射为已关闭

Scenario: 查询映射待支付

  • WHEN 富友订单查询返回 trans_statUSERPAYINGNOTPAY
  • THEN 系统将状态映射为待支付

Scenario: 查询状态未知保持待恢复

  • WHEN 富友订单查询返回系统错误、找不到交易或无法识别的 trans_stat
  • THEN 系统将状态映射为未知并保持本地支付单待恢复,不得据此确认收款或关闭订单

Scenario: 下单失败返回稳定错误

  • WHEN 富友主扫统一下单返回失败或请求结果未知
  • THEN 系统返回项目稳定错误且已接入外部交互日志的调用记录脱敏结果

可达操作索引

本节只用于入口导航,不是行为 Requirement业务义务以上述 Requirements 为准。

企业微信审批

GET /api/admin/wecom/applications(查询企业微信应用配置);POST /api/admin/wecom/applications(创建或更新企业微信应用配置);PUT /api/admin/wecom/applications/{id}/default-creator(保存企业微信应用默认审批发起人);GET /api/admin/wecom/applications/{id}/members(分页查询企业微信应用可见成员);POST /api/admin/wecom/applications/{id}/members/sync(同步企业微信应用可见成员);POST /api/admin/wecom/applications/{id}/templates/inspect(读取企业微信审批模板控件);POST /api/admin/wecom/applications/{id}/test(测试企业微信应用连接);GET /api/admin/wecom/scenes(分页查询企业微信审批场景配置);PUT /api/admin/wecom/scenes/{business_type}(保存并校验企业微信审批场景模板映射);GET /api/admin/wecom/scenes/{business_type}/fields(查询企业微信审批场景可映射字段)。账号与企业微信成员的绑定属于账号身份能力。

企业微信审批回调

GET /api/callback/wecom/approval/{application_id}(验证企业微信审批回调地址);POST /api/callback/wecom/approval/{application_id}(接收企业微信审批状态变化回调)。

微信支付配置管理

GET /api/admin/wechat-configs(获取支付配置列表);POST /api/admin/wechat-configs(创建支付配置);DELETE /api/admin/wechat-configs/{id}(删除支付配置);GET /api/admin/wechat-configs/{id}(获取支付配置详情);PUT /api/admin/wechat-configs/{id}(更新支付配置);POST /api/admin/wechat-configs/{id}/activate(激活支付配置);POST /api/admin/wechat-configs/{id}/deactivate(停用支付配置);GET /api/admin/wechat-configs/active(获取当前生效的支付配置)。

对象存储

POST /api/admin/storage/batch-download-urls(批量获取文件下载预签名 URLPOST /api/admin/storage/upload-url(获取文件上传预签名 URL

运营商回调

POST /api/callback/carriers/cmcc/realname(移动实名结果回调);POST /api/callback/carriers/ctcc/realname(电信实名结果回调);POST /api/callback/carriers/cucc/realname(联通实名结果回调);POST /api/callback/carriers/cucc/realname/remove(联通解除实名回调)。

运营商管理

GET /api/admin/carriers(运营商列表);POST /api/admin/carriers(创建运营商);DELETE /api/admin/carriers/{id}(删除运营商);GET /api/admin/carriers/{id}(获取运营商详情);PUT /api/admin/carriers/{id}(更新运营商);PUT /api/admin/carriers/{id}/status(更新运营商状态)。