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

67 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.ts``uploadFile()` 内部已调用 `ensurePrivacyAuthorized()`,门店商品管理上传图片时会自动触发隐私授权。
- 说明:登录时若用户尚未同意隐私协议,微信仍会在点击 `getPhoneNumber` 按钮时强制触发 `onNeedPrivacyAuthorization`。这是微信机制,无法避免;但进入登录页本身不会再主动弹框。
- 验证:待构建完成。
## 恢复手机号快捷登录功能(回退 request → Taro.request
- 背景origin/main 上 `ca78e73`(小程序支付隐私 commit`passport/login.tsx``passport/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.data`Taro.request 多一层包裹)。
- `src/passport/register.tsx`:同样改动,恢复 `Taro.request`,移除 `request``SERVER_API_URL` 导入。
- patch 文件:`login_recover.patch``register_recover.patch`(已应用到工作区,未提交)。