Files
biz-api-cloud-zax/pjcloud-thirdparty/docs/aggregate-h5.md
T
2026-10-20 13:40:25 +08:00

6.3 KiB
Raw Blame History

双场景聚合支付部署与联调

配置

在 third 服务的 Nacos 配置中增加以下配置。H5 域名由配置提供,不编入 Java 源码;签名密钥需要由部署环境注入至少 32 字节的随机值,不要使用本文或测试中的字符串。

app-plus:
  pay:
    aggregate:
      h5-base-url: https://baac9a029ea84f36ba28c023fed4fc5f.hd.takin.cc
      public-route-prefix: /third # 直接使用 Boot 服务时设为 ""
      merchant-signing-key: ${MERCHANT_COLLECTION_SIGNING_KEY}
      offline-max-amount: 999999 # 整数分,9,999.99 元;提高上限时同时调整 H5 的输入限制
      query-limit-per-minute: 120
      create-limit-per-minute: 30
      trusted-proxy-addresses: []

h5-base-url 只接受 HTTPS 基础地址,不能带查询参数、Hash 或用户信息。可以包含实际部署子路径;H5 的路由 base 需对应配置。

仅在网关/反向代理覆盖客户端传入的 X-Real-IP时,将其直连地址加入 trusted-proxy-addresses。默认使用直连 IP 限流。Redis 业务键继续由项目基础设施附加租户前缀,不手工拼接租户编号。

H5 只使用项目根目录一个 .env,变量命名沿用参考 App:开发请求走 VITE_API_URL(默认 /api),由 Vite 代理到 VITE_APP_DEV_SERVICE;生产读取 VITE_APP_PROD_SERVICE。这些后端地址与 H5 页面地址分别配置,不重复附加 /third。VITE_IS_MICRO=true 保留 /third;false 移除前缀,此时后端 public-route-prefix 同时设为 "",确保二维码、OAuth 回调与状态地址也使用 Boot 路径。若线上部署已提供同源接口,生产后端地址可留空。本次未修改实际 Nacos、网关部署或平台控制台。

后端仅为配置的 H5 精确 Origin 开放匿名商户、创建、上下文和状态 JSON 接口的跨域访问,不开放凭据跨域;其他接口保持既有安全规则。

平台配置

  • 微信沿用服务商统一公众号 OAuth 与 JSAPI 下单配置,确认公众号网页授权域名对应现有后端 OAuth 回调域名。
  • 将新 H5 的实际页面目录核对加入微信支付 JSAPI 支付授权目录;Hash 部分不作为目录填写。当前根目录部署对应 https://baac9a029ea84f36ba28c023fed4fc5f.hd.takin.cc/。
  • 支付宝沿用现有应用和固定 OAuth 回调 /third/aggregate-order-pay/oauth/alipay,租户通过一次性 state 恢复。不要把独立 H5 地址替换为后端回调地址。
  • 两种渠道继续使用商户既有支付配置、子商户和默认分佣关系快照,配置需已具备相应 OAuth/JSAPI 权限。仅域名能访问不代表上述平台配置已完成。

发布顺序与兼容

  1. 先确认统一支付基线迁移 db/20260825_third_payment_schema.sql 已完成;已完成的环境无需重跑。双场景升级单独执行新文件 db/20261020_add_aggregate_pay_scene.sql,不得只靠修改历史迁移升级现有库。
  2. 新迁移仅新增两个 aggregate_scene 字段,先查字段是否存在,可重复执行;不包含存储过程、字典写入或历史流水回填。业务类型字典 70 = 商户线下收款 可通过管理端配置。
  3. 配置 Nacos 的 H5 地址与随机签名密钥,配套发布 third、wallet 与 H5,再发布后台页面。完整测试与构建由集中验证指令执行。
  4. 商户至少启用并配置完成微信或支付宝其中一个渠道后,即可通过原刷新二维码操作生成新的 URL 收款码。允许仅微信、仅支付宝或双渠道;只校验已启用渠道。新增商户仍先生成原 App Base64 码;没有可用渠道时不生成 H5 码。手动刷新失败会明确反馈并保留原图。
  5. 消费机原 AGGREGATE_ORDER_PAY 类型、二维码路径及内部创建/状态接口保持兼容,OAuth 出口改为 302 到新 H5。原 HTML 渲染器文件保留但不再被 Controller 使用。

数据库字段分别为:聚合会话 aggregate_scene varchar(32) NOT NULL DEFAULT 'ORDER',支付流水 aggregate_scene varchar(32) DEFAULT NULL。线下业务编码是 70,收款请求号由商户和稳定 requestId 派生;不会创建硬件、商城或钱包充值业务订单。

历史聚合会话通过新字段默认值标记为 ORDER;历史支付流水的新字段保持 NULL,本次不做数据回填。

静态 URL 收款码长期有效,HMAC 绑定用途、版本、租户和商户;更换域名或密钥后需重新生成。collectionCode 继续保留 App 协议,collectionUrlCode 仍保存二维码图片地址。

接口与故障恢复

  • 匿名查询:GET /third/aggregate-merchant-pay/merchant?id=...&tenantId=...&v=1&sign=...,返回商户 id/name/logoPic 和 supportedPlatforms(10 微信、20 支付宝),不返回支付配置。
  • 线下创建:POST /third/aggregate-merchant-pay/create,提交相同签名参数、整数分 amount 和 UUID requestId。重试不能修改金额或生成新 requestId。
  • 现有聚合入口:/third/aggregate-order-pay/cashier/{tenantCode}/{token}。两个客户端分别进入各自 OAuth;已确认终态的旧请求直接恢复结果页,不再下单。
  • OAuth 回跳只携带短期 ticket,H5 用 /context/{tenantCode}/{ticket} 读取最小渠道参数,用 /status/{tenantCode}/{ticket} 确认结果。票据有效期沿用 5 分钟,付款会话沿用 2 分钟;本机倒计时不能代替服务端查单/关单结果。
  • 取消付款可继续原单;客户端返回成功、未知或网络异常时仍等待服务端确认,不能自行写成功或新建另一笔交易。
  • 缺少 H5 配置时不输出无签名链接;OAuth 入口返回无敏感正文的不可用响应。配置齐全后失败跳固定 H5 错误入口,不反射平台原始异常。
  • H5 扫码客户端不在商户已启用渠道中时,展示专门的提示状态并引导换用已开通 App 扫码,隐藏金额和付款键盘;渠道全部停用时提示联系商户。付款创建和进入 OAuth 前再次检查渠道,前端展示不能替代后端校验。已有渠道子订单继续依据原绑定渠道和配置快照恢复。

本轮未执行实际迁移、修改平台配置或发起真实扣款。集中验证需覆盖微信/支付宝真机、退款和分账、回调验签与重复通知、延迟成功、限流、跨租户及旧消费机状态同步。