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

270 lines
7.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 微信登录工具类
*/
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()