# 邀请码接线验证 分支:`codex/invite-code-wiring`。 ## 行为与来源 - `Layer8_Notice/Spirit235` 沿用更多菜单显隐规则;点击发送 `agent/get_player_invitecode`,字段仅为 `agentid/playerid/unionid/openid`,收到响应后打开 `Layer16_Bind`。 - `Spirit365` 原生 EditBox:450×60、20 号字,保留前导零,不限制六位长度。`Spirit366` 粘贴剔除非数字;settings 无参数调用,WVJB 传空字符串并使用回调。纯浏览器调用 Clipboard API,失败显式提示。 - `Spirit367` 关闭弹窗并发送 `agent/binding_invitecode`,字段仅为 `agentid/playerid/invitecode`。成功才更新玩家邀请码,显示服务器 `error` 提示;已绑定隐藏输入、粘贴、提交并显示绑定码。`Spirit362` 关闭。 - 身份来源遵循登录模式:非设备登录来自授权账号,设备登录来自回包;重连保留该来源,unionid 保持 string/number 原类型。 - 查询/提交等待期间抑制重复请求,超时和断线释放等待状态;迟到粘贴不会影响已关闭弹窗。 - 序列化资源仅经 Cocos MCP、引擎序列化和 asset-db 保存。输入文本采用 EditBox 需要的左上锚点;已绑定文本采用左锚点,左距 403 对应源工程 x=243 加 1600/1280 画布差的一半。 权威依据:`docs/protocol/02-协议-agent路由.md` 邀请码章节、`04-数据结构.md` 登录身份说明;原工程 `11_GameUI.js` 的 235/362/366/367 分支和 OpenBind,`06_Player.js` 绑定响应,`05_Func.js` 粘贴接口,`save/Layer00016.xml` 输入尺寸。 ## 验证 - 233 项相关回归通过(platform 全部测试、platform-handlers、lobby-menu、invite-clipboard)。覆盖两种登录模式、数字 unionid、重连、准确出包、失败状态不覆盖和数据非法时不提交。 - Cocos Game View 中运行 `cocoscreator_projects/scripts/verify-invite-preview.mjs`,29 项断言通过:实际 prefab、Runtime/Router/Store/UI 全链路,记录出包并注入响应。包括输入、粘贴、重复点击、成功/失败提示、反复打开、已绑定状态、文字边界和断线。 - 未绑定及已绑定截图已人工检查:`YouleNexus/temp/mcp-captures/invite-full.png`、`invite-bound.png`。 - prefab 的 5 个资源引用全部有效;导入边界检查通过。 - 框架类型检查通过,命令附加 `--lib es2022,dom`;Cocos 脚本类型检查附加 `--ignoreDeprecations 6.0 --skipLibCheck --lib es2022,dom --types node --strictNullChecks` 后通过。未修改现有 tsconfig;原始配置存在旧库目标/引擎声明兼容问题。 预览使用隔离记录端口,没有向真实账号提交绑定。原生桥参数由自动测试验证,尚未进行手机真机剪贴板验收。 ## 联调修正:字符串 state 导致断线 用户实际绑定时收到字符串 `state`,初版 `requireInteger(raw.state)` 拒绝字符串,沿 Router → PlatformRuntime fatal 路径主动关闭连接。原工程的 `state == 0` 支持字符串状态;初版数字回包测试漏掉了这类实际数据。 修复限定在 `applyInviteBinding` 的协议入口:整数型字符串先归一化,再校验整数;未改变共享校验器和服务器。新增完整运行时回归覆盖 `0/"0"/1/"1"/-1/"-1"`,断言显示服务器反馈、连接关闭次数保持 0、继续查询可用。空串、null、boolean、非数字和小数字符串仍作为非法状态拒绝,且不提交状态。预览脚本也已改用字符串成功/失败响应。