7.7 KiB
main 合并 local 后兼容性复查
日期:2026-09-10。范围为独立 server 仓库;只合并、测试和复查,没有推送或部署。
最新范围调整:用户明确本次仅上线七日签到、新手礼包、战令,每日任务不进行上线操作。本文保留全仓审计历史,当前发布清单与限定范围验收以同目录
三模块上线范围与检查.md为准。
合并方式
- 合并前 main:
8e4a9789188b1b85bc0162e8dacda6de61c5d209。 - local:
faf881a853e0c5e181e9a34c3f8baaae373fcb00,保留该分支及其历史,不移动、不删除、不推送。 - 共同祖先:
1dd0e9f23dd81faeb16566bcae3c34d3ff3e56ca。 - 将 local 独有的 15 个提交压缩为 main 上的一个新提交。main 原有“更新战令”提交保留,不用 local 文件快照覆盖 main。
- 两个冲突文件:
functions/wx/KeFuInfo.ts、functions/wx/iosgetPayInfo.ts。客服下单同时保留战令订单字段和礼包统计快照;旧 iOS 查单同时保留战令专用发货状态及礼包埋点。环境配置沿用 local 的环境变量方式。 - 测试加载器补充
@/passCheckUpgrade真实模块解析;新增 4 项战令与礼包共存测试,未用空实现跳过战令校验。
与上次检查对照
| 项目 | 合并后结果 | 处理意见 |
|---|---|---|
| 战令接口/支付兼容缺失 | 已消除本次分支差异造成的问题。保留 main 的 passCheckUpgrade、passCheck 合并视图、订单版本/周期、固定价格、旧客户端补单过滤及领取保护 |
生产按完整合并版本核对,不再仅使用 local 版支付函数;不代表已完成真实支付联调 |
| 旧客户端每日任务协议 | 仍不兼容。dayTaskInfo/getTaskReward 仍使用 V2;当前 MatchMaster 客户端仍发送 levelPass/share/useEnergy/useProp |
发布前统一新旧任务协议;旧字段请求不等同于 V2 taskId 请求,不能凭现有测试中的“legacy taskType”名称认定旧客户端兼容 |
| V2 任务账号登录 | 本次补充确认的严重问题。main 保留旧任务刷新循环,V2 task.version=2 被当成任务对象写 value,触发 TypeError |
需要单独修复登录与任务接口的数据格式兼容;该问题已在合并前 main 复现,不是冲突解决新增 |
| 七日签到收据衔接 | 仍未解决。后端查询自动领取,当前客户端依赖 canClaim、自行生成 ID,未处理服务端 todayClaim 恢复 |
修复断线/退出后同日恢复及第 7 天完成态补发;处理旧本地防重记录兼容 |
| 登录/支付环境变量 | 配置前提仍存在。IDCOUNT_NAME、小游戏 App ID/Secret、支付签名密钥等必须配置 |
不能只更新函数代码;检查 idcount 对应文档及原生 Mongo 访问能力 |
| IAA 分库路由 | 部分接口固定访问 users;属于此前已存在的范围调整 | 只有已停用 IAA 才能作为预期变更放行;仍有 IAA 客户端时继续构成不兼容 |
drawHead.ts:35 |
仍有多余 ] 造成语法错误,前次两份仓库对照均已存在 |
不属于新增 merge 错误,但整仓发布前必须处理 |
1. 战令保护验证
新增测试位于 tests/rookie-gift.test.mjs:
- Android/原生 iOS 下单拒绝错误战令周期;正确请求保存
passVersion=2/passEnd,高级战令价格由服务端固定为 3000 分、数量 1。 - 旧 iOS 客服下单和
iosOrder→order转单保留战令版本、周期和价格。 wx/getOrderReward拒绝用通用领取流程消费升级战令订单,订单保持待专用发货状态。- 旧 iOS 战令查单成功后保持 state=1,等待战令专用发货;已经完成的升级订单继续返回兼容成功响应,且不产生礼包埋点。
上述 4 项全部通过。原有礼包测试继续验证礼包快照、跨周期支付、重试去重键及数数失败不阻断支付。passCheck.ts、passCheckUpgrade.ts、wx/getOrderReward.ts 相对合并前 main 无改动。
2. 任务数据导致登录失败的可复现路径
代码位置:functions/login.ts 的旧任务刷新循环(本次合并结果约第 206 行);V2 数据来源为 functions/dayTaskInfo.ts / dailyTaskService.ts。
- 任务接口写入
JSON.stringify({version:2,dayKey,...,dailyTasks,weeklyRewards}),同时taskTime=Date.now()。 - 此账号再登录,若满足
timestamp > taskTime(旧登录逻辑的日刷新条件,跨日会触发),循环执行task[key].value=0。 - 遍历
version时实际执行对数字 2 写属性,抛出TypeError: Cannot create property 'value' on number '2',登录无法返回成功。
验证使用真实 refreshTaskData 生成 V2 数据,沿用登录模拟框架,设置 taskTime=0 确定触发刷新,并以“登录应返回 code=1”为断言。合并结果失败;将登录实现替换为合并前 main 8e4a978 的代码,在内存中复跑同样失败。未把生产用户数据改成测试状态,未将这个已知失败行为写成应通过的业务测试。
注意:相较上次对 local 的检查,合并后的 login 不再自动把旧任务转换为 V2,但其他任务接口仍会转换,所以不能宣称任务问题已经消除。恢复 local 的登录刷新也只能解决登录格式问题,不能单独解决当前旧客户端任务协议不兼容。
验证记录
Node.js v24.11.1。运行:
$env:TEST_WX_PAY_NOTIFY_URL = 'https://sor779u2w8.sealoshzh.site/wx/payCallBack'
node --test --test-reporter=spec laf-cloud/tests/sign-in-activity.test.mjs laf-cloud/tests/starter-pack.test.mjs laf-cloud/tests/rookie-gift.test.mjs laf-cloud/tests/payment-routing.test.mjs laf-cloud/tests/monthly-card-renewal.test.mjs laf-cloud/tests/login-wucai-state.test.mjs laf-cloud/tests/wucai-migration.test.mjs laf-cloud/tests/jungle-treasure.test.mjs laf-cloud/tests/daily-task-v2.test.mjs laf-cloud/tests/task-reward-request.test.mjs
| 检查 | 结果 |
|---|---|
| 上述持久化测试集(含新增共存测试) | 125 项,118 通过,7 失败,退出码 1 |
| 新增战令/礼包共存测试 | 4/4 通过,包含在 125 项内 |
| V2 任务登录定向复现 | 合并结果 1 项失败;合并前 main 对照 1 项同样失败,不计入上述 125 项 |
| TypeScript 语法解析 | 扫描 75 个 TS 文件,只有既有 drawHead.ts:35 语法错误;不是完整类型检查或云端构建 |
| 冲突标记、diff 空白检查 | 提交前检查,不保留未解决冲突 |
7 项现有失败仍为 Jungle 奖励表、领取资格、回调状态、下单及 usersAd 路由等 6 项,以及五彩迁移未付费状态判定 1 项,与上一轮失败名称一致。它们不因新增共存测试通过而视为解决。微信、数数、数据库均为模拟,没有真实扣款或生产联调。
发布建议
合并是代码整合,不是上线放行。先解决任务协议/登录和签到收据问题,再配置环境并进行正式发布验收。
现有 七日签到与新手礼包生产上线文档.md 基于旧 local 候选版本,不能原样视为本次 main 的发布清单。特别需要更新:
- 保留战令相关依赖及所有支付保护;当前支付函数新增礼包共享依赖时也仍依赖
passCheckUpgrade。 - 合并后 login 沿用 main 的旧任务实现,不应按旧文档声称它调用
dailyTaskService。 - 补齐
IDCOUNT_NAME和WX_MINIGAME_APP_SECRET的部署核对项。 - 生产仍不发布
signInTestAdmin,不能按整目录覆盖时误带测试管理接口。 - 新手礼包奖励数量仍由实际发布客户端决定,旧后端 README 数量与当前客户端不同的问题仍需核对。
本次保留用户要求的合并范围,没有擅自修复上述既有业务问题,也没有改动 MatchMaster 客户端工作区。