refactor(pay): 优化登录及获取 openid 逻辑

- 替换 getOpenId 为 getWxOpenId,调整参数和返回值处理
- 修正 openid 变量赋值及异常判断逻辑
- loginByOpenId 调用改为更健壮的空值判断
- 捕获 loginByOpenId 异常,优化异常处理及用户引导
- 保证登录异常不阻断支付流程,并提示用户先注册/登录
This commit is contained in:
2026-07-16 00:45:01 +08:00
parent ca78e73f51
commit af90bd7a55
2 changed files with 36 additions and 35 deletions

View File

@@ -48,22 +48,25 @@
- 新订单检测 Hook`src/hooks/useNewOrderDetector.ts`30秒轮询页面隐藏暂停
## 微信隐私协议(基础库 3.16.1+ 强制)
- 报错特征:`chooseImage:fail api scope is not declared in the privacy agreement` + `errno:112`
- 两处代码修复:
1. 调用 `Taro.chooseImage` 前必须`getPrivacySetting``requirePrivacyAuthorize` 预检(封装在 `src/api/system/file/index.ts``ensurePrivacyAuthorized()` 里)
2. `src/app.tsx``useLaunch` 中注册 `Taro.onNeedPrivacyAuthorization` 回调(用 `showModal` 自定义弹窗)
- 一处手动配置:**小程序管理后台** → 设置 → 第三方设置 → 用户隐私保护指引 → 添加「开发者收集你的相册/摄像头」声明
- ⚠️ **`requiredPrivateInfos` 字段只接受位置类 API 白名单**chooseAddress/chooseLocation/choosePoi/getFuzzyLocation/getLocation/onLocationChange/startLocationUpdate/startLocationUpdateBackground不要加 `chooseImage`/`chooseMedia` 等非位置类,会导致 app.json 解析失败
- 报错特征:`chooseImage:fail api scope is not declared in the privacy agreement` / `getPhoneNumber:fail ... privacy ...` + `errno:112`
- 代码修复:
1. 调用 `Taro.chooseImage` / `getPhoneNumber` 等敏感 API 前,`getPrivacySetting``requirePrivacyAuthorize` 预检(封装在 `src/api/system/file/index.ts``ensurePrivacyAuthorized()`,已 export
2. `src/app.tsx``useLaunch` 中注册 `Taro.onNeedPrivacyAuthorization` 回调,通过 `Taro.showModal` 展示隐私协议授权弹窗,用户点击「同意」后再 `resolve({ event: 'agree', button: 'agree' })`
3. 登录/注册页在 `useDidShow` 中主动预检隐私协议,避免点击授权按钮时因未授权隐私协议而失败
- 手动配置:**小程序管理后台** → 设置 → 第三方设置 → 用户隐私保护指引 → 添加「开发者收集你的相册/摄像头」和「手机号」声明
- ⚠️ **`requiredPrivateInfos` 字段只接受位置类 API 白名单**chooseAddress/chooseLocation/choosePoi/getFuzzyLocation/getLocation/onLocationChange/startLocationUpdate/startLocationUpdateBackground不要加 `chooseImage`/`chooseMedia`/`getPhoneNumber` 等非位置类,会导致 app.json 解析失败
- 直接调 `Taro.chooseImage` 的页面:`pages/order/evaluate/index.tsx``pages/after-sale/apply/index.tsx``pages/store/orders/index.tsx` —— 这些页面绕过了 `uploadFile`,需要单独加 `ensurePrivacyAuthorized` 预检
- 直接调 `getPhoneNumber` 的页面:`passport/login.tsx``passport/register.tsx` —— 已增加隐私协议预检 + 降级短信登录
## 手机号授权登录降级方案2026-07-15
## 手机号授权登录降级方案2026-07-15 ~ 07-16 修复
- **业务现实**`getPhoneNumber` 按钮被用户拒绝后,微信会短期"记住"用户的选择,再次点击会直接 fail`errMsg: getPhoneNumber:fail user deny`)。一旦进入这个状态,前端必须提供降级入口
- **统一模式**`passport/login.tsx``passport/register.tsx` 都有 `getPhoneNumber` 回调,**不允许**只 toast 一句"未授权手机号"就完事
- 必做:失败时调 `showPhoneAuthFailedModal(errMsg)`,按 errMsg 区分场景弹窗user deny / privacy / no permission / 通用)
- 弹窗带"短信登录"按钮自动跳 `/passport/sms-login`(透传 redirect + 邀请参数 inviter/source/t
- 必做:主登录按钮**长期可见**地提供"使用短信验证码登录"链接,不要依赖弹窗
- **接口地址统一**login/register 的手机号登录接口统一使用 `SERVER_API_URL + '/wx-login/loginByMpWxPhone'`register 之前误写 `https://shop-api.websoft.top`
- **短信登录页**`/passport/sms-login`(路由表里已有),调 `loginBySms` + `sendSmsCaptcha` 接口
- **已落地页面**`passport/login.tsx`(新增 goSmsLogin + showPhoneAuthFailedModal + alt 链接)、`passport/register.tsx`(新增 showPhoneAuthFailedModal + weapp 下也显示短信按钮
- **已落地页面**`passport/login.tsx``passport/register.tsx`(隐私协议预检 + 统一 request + 降级弹窗
## 分享 / 朋友圈能力2026-07-13 接入)
- 统一封装:`src/hooks/useShare.ts``useShare({title, path?, query?, imageUrl?, enableTimeline?, enableCopyUrl?})`,一次注册 `useShareAppMessage` + `useShareTimeline` + 可选 `onCopyUrl` 复制链接;自动在 path/query 追加 `inviter=${当前用户id}` 做裂变归因;`isTimelineSinglePage()` 判断朋友圈单页模式 scene===1154