Files
shanxia2.0/docs/superpowers/plans/2026-10-27-mobile-wechat-one-click-binding.md
T

3.1 KiB

移动端一键绑定服务号实施计划

Goal: 按用户已确认的中科兴皖体验,关注后点击一次绑定,经网页授权自动返回并绑定当前账号,不再记验证码或二次确认。

Architecture: 小程序显式点击创建 mobile 会话;OAuth 回调仍仅保存候选身份。移动回调页通过微信 JS SDK 返回原小程序页面,原登录页面查询自己的会话并自动调用现有确认接口。电脑会话默认 desktop,保留验证码人工确认。短时随机 state、原账号/租户归属、真实关注检查和冲突校验继续生效;不向网页传登录令牌。桥接失败提供返回按钮与左上角返回说明,原页面刷新可重试。

Tech Stack: uni-app / Vue 3、FastAPI、Redis、现有微信 OAuth 服务。

范围与验收

  • 第1步保留现有打开服务号按钮,不恢复二维码或复制名称区域;微信原生确认无法省略。
  • 第2步显示当前账号,按钮为“一键绑定当前账号”;只有本页面显式发起的会话可以自动提交,普通进入页面不绑定。
  • 授权回调不写数据库,不从 URL 接收跳转目的地或登录凭据;移动模式由服务端会话决定。
  • 未关注、取消授权、过期、切换账号、网络失败不得显示成功;后台确认成功且真实关注才显示已开通。
  • 不改变电脑流程、不改表、不修改参考项目、不发布。

实施任务

  • 修改 miniprogram/scripts/test-wechat-binding-flow.mjs 和 integration 测试:授权后自动确认、无弹窗、未主动发起不确认、切号晚响应、失败后刷新重试。运行 node 测试确认旧实现失败。
  • 在 backend/tests/test_wechat_notice_binding.py 添加 mobile/desktop 模式、回调不落库、移动 HTML 返回桥接和 CSP 测试;新增 JS 桥接可执行测试。隔离环境运行 pytest 确认失败。
  • 修改绑定 flow/composable/API/引导文案:请求 {mode: 'mobile'},返回刷新后在同一登录会话中自动确认,移除验证码展示和确认弹窗。
  • 后端 start 可选模式默认 desktop;服务端保存 mode 并返回给回调渲染。新增移动回调 HTML 与限域、nonce CSP;通过官方 JS SDK 自动返回,失败仍可手动返回。
  • 执行 6 组小程序回归测试及新增桥接测试、ENV_FILE=/dev/null venv/bin/python -m pytest tests/test_wechat*.py -q、微信小程序构建。审查改动与错误分支。
  • 更新部署文档和 backend/miniprogram/root 知识图谱;说明尚需真机授权验收。

验证结果

  • 小程序相关 48 项测试通过;后端微信相关 215 项测试通过(隔离数据库、模拟微信)。
  • 微信小程序生产构建成功,未上传/发布;保留原有 uniCloud、统计 AppID、Browserslist 和样式选择器提示。
  • 独立审查发现桥接延迟可能重复返回,已补充失败测试并修复为 Bridge 就绪后仅一次自动返回;复核通过。
  • 已更新部署说明和代码知识图谱。真机仍需验证业务域名、真实关注、OAuth 和 iOS/Android 自动返回。