Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-C3b-UserID兼容接线裁决与执行记录-2026-09-30.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

57 lines
6.4 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.
# C3b UserID兼容接线裁决与执行记录
## 实施依据与完整边界
用户明确“按此执行操作即可,需要迁移的项目,需要测试,现在无法确定服务端的操作,如果测试中报错了我会通知服务端”。采纳刚确认的完整兼容方案:KV使用认证返回PlayerId,经IUserService.UserId传给原请求字段;字段名、路由、原业务顺序及错误语义保持;对方ID保留对方新UserID;InternalId及业务对象ID不混换。已审同合同替换连续执行,不因服务端内部未知而暂停或重新询问产品需求。
只读核对:KVUserService已公开UserId/ApiPlayerId;FriendService的本人/对方字段已由该接口或调用参数进入原DTO。水族馆、俱乐部、伙伴、普通活动请求也沿用新身份或服务器返回的对方ID。无需为体现工作量改名、全局替换字段或重复包一层ID工具。
原好友邀请码将ID字符串按16进制编码、按16进制解码,是可逆的字符串映射;对于当前规范数字ID101/102,往返仍是原字符串,不应只改编码一端为十进制导致搜索错误。旧挖沙随机种子转换也不在本轮顺手改算法。问卷既有十进制抽样适配保留。
本轮实施精确范围:原ServiceHost.csproj加入真实FriendService.cs与FriendModel.cs编译;Stubs.cs只补无关UI/配置与SDK调用哨兵的编译支持;M2MergedGameplayTests.cs增加101/102兼容场景和可检查原HTTP请求的固定记录;新增C3IdentityCompatibilityTests.cs验证实际服务方法。全部位于CodexOutput测试宿主,不修改生产源码。新增编译输入的每一项服务于真实好友请求测试,不新增生产接口、管理器或状态。
验证:KV101/102本人和对方ID、原字段名/路由/参数/回包、业务错误码与HTTP失败、旧身份失效、PF十六进制身份和邀请码往返。真实FriendService+真实CustomServerMgr+真实KVUserService参与;HTTP为内存handler,不发送正式请求、不操作真实好友关系。原测试断言保留,测试失败自修,只修夹具接线而不改变业务。
直接PlayFabSDK读取/统计/匹配不能仅靠改ID变成KV请求;本次不编造服务器新路由,不因字段兼容已验而声称这些替代能力已接通。实际线上兼容未知继续如实记录,后续测试发现具体错误按原路由/ID/响应给用户汇总,不访问服务器代码。
开工前三个既有测试文件已逐字节备份。生产C2d和用户规则增量保持,HomePanel不动,仅Unity CLI Loop、不打包。
## 实施结果
本轮核对发现现有普通游戏服请求已使用统一身份接口或对方ID参数,不需要再次更改生产代码。实际执行的是接线核查与针对性验证,不能把“没有重复改代码”误记为没有验证,也不能声称剩余直接PlayFab SDK调用已迁移。
真实FriendService与FriendModel已进入离线ServiceHost编译;101/102场景使用真实KVUserService、原handle/租约及真实CustomServerMgr,通过内存HttpMessageHandler检查最终HTTP请求。PF对照用真实FriendService+原DTO,运输为捕获代理,不声称PF真实网络已验。
| 已测原动作 | 核对内容 |
|---|---|
| AddFriend | MySelf.PlayFabId=本人UserID、FriendPlayFabId=对方UserID,原MyFriendCount/Level及字段集合不变 |
| SearchFriend | PlayFabId=对方UserID,响应Info.PlayFabId原样保留;不改成本人ID |
| AcceptFriend | 本人/对方ID分开,Status原值保留 |
| GetHomePage / GetRecommendedFriends | 原目标ID与PageNo保留,不改变分页与请求路由 |
| IsFriendWaitingForAccept | 两方玩家ID按原字段分别发送 |
| GetInvitedList | 原空字符串请求体保持,身份仍由原认证会话承载,不增加自造ID字段 |
| DeleteFriend | 原失败保留列表、原成功更新列表,目标ID保持 |
| 邀请码 | 101、102及PF十六进制ID按原编码和UI解码规则往返一致,不需要改算法 |
| 错误/退出 | 业务Code=-3/-1原样处理;HTTP500原null且不伪造注销;401撤销身份后新请求被原not-ready异常拦截,HTTP记录不增加 |
NON_ANDROID与ANDROID+AGG最终均21组380断言通过,formalRequests=0;原宿主断言保留。增加的3组为PF、KV101、KV102真实好友请求兼容。非Editor两类验证工厂不可用探针通过,仍不代表Unity Player构建。
第一次新增撤销断言误期待null,实际原CustomServerMgr在not-ready时抛InvalidOperationException。已按既有已审合同修正测试预期,生产异常逻辑不改;首败日志M2-C3b-revoked-expectation-first-failure.log保留。没有把此离线注入失败当成线上服务端错误。
## 其他身份路径只读核对(未冒充逐功能运行覆盖)
- AquariumManager.cs:72/647/663:请求playFabId来自捕获用户的UserId。
- ClubService.cs:251/325:playerId来自ApiPlayerId;成员列表返回playerId/userIDList仍映射到原展示字段playFabId。
- DataCenter.SmallGame.cs:463/480:本人playerID来自UserId;对手ID继续来自原响应字段,不替换为本人。
- InGameMailHandler.cs:156:本地邮件缓存按UserId加载;mail/fetch、send、updateState原会话身份及原协议不加新字段。C2d原邮件成功/失败语义回归仍保留。
- AntiCheatManager.cs:262:CheckBan的playerID来自UserId。
- ChatService.cs:464/498:原消息里的玩家身份来自UserId。
## 交付与未完成边界
仅修改三个已有测试文件并新增C3IdentityCompatibilityTests.cs。生产源码、HomePanel、服务器、场景、调试配置不变;本轮不需要重编未变化的Unity源码,沿用C2d编译证据并明确时间。C3b新增overlay记录测试变更,不重写C2d/C3a原hash。AGENTS已有用户授权增量继续单独追踪。
“旧字段名+新UserID”的普通游戏服身份方案已按上述范围核对并测试。线上是否接受新ID尚未实测,不因这一未知再次要求前置服务端审批;后续在允许的测试窗口遇到具体错误,记录实际路由、HTTP/业务错误码及最小脱敏参数给用户转达服务端,不猜服务端实现。
等级榜统计/读取、PF好友列表、他人资料SDK及匹配票据属于直接SDK替代工作,当前没有凭ID替换自动完成;继续按已有迁移要求核对应的KV入口,不能猜路由或跳过功能。真实首场景/Player/新进程恢复及最终门控清理仍未关闭。本轮未发正式请求、未Play、未付费或打包。