Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-CP2B客户端首场景线上合同待核矩阵-2026-09-29.md
Liubing\LB 6813da149a feat(upserver): 保存M2客户端KV迁移至本人统计写检查点
保存独立KV用户服务、固定会话存档与原业务接线,以及C3d资料缓存和C3e本人统计写。
保留原PF/AGG路线、业务公式和时序;榜单读取、好友资料、公告、匹配及首场景闸仍待完成。

验证:ServiceHost两条件各33组646断言;Unity CLI Loop编译0错误269警告。
包含相关方案、评审裁决、测试及状态文档。未操作服务器、正式账号或打包。
2026-09-30 19:19:05 +08:00

39 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# M2 CP2B 客户端首场景线上合同待核矩阵(只读输入)
> **2026-09-29 后续裁决(优先于本矩阵的早期泛化待核表述)**:用户要求现有游戏服邮件、好友、俱乐部、反作弊等沿用原接口与业务逻辑,KV 显式玩家 ID 换为认证会话的新 ID;服务端只需集中确认接受新 ID,不再逐项索要旧接口全套 Method/route/响应合同。客户端接线后做功能回归,有具体差异再定位。用户已定等级榜分数存 KV;个人 KV 只可读写本人数据,全服/地区前 50 名需要基于 KV 的跨玩家聚合读取入口,详见[集中确认项](M2-客户端致服务端线上合同集中问题单-2026-09-29.md)。本矩阵保留为早期源码扫描记录,不作为新增送审或编码阻塞清单。
日期:2026-09-29。仅据当前客户端源码整理,**不是线上接口契约,也不是编码方案/许可**。用户禁止访问或修改本机服务器代码,故路由是否在线上存在、方法、身份字段及响应语义全部待线上可信依据核实。CP2A/CP3A 的 `LoginStage` 停留闸保持。
> **2026-09-29 线上只读探查增量**:对固定正式地址 `http://s101.local:18080/` 发无凭据 GET,根路径返回 HTTP 200、正文 `n3ftapi 0.0.1-nogit`;`/swagger/v1/swagger.json`、`/swagger`、`/swagger.json`、`/openapi.json`、`/api-docs` 均返回 404。未登录、未访问业务路由、未写入账号或服务器。本探查只能证明服务可达,**不能**证明下表任何 Method、身份、响应或错误合同;CP2B 完整方案仍待可信线上文档/接口负责人确认。不得用本机服务器源码填空。
> **用户纠偏与批次拆分**:`CustomServerMgr.kvOnly` 对普通请求的一律拒绝是移植期临时门,最终 KV 应正常使用业务请求。可先按[CP2B-T 同会话普通请求运输完整方案](M2-CP2B-T正式KV普通业务请求恢复完整方案-待独立审查.md)独立评审/实施“运输恢复”,仅用合成路由测试且保持 `FishingStage` 闸;这一步不依赖在线 Swagger。下表的**业务响应/身份/副作用合同**仍须在真正开放各功能和首场景前取得可信线上依据或明确产品范围裁决。不能因为运输能发就把未知接口报成已迁移。
## 为什么需要线上合同:客户端源码索引
要求的不是特定 Swagger 文件,而是线上实际支持的**精确 Method/route、认证与身份、响应/错误、幂等和旧会话回包处理**。下表源码能证明客户端准备做什么,却不能证明线上目前按同一合同执行;首场景一开放便会触发其中多项。若有其他可信线上说明或负责人确认,也可替代 Swagger。
| 源码位置 | 已知触发与需要确认的差异 |
|---|---|
| `Client/Assets/Scripts/Stages/LoginStage.cs:112-115`、`Stages/FishingStage.cs:228-302` | KV 目前在跳场景前返回;开放后 `SetLvData`、问卷、AIHelp、反作弊、好友、恢复邮件及登录天数事件会执行。 |
| `Client/Assets/Scripts/Core/CustomServerMgr.cs:129-137,168-205` | KV 模式拒绝宽泛 `CustomServerPost`;客户端拼出的 `mail/`、`friend/`、`club/` 字符串不能证明线上允许复用旧 Cookie/响应处理。 |
| `Client/Assets/Scripts/Services/InGameMailHandler.cs:125,299-339` | `mail/fetch` 携 `lastSyncTime`,按 `success/mails/error` 更新缓存和红点;成功/空结果/旧回包的线上语义影响存档和用户可见状态。 |
| `Client/Assets/Scripts/Services/FriendService.cs:322-342`、`Services/ClubService.cs:243-265`、`AntiCheat/AntiCheatManager.cs:249-267` | 分别请求邀请数、自己俱乐部及封禁状态;都涉及线上会话和玩家 ID,不能把旧 PF 的 `UserId` 默认为 S101 身份。 |
| `Client/Assets/Scripts/Services/SurveyService.cs:35-41,55,112,136` | 构造读旧 PF 两键、用 `UserId` 十六进制抽样、打开/领奖再写旧 PF;除 KV 存档合同,还需身份、领取幂等和奖励保存顺序。 |
| `Client/Assets/Scripts/DataCenter/DataCenter.LeadboardData.cs:169,186,189-206` | 等级榜写入及读取仍直调 PlayFab SDK;需要线上替代合同或经产品裁决的范围处理,不能保留静默失败。 |
| `Client/Assets/Scripts/Services/UserService.cs:110-112`、`Others/AutoRestart.cs:41-43`、`Others/AiHelpManager.cs:29-45` | 正式 KV 尚不发布旧 `IsLogin`;自动重启和 AIHelp 消费公开身份/时间,需定发布时机及 ID 字段政策。 |
以上仅为主要自动触发点;动态活动与登录天数需按实际配置继续追踪。任何需要关闭或延期的功能须明确产品范围、可达性和用户可见行为,不能为了早进场景而直接 `return` 或返回空值;最终按[临时门控清单](M2-最终通关前临时门控与忽略路径清理清单-2026-09-29.md)销账。
| 触发及客户端当前动作 | 客户端已知请求/存档形状 | 线上必须确认的合同与失败语义 |
|---|---|---|
| 登录后 `InGameMailService.Init`/首场景 `FetchMail` | 客户端常量 `mail/fetch`,`CustomServerPost` 请求含 `lastSyncTime`;响应按 `success/mails/error` 解释,成功有邮件时写本地缓存并改未读红点,无邮件则更新同步时间 | 正式 Cookie/会话可否调用该精确路由;`lastSyncTime`、空/重复邮件、错误码、旧 epoch 响应及缓存提交边界;不能因客户端字符串就批准真实 KV 路由 |
| 首场景构造 `SurveyService`,随后 `GetSurveyMatchlist` | 构造立刻读旧 PF 的 `SurveyData`、`SurveyReadSidData`;抽样把旧 `UserId` 按16进制转换并取尾数,打开问卷、领奖分别写旧 PF,两处会影响奖励/已读 | 两键 KV 存档形状、旧 PF ID 到 S101 身份的抽样政策、领奖幂等/奖励保存次序及失败回滚;仅迁移构造读不够 |
| `LeadboardData.SetLvData` | 算等级后直接 `PlayFabClientAsyncAPI.UpdatePlayerStatisticsAsync`,一次包含全局与地区两个统计名;`GetLeadboardData` 又直接 GetLeaderboard | 有无线上等价榜单合同、两值是否原子、地域/资料身份、返回排序/资料字段;未确认前不执行旧 SDK 也不开场景 |
| `AntiCheatManager.CheckBan` | 首场景立即请求,旧身份 `UserId` 进入请求 | 线上精确路由、身份字段、封禁/网络失败/旧 epoch 响应策略;不能把 S101 十进制 ID 直接代入旧 PF 标识 |
| `FriendService.GetInvitedListCount` | 首场景和实时通知回调会调 `FriendRequest("GetInvitedListCount", "")`,`async void`;响应字段 `FriendInvitedCount/DeepLinkInvitedCount`,之后改红点 | 精确 Method/route、空请求含义、授权、旧 epoch 丢弃、异常观察;不能只凭客户端封装开放所有 friend 路由 |
| 已入 Club 时 `ClubService.GetSelfClub` | 当前按 `ApiPlayerId` 构造 `playerId`,请求 `ClubRequest("GetSelfClub", ...)`;响应读取 `clubInfo/role/playerIDs/clubPlayerProfiles`,已有 `SessionVersion` 旧响应检查 | 身份对应、精确 route、空 Club/错误体、角色与成员 ID 的语义;不能把 CP3A 俱乐部红点提示键等同于俱乐部 API 已迁移 |
| `FishingStage.InitData` 的登录天数事件 | `ConditionType.LoginDays` 可使激活的 `BattlePassData` 保存 `BattlePassRecordTask`,仍走 `PlayFabMgr.UpdateUserDataValue`;活动管理器还动态注册 sentry/subscriber 并 `CheckAllActivities()` | 实际配置下哪些订阅者被创建/触发、KV 写序、失败/重复登录处理;需要受控配置真实命中证据,静态表不足以宣称副作用全集 |
| 场景末尾 `AiHelpManager.Login` 与 `AutoRestart.Init` | AIHelp 字段仍称 `pfid` 且取 `UserId`;自动重启随后看公开 `IsLogin`/`LoginTime` | 外部 SDK 身份字段政策、公开登录状态何时发布、三天重启与 KV 关闭屏障如何协调 |
下一步先对 CP2B-T 运输子批完成一次完整独立评审与主会话裁决,再在获批白名单内实施;随后取得**线上**业务接口可信合同及配置命中证据,形成 CP2B 首场景全链方案:逐项定保留/迁移/延期产品边界,身份与 epoch、KV/外部副作用顺序、失败及恢复、精确白名单、受控验收。运输子批未获批前不改生产代码;首场景全链未评审通过前不开 `FishingStage`。固定 `http://s101.local:18080/`,Unity 只用 CLI Loop,暂不打包。