refactor(pay): 优化登录及获取 openid 逻辑
- 替换 getOpenId 为 getWxOpenId,调整参数和返回值处理 - 修正 openid 变量赋值及异常判断逻辑 - loginByOpenId 调用改为更健壮的空值判断 - 捕获 loginByOpenId 异常,优化异常处理及用户引导 - 保证登录异常不阻断支付流程,并提示用户先注册/登录
This commit is contained in:
@@ -4,7 +4,7 @@ import { Button, Cell, Price, Divider } from '@nutui/nutui-react-taro'
|
||||
import { Check, Close, Tips, Clock } from '@nutui/icons-react-taro'
|
||||
import Taro from '@tarojs/taro'
|
||||
import { request } from '@/utils/request'
|
||||
import { getOpenId, loginByOpenId } from '@/api/passport/wx-login'
|
||||
import { getWxOpenId, loginByOpenId } from '@/api/layout'
|
||||
import { saveStorageByLoginUser } from '@/utils/server'
|
||||
import { TenantId } from '@/config/app'
|
||||
|
||||
@@ -157,14 +157,13 @@ const PayPage: React.FC = () => {
|
||||
console.log('[PayPage] Taro.login code:', loginRes.code)
|
||||
|
||||
// 2. 用 code 换取 openid(关键步骤,之前遗漏了)
|
||||
const openIdRes = await getOpenId(loginRes.code)
|
||||
console.log('[PayPage] getOpenId 结果:', openIdRes)
|
||||
const openIdRes: any = await getWxOpenId({ code: loginRes.code })
|
||||
console.log('[PayPage] getWxOpenId 结果:', openIdRes)
|
||||
|
||||
if (!openIdRes.success || !openIdRes.openid) {
|
||||
throw new Error(openIdRes.message || '获取 openid 失败,请重试')
|
||||
const openid = openIdRes?.openid || openIdRes
|
||||
if (!openid) {
|
||||
throw new Error(openIdRes?.message || '获取 openid 失败,请重试')
|
||||
}
|
||||
|
||||
const openid = openIdRes.openid
|
||||
// 缓存 openid,后续支付确认等接口可用
|
||||
Taro.setStorageSync('openid', openid)
|
||||
console.log('[PayPage] 获取到 openid:', openid)
|
||||
@@ -173,37 +172,36 @@ const PayPage: React.FC = () => {
|
||||
// 如果用户已在小程序注册过,loginByOpenId 会返回 token
|
||||
// 如果用户未注册,不影响 openid 已获取,但 mp-prepay 可能需要特殊处理
|
||||
try {
|
||||
const loginResult = await loginByOpenId({
|
||||
const loginResult: any = await loginByOpenId({
|
||||
code: loginRes.code,
|
||||
tenantId: TenantId
|
||||
})
|
||||
console.log('[PayPage] loginByOpenId 结果:', loginResult)
|
||||
|
||||
if (loginResult.success && loginResult.data) {
|
||||
if (loginResult) {
|
||||
// 登录成功,保存 token
|
||||
saveStorageByLoginUser(loginResult.data.access_token || '', loginResult.data.user)
|
||||
saveStorageByLoginUser(loginResult.access_token || '', loginResult.user)
|
||||
console.log('[PayPage] 自动登录成功,已保存 token')
|
||||
} else {
|
||||
console.warn('[PayPage] 自动登录失败:', loginResult.message)
|
||||
// 未注册用户:openid 已经有了,但 mp-prepay 需要 userId
|
||||
// 提示用户先注册/登录
|
||||
if (loginResult.message?.includes('未注册') || loginResult.message?.includes('不存在')) {
|
||||
Taro.showModal({
|
||||
title: '需要先登录',
|
||||
content: '支付前需要先注册账号,是否前往登录?',
|
||||
confirmText: '去登录',
|
||||
cancelText: '取消'
|
||||
}).then(modalRes => {
|
||||
if (modalRes.confirm) {
|
||||
Taro.navigateTo({ url: '/passport/login' })
|
||||
}
|
||||
})
|
||||
return // 不继续支付流程
|
||||
}
|
||||
console.warn('[PayPage] 自动登录未返回数据')
|
||||
}
|
||||
} catch (loginErr) {
|
||||
} catch (loginErr: any) {
|
||||
console.warn('[PayPage] 自动登录异常:', loginErr)
|
||||
// 登录异常但不阻断支付,openid 已拿到,尝试继续
|
||||
// 如果后端提示未注册,引导用户去登录
|
||||
if (loginErr?.message?.includes('未注册') || loginErr?.message?.includes('不存在')) {
|
||||
Taro.showModal({
|
||||
title: '需要先登录',
|
||||
content: '支付前需要先注册账号,是否前往登录?',
|
||||
confirmText: '去登录',
|
||||
cancelText: '取消'
|
||||
}).then(modalRes => {
|
||||
if (modalRes.confirm) {
|
||||
Taro.navigateTo({ url: '/passport/login' })
|
||||
}
|
||||
})
|
||||
return // 不继续支付流程
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 请求后端创建 JSAPI 预支付订单
|
||||
|
||||
Reference in New Issue
Block a user