Files
xinlong-shop-taro/.workbuddy/memory/2026-07-16.md
赵忠林 46298c011f fix(login): 恢复手机号快捷登录功能,避免带旧Token导致失败
- 将 login.tsx 和 register.tsx 中登录请求从封装的 request 工具改回 Taro.request
- 取消登录请求中自动注入 Authorization 头,避免携带过期/旧 token 导致认证失败
- 调整登录接口响应数据解析,适配 Taro.request 的数据结构
- fetchUserInfo 改回使用 Taro.request,手动携带 Authorization 头部
- 添加全局 getPhoneNumber 调用冷却机制,防止频繁调用导致微信报错
- 登录页新增手机授权冷却
2026-07-16 17:01:17 +08:00

5.8 KiB
Raw Blame History

2026-07-16 工作记录

修复手机号授权登录失败

  • 问题:用户点击登录页「手机号快捷登录」后,微信返回 privacy 相关错误,触发降级弹窗「未获取到手机号」。
  • 原因:基础库 3.16.1+ 对敏感 APIgetPhoneNumber / chooseImage 等)强制要求隐私协议授权;项目之前直接 resolve agree可能被微信拒绝。
  • 修改文件:
    • src/app.tsx:在 onNeedPrivacyAuthorization 中通过 Taro.showModal 展示隐私协议授权弹窗,用户点击「同意」后再 resolve({ event: 'agree', button: 'agree' }),拒绝则 resolve({ event: 'disagree', button: 'disagree' })
    • src/api/system/file/index.ts:导出 ensurePrivacyAuthorized() 工具函数。
    • src/passport/login.tsx
      • 页面显示时通过 useDidShow 预检隐私协议;
      • 统一使用 request.post + SERVER_API_URL 调用 /wx-login/loginByMpWxPhone
      • 替换原 Taro.request 和硬编码域名。
    • src/passport/register.tsx
      • 同样增加 useDidShow 隐私协议预检;
      • 修复接口基址为 SERVER_API_URL(原代码误写 https://shop-api.websoft.top
      • 统一使用 request.post 调用登录接口;
      • 删除未使用的 LoginResponse 类型。
    • src/passport/pay/index.tsx:修复缺失的 @/api/passport/wx-login 导入,改为使用 @/api/layout 中的 getWxOpenId / loginByOpenId
  • 验证:npx taro build --type weapp 构建成功。
  • 后续提醒:小程序后台需确认已添加「开发者收集你的手机号」隐私声明,并确保「手机号快速验证组件」能力已开通且额度充足。

继续修复:用户已同意隐私协议仍无法登录

  • 问题:用户已在弹窗中点击「同意」,但随后仍出现「未获取到手机号」降级弹窗。
  • 原因:Taro.showModal 的按钮不是微信认可的隐私授权触发器;基础库 3.16.1+ 要求使用 open-type="agreePrivacyAuthorization" 的 Button 组件。
  • 修改文件:
    • 新增 src/utils/privacy.ts:全局隐私协议授权管理器,保存 resolve 回调与弹窗显隐状态。
    • 新增 src/components/PrivacyModal/index.tsx + .scss:使用原生 Button 的 open-type="agreePrivacyAuthorization",用户点击后触发 onAgreePrivacyAuthorization 再 resolve。
    • src/app.tsx
      • 移除 Taro.showModal 实现;
      • onNeedPrivacyAuthorization 中调用 privacyManager.show(resolve)
      • 在 JSX 中渲染 <PrivacyModal />
  • 验证:npx taro build --type weapp 构建成功。
  • 后续提醒:
    • 由于之前的 showModal 授权无效,用户可能需要清理开发者工具/真机缓存后重新进入小程序,才能触发新的 PrivacyModal。
    • 仍需在小程序后台添加「手机号」隐私声明,并确认手机号快速验证组件已开通、额度充足。

调整隐私授权触发位置:登录页不再主动预检,仅在门店上传图片时触发

  • 用户反馈:隐私授权框不应在手机号登录时主动弹出,应只在门店中心上传图片/拍照时弹出。
  • 修改文件:
    • src/passport/login.tsx:移除 useDidShow 中主动调用 ensurePrivacyAuthorized() 的逻辑;删除对应 import。
    • src/passport/register.tsx:同样移除 useDidShow 中的隐私预检;删除对应 import。
    • src/components/PrivacyModal/index.tsx:将弹窗文案改为更通用表述,避免用户误以为是相册授权。
    • src/pages/store/orders/index.tsx:在 chooseProofImage 调用 Taro.chooseImage 前增加 ensurePrivacyAuthorized() 预检(该页面直接调 chooseImage不走 uploadFile)。
  • 保留逻辑:
    • src/app.tsx 全局 onNeedPrivacyAuthorization 仍通过 PrivacyModal 处理,这是微信基础库 3.16.1+ 强制机制,无法移除。
    • src/api/system/file/index.tsuploadFile() 内部已调用 ensurePrivacyAuthorized(),门店商品管理上传图片时会自动触发隐私授权。
  • 说明:登录时若用户尚未同意隐私协议,微信仍会在点击 getPhoneNumber 按钮时强制触发 onNeedPrivacyAuthorization。这是微信机制,无法避免;但进入登录页本身不会再主动弹框。
  • 验证:待构建完成。

恢复手机号快捷登录功能(回退 request → Taro.request

  • 背景origin/main 上 ca78e73(小程序支付隐私 commitpassport/login.tsxpassport/register.tsx 的登录请求从 Taro.request 改成了统一封装的 request 工具(@/utils/request)。
  • 问题根因:request 拦截器会自动从 storage 读取 access_token 并注入 Authorization 头;对于 loginByMpWxPhone 这种登录接口,如果本地残留旧的/过期 token请求会带上它后端返回 401 或认证冲突,导致快捷登录失败。原来的 Taro.request 版本不带这个头,所以没问题。
  • 恢复方式:通过 git diff 生成 patch将两个文件的登录请求改回 Taro.request(直接请求,不带 Authorization 头),保留其他所有改进(隐私协议 PrivacyModal、UI、邀请关系处理、禁用检查等
  • 具体改动:
    • src/passport/login.tsx
      • 移除 import request from '@/utils/request'SERVER_API_URL 导入;
      • fetchUserInfo() 改回 Taro.request GET /api/auth/user,手动带 Authorization: Bearer ${token} 头;
      • handleGetPhoneNumber 中登录请求改回 Taro.request POST /api/wx-login/loginByMpWxPhone,不带 Authorization 头;
      • 响应数据结构从 res.code/res.data 调整为 res.data.code/res.data.dataTaro.request 多一层包裹)。
    • src/passport/register.tsx:同样改动,恢复 Taro.request,移除 requestSERVER_API_URL 导入。
  • patch 文件:login_recover.patchregister_recover.patch(已应用到工作区,未提交)。