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