Skip to content

feat(wechat): M5 微信 JS-SDK 扫码签到——jssdk-signature 接口与微信内扫一扫 - #11

Merged
pjm314159 merged 3 commits into
devfrom
feat/wechat-jssdk
Sep 27, 2026
Merged

pjm314159 merged 3 commits into
devfrom
feat/wechat-jssdk

Conversation

@pjm314159

Copy link
Copy Markdown
Owner

变更说明

M5:微信内置浏览器扫码签到(SPEC §3.2.2 首选方案)。

  • 后端新增 backend/src/wechat/:
    • GET /api/wechat/jssdk-signature?url= 返回 {appId,timestamp,nonceStr,signature}(需本站会话)
    • GET /api/wechat/status 免会话可用性探测,只返回 {available, reason},不泄露凭证
    • WechatClient 内存缓存 access_token / jsapi_ticket(默认 7200s,提前 300s 刷新;tokio::sync::RwLock 避免跨 await 持锁)
    • 签名串 jsapi_ticket=..&noncestr=..&timestamp=..&url=.. 取 plain SHA1(新增 sha1 依赖),url 自动去除 # 及其后部分
    • 凭证经 WECHAT_APP_ID / WECHAT_APP_SECRET 注入;未配置时不 panic,返回 40307
  • 前端新增 src/lib/wechat.ts(MicroMessenger UA 检测、jweixin 1.6.0 幂等动态注入、wx.config → wx.scanQRCode 封装,用户取消返回 null)与 src/api/wechat.ts
  • 房间页底栏在「微信内 且 后端判定可用」时展示「微信扫一扫」主按钮,结果与相机扫码同路径(本地预校验 → share_qr 推送全房间);非微信环境保持相机扫码
  • wx.scanQRCode 参数对齐参考实现 qrcode_share:scanType 收紧为 ['qrCode'];fail 中 errMsg 含 cancel 按用户取消处理
  • 新增 VITE_WX_DEBUG 真机调试开关(默认关闭)

变更类型

  • feat 新功能
  • fix 缺陷修复
  • docs 文档
  • refactor 重构(不改行为)
  • chore 构建/依赖/杂项

目标分支

  • dev(feature/fix 常规合并)
  • main(仅发版合并,dev → main)

自查清单

  • 分支名符合规范(feat/ fix/ docs/ chore/ + 简短描述),基于最新 dev 创建
  • 提交信息符合 Conventional Commits
  • cargo fmt --check / cargo clippy -D warnings / cargo test 通过(后端改动)
  • eslint / tsc --noEmit / 测试 / 构建通过(前端改动)
  • 文档已同步(SPEC/DESIGN/CHANGELOG.md,如有影响)
  • 无 unwrap()(测试代码除外)、无 unsafe、无 any
  • 涉及资源分配的改动已确认上限约束(房间数/人数/消息大小/频率/存量)

关联 issue / 备注

  • 后端:clippy 0 warning,136 tests 通过
  • 前端:tsc -b --force 0、oxlint 0、60 tests、build 通过
  • 微信内扫码需真机验证(HTTPS 域名 + 已配置公众号)

后端新增 wechat 模块:access_token / jsapi_ticket 内存缓存(tokio RwLock,提前
300s 刷新)与 plain SHA1 签名;GET /api/wechat/jssdk-signature?url= 供前端
wx.config,url 自动去除 # 及其后部分。凭证经 WECHAT_APP_ID / WECHAT_APP_SECRET
注入,未配置返回 40307 而非 panic。

前端新增 MicroMessenger UA 检测与 jweixin 动态注入(幂等),房间页底栏在微信内
新增「微信扫一扫」主按钮,扫码结果与相机扫码同路径(本地预校验 → share_qr
推送全房间);非微信环境保持相机扫码。
- 测试改用 Array.from,消除 IDE 对 for...of NodeListOf 的类型告警(本项目
  tsconfig lib 为 ES2023+DOM,未含 DOM.Iterable;tsc -b 实际不受影响)
- wx.scanQRCode 的 scanType 限定为 qrCode,避免误扫条形码
- fail 回调 errMsg 含 cancel 时按用户取消处理(部分微信版本行为),返回 null
参照参考实现 qrcode_share:
- 后端新增 GET /api/wechat/status(免会话)返回 {available, reason},只暴露
  「是否已配置」不含凭证
- 前端环境预检查:房间页仅在「微信内 且 后端判定可用」时才渲染「微信扫一扫」
  入口,未配置时完全不显示,避免点击后才报 40307
- VITE_WX_DEBUG=true 时 wx.config({debug:true}),真机以弹窗输出签名校验细节,
  便于定位 invalid signature(默认关闭)
@pjm314159
pjm314159 merged commit ce155ac into dev Sep 27, 2026
2 checks passed
@pjm314159
pjm314159 deleted the feat/wechat-jssdk branch September 27, 2026 13:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant