- 将 login.tsx 和 register.tsx 中登录请求从封装的 request 工具改回 Taro.request - 取消登录请求中自动注入 Authorization 头,避免携带过期/旧 token 导致认证失败 - 调整登录接口响应数据解析,适配 Taro.request 的数据结构 - fetchUserInfo 改回使用 Taro.request,手动携带 Authorization 头部 - 添加全局 getPhoneNumber 调用冷却机制,防止频繁调用导致微信报错 - 登录页新增手机授权冷却
67 lines
5.8 KiB
Markdown
67 lines
5.8 KiB
Markdown
# 2026-07-16 工作记录
|
||
|
||
## 修复手机号授权登录失败
|
||
|
||
- 问题:用户点击登录页「手机号快捷登录」后,微信返回 privacy 相关错误,触发降级弹窗「未获取到手机号」。
|
||
- 原因:基础库 3.16.1+ 对敏感 API(getPhoneNumber / 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`(已应用到工作区,未提交)。
|
||
|