peixue-dev/peidu/uniapp/utils/wechat.js

270 lines
7.2 KiB
JavaScript
Raw Normal View History

/**
* 微信登录工具类
*/
import { authApi } from '../api/index.js'
class WechatLogin {
/**
* 获取微信登录code
*/
getCode() {
return new Promise((resolve, reject) => {
// #ifdef MP-WEIXIN
uni.login({
provider: 'weixin',
success: (res) => {
if (res.code) {
console.log('[WeChat] 获取code成功:', res.code)
resolve(res.code)
} else {
console.error('[WeChat] 获取code失败:', res)
reject('获取登录凭证失败')
}
},
fail: (err) => {
console.error('[WeChat] 获取code失败:', err)
reject(err.errMsg || '获取登录凭证失败')
}
})
// #endif
// #ifdef H5
// H5环境下的微信登录需要通过公众号授权
reject('H5环境暂不支持微信登录')
// #endif
// #ifdef APP-PLUS
// APP环境下的微信登录
reject('APP环境暂不支持微信登录')
// #endif
})
}
/**
* 获取用户信息新版本使用 getUserProfile
*/
getUserProfile() {
return new Promise((resolve, reject) => {
// #ifdef MP-WEIXIN
uni.getUserProfile({
desc: '用于完善会员资料',
lang: 'zh_CN',
success: (res) => {
console.log('[WeChat] 获取用户信息成功:', res.userInfo)
resolve(res.userInfo)
},
fail: (err) => {
console.error('[WeChat] 获取用户信息失败:', err)
if (err.errMsg && err.errMsg.indexOf('auth deny') !== -1) {
reject('您拒绝了授权')
} else {
reject(err.errMsg || '获取用户信息失败')
}
}
})
// #endif
// #ifndef MP-WEIXIN
reject('当前环境不支持获取用户信息')
// #endif
})
}
/**
* 微信一键登录小程序
* @param {Object} options 配置选项
* @param {String} options.referralCode 推广码可选
*/
async quickLogin(options = {}) {
try {
console.log('[WeChat] 开始一键登录...')
// 1. 获取登录凭证
const code = await this.getCode()
// 2. 调用后端接口进行登录
const loginData = {
code: code,
type: 'wechat',
referralCode: options.referralCode || ''
}
console.log('[WeChat] 调用登录接口,参数:', loginData)
const response = await authApi.wxLogin(loginData)
console.log('[WeChat] 登录响应:', response)
// 3. 处理响应
const data = response.data || response
if (response.code === 200 || data.token) {
// 保存token和用户信息
if (data.token) {
uni.setStorageSync('token', data.token)
console.log('[WeChat] Token已保存')
}
if (data.userInfo) {
uni.setStorageSync('userInfo', data.userInfo)
console.log('[WeChat] 用户信息已保存')
}
return {
success: true,
needBindPhone: data.needBindPhone || false,
token: data.token,
userInfo: data.userInfo
}
} else {
// 处理业务错误
const errorMsg = response.message || data.message || '登录失败'
throw new Error(errorMsg)
}
} catch (error) {
console.error('[WeChat] 登录失败:', error)
// 友好的错误提示
let errorMessage = '登录失败,请重试'
if (error.message) {
if (error.message.includes('频繁')) {
errorMessage = '操作过于频繁,请稍后再试'
} else if (error.message.includes('网络')) {
errorMessage = '网络连接失败,请检查网络'
} else if (error.message.includes('code')) {
errorMessage = '登录凭证失效,请重试'
} else {
errorMessage = error.message
}
}
throw new Error(errorMessage)
}
}
/**
* 微信授权登录获取用户信息后登录
* @param {Object} options 配置选项
* @param {String} options.referralCode 推广码可选
*/
async authLogin(options = {}) {
try {
console.log('[WeChat] 开始授权登录...')
// 1. 获取登录凭证
const code = await this.getCode()
// 2. 获取用户信息
const userInfo = await this.getUserProfile()
// 3. 调用后端接口进行登录
const loginData = {
code: code,
type: 'wechat',
nickName: userInfo.nickName,
avatarUrl: userInfo.avatarUrl,
gender: userInfo.gender,
province: userInfo.province,
city: userInfo.city,
country: userInfo.country,
referralCode: options.referralCode || ''
}
console.log('[WeChat] 调用登录接口,参数:', loginData)
const response = await authApi.wxLogin(loginData)
console.log('[WeChat] 登录响应:', response)
// 4. 处理响应
if (response.code === 200 || response.data) {
const data = response.data || response
// 保存token和用户信息
if (data.token) {
uni.setStorageSync('token', data.token)
console.log('[WeChat] Token已保存')
}
if (data.userInfo) {
uni.setStorageSync('userInfo', data.userInfo)
console.log('[WeChat] 用户信息已保存')
}
return {
success: true,
needBindPhone: data.needBindPhone || false,
token: data.token,
userInfo: data.userInfo
}
} else {
throw new Error(response.message || '登录失败')
}
} catch (error) {
console.error('[WeChat] 授权登录失败:', error)
throw error
}
}
/**
* 绑定手机号
* @param {Object} phoneData 手机号数据
*/
async bindPhone(phoneData) {
try {
console.log('[WeChat] 开始绑定手机号...')
const response = await authApi.bindPhone(phoneData)
console.log('[WeChat] 绑定手机号响应:', response)
if (response.code === 200 || response.data) {
const data = response.data || response
// 更新用户信息
if (data.userInfo) {
uni.setStorageSync('userInfo', data.userInfo)
console.log('[WeChat] 用户信息已更新')
}
return {
success: true,
userInfo: data.userInfo
}
} else {
throw new Error(response.message || '绑定手机号失败')
}
} catch (error) {
console.error('[WeChat] 绑定手机号失败:', error)
throw error
}
}
/**
* 检查登录状态
*/
checkLoginStatus() {
const token = uni.getStorageSync('token')
const userInfo = uni.getStorageSync('userInfo')
if (!token) {
return {
isLogin: false,
needBindPhone: false
}
}
// 检查是否需要绑定手机号
const needBindPhone = !userInfo || !userInfo.phone
return {
isLogin: true,
needBindPhone: needBindPhone,
userInfo: userInfo
}
}
}
export default new WechatLogin()