e4e9eb2169
Root cause is JSSDK entry-URL mismatch after SPA post-OAuth, not camera permission. Hard-navigate on iOS, keep OAuth query in sign URL, skip redundant bind OAuth, and prompt refresh/re-auth on failure. Co-authored-by: Cursor <cursoragent@cursor.com>
1.6 KiB
1.6 KiB
@dukang/weixin-sdk · 踩坑
iOS 微信 H5:JSSDK 入场 URL(扫码 / 定位 / 选图)
症状
- 登录或 OAuth 后立刻调
scanQRCode/getLocation/chooseImage失败 - 错误类似:
permission value is offline verifying、invalid signature - 业务文案常被写成「权限校验尚未完成,请等 1~2 秒」——多数情况下等无效
- 关掉 webview 再进(整页重载)立即恢复
原因
iOS 微信对 JS-SDK 验签使用的是本次 document 加载时的 URL(去掉 # 后的完整 URL,含 query)。
history.pushState / replaceState(含 React Router)不会更新微信内部用于验签的 URL。
典型错误链路:
- OAuth 回跳:
/login?code=xxx&state=yyy(入场 URL) - SPA:
navigate('/') - 用当前页
/或「去掉 code 后的/login」去签名 → 与微信内部 URL 不一致 → 失败
正确做法
- 业务跳转(登录成功 / 选店进首页):iOS 微信内用
hardNavigateInWechat(path)/location.replace,让目标页成为新的入场 URL。 - 签名 URL:
getJssdkSignUrl()在 iOS 上返回入场 URL;OAuth 的code/state必须保留参与签名;后端jssdk-config只去#,不要删 query。 - 先
captureIosJssdkEntryUrl(),再stripOAuthParamsFromLocation()。 - 失败恢复:引导用户刷新页面或重新走 OAuth,而不是无限「再点一次」。
相关 API
captureIosJssdkEntryUrl/getJssdkSignUrlshouldHardNavigateForJssdk/hardNavigateInWechatstripOAuthParamsFromLocation