270 lines
7.2 KiB
JavaScript
270 lines
7.2 KiB
JavaScript
/**
|
||
* 微信登录工具类
|
||
*/
|
||
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()
|