server/laf-cloud/paymentRouting.README.md
guanchao e2a5c3d2f6 Squash local into main while preserving battle pass compatibility
Integrate starter pack timing, reactivation, purchase analytics, payment routing and atomic user IDs. Resolve iOS conflicts by preserving both battle pass delivery and starter pack snapshots. Add coexistence regression checks and record remaining compatibility risks. Validation: 118/125 tests passed; 7 existing failures remain, plus a separately reproduced pre-existing V2 task login failure.
2026-09-10 16:31:14 +08:00

3.7 KiB
Raw Blame History

微信直购订单按部署环境分流

本次代码仅准备在本地,下次版本发布时再部署生产环境。覆盖 Android 和 iOS 的 requestMidasPaymentGameItem 直购;旧 iOS 客服商户支付走另一套接口,不属于本次分流范围。

配置和部署顺序

云应用 PAYMENT_APP_ENV WX_MIDAS_PAY_SIGN_KEY
正式服 q6rvwvtnga production(未配置时默认值) 微信后台对应小游戏的正式虚拟支付 AppKey
测试服 sor779u2w8 test(必须明确设置) 同一个小游戏的正式虚拟支付 AppKey

AppKey 是虚拟支付签名密钥,不是 AppSecret,也不是商户 API v3 密钥。密钥只配置在云应用环境变量,不能放到客户端。配置错误时测试下单或回调将失败;生产转发也必须配置正确密钥。

两边替换并发布以下完整函数,无新增云函数依赖:

  • wx/orderPaySig.ts
  • wx/iosorderPaySig.ts
  • wx/payCallBack.ts

先准备测试服函数和环境变量,再部署生产服回调及配置,最后验证新的测试直购订单。生产回调未上线前,不进行测试服真实支付。微信后台回调仍指向 https://q6rvwvtnga.sealoshzh.site/wx/payCallBack。

分流行为

  1. 服务端用部署环境生成订单号:正式为 wcx_,测试为 wct_;订单记录 paymentAppEnv。客户端参数不能指定分流方向。订单号长度仍小于 32 字符。
  2. 正式回调遇到 wct_,先校验原始 Event & Payload 的 HMAC-SHA256 PayEventSig,再转发完整请求体到固定测试服回调地址。原始 Payload 字符串不重新序列化,签名内容保持不变。
  3. 测试服重复验签,并比对本地订单的环境、用户、商品、数量、原价,成功后执行原来的订单确认逻辑。两端仅接受 Env=0 的真实支付事件;mock 通知不能充当成功支付。
  4. 转发最多等待 3 秒,不跟随重定向。只有测试服 HTTP 200 且 ErrCode=0 才向微信确认成功;错误或超时返回非零,不落到生产数据库处理。不转发原始用户请求头;防循环标记只用于拒绝再次转发,不能替代验签。
  5. 生产旧订单继续原有处理;本次没有追溯改写历史订单,也没有扩大到生产旧回调的全量验签改造。测试新订单领取仍使用现有查单与领取接口。

此处的“测试服”是业务数据库环境。直购参数 env=0 没有改变,实际调用支付仍会扣款,不是微信沙箱。新手礼包当前在开发版/体验版改用客户端免费测试发货,因此不会创建此类测试支付订单;分流可用于其他直购商品以及后续恢复真实支付联调。

改动前已经创建的测试单仍为 wcx_,无法据此前缀自动分流。本次未修复之前已付但 state=0 的历史订单,需核实真实支付凭据后单独处理,不能直接根据客户端成功日志改为已支付。

验证

node --test laf-cloud/tests/payment-routing.test.mjs laf-cloud/tests/jungle-treasure.test.mjs laf-cloud/tests/starter-pack.test.mjs laf-cloud/tests/monthly-card-renewal.test.mjs

自动测试使用合成签名与模拟数据库/网络,覆盖环境前缀、签名、转发隔离、错误传播、订单匹配与重复回调。尚需部署后用微信真实回调验证 AppKey、签名和网络连通性;本地测试不能代替此项验收。

本次验证:分流、新手礼包、月卡共 23 项通过。额外 Jungle 旧测试 13 项中 7 项通过、6 项失败;将三个支付函数替换为 HEAD 的修改前版本在内存中重跑后,仍出现相同 6 项失败(奖励规划表、活动资格、回调完成状态及 usersAd 断言),没有为本任务修改这些旧测试。