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()
|