// 微信小程序认证工具类 // 封装微信小程序登录的核心逻辑 import { HTTP_CONFIG } from '@/http/config/config.js' /** * 微信小程序认证工具类 */ export class WechatAuth { /** * 微信登录获取code * @returns {Promise} 微信授权码 */ static async getWxCode() { return new Promise((resolve, reject) => { wx.login({ success: (res) => { console.log(res) if (res.code) { resolve(res.code) } else { reject(new Error('获取微信授权码失败')) } }, fail: (error) => { reject(new Error('微信登录失败: ' + (error.errMsg || '未知错误'))) } }) }) } /** * 获取用户信息(需要用户授权) * @param {string} desc 申请理由 * @returns {Promise} 用户信息 */ static async getUserProfile(desc = '获取用户头像昵称') { return new Promise((resolve, reject) => { // #ifdef MP-WEIXIN wx.getUserProfile({ desc: desc, success: (res) => { resolve(res) }, fail: (error) => { if (error.errMsg && error.errMsg.includes('auth deny')) { reject(new Error('用户拒绝授权')) } else { reject(new Error('获取用户信息失败: ' + (error.errMsg || '未知错误'))) } } }) // #endif // #ifndef MP-WEIXIN reject(new Error('当前环境不支持微信授权')) // #endif }) } /** * 获取用户基本信息(无需授权,但信息有限) * @returns {Promise} 用户基本信息 */ static async getUserInfo() { return new Promise((resolve, reject) => { uni.getUserInfo({ success: (res) => { resolve(res) }, fail: (error) => { reject(new Error('获取用户基本信息失败: ' + (error.errMsg || '未知错误'))) } }) }) } /** * 获取用户手机号(需要用户授权) * 注意:这个方法需要在button组件的open-type="getPhoneNumber"的回调中使用 * @param {Object} e 手机号授权回调事件对象 * @returns {Object} 手机号相关数据 */ static getPhoneNumber(e) { if (e.detail.errMsg === 'getPhoneNumber:ok') { return { success: true, encryptedData: e.detail.encryptedData, iv: e.detail.iv, cloudID: e.detail.cloudID } } else { return { success: false, error: e.detail.errMsg || '获取手机号失败' } } } /** * 生成随机头像 * @returns {string} 随机头像URL */ static generateRandomAvatar() { const avatars = [ 'https://img.yzcdn.cn/vant/cat.jpeg', 'https://img.yzcdn.cn/vant/dog.jpeg', 'https://img.yzcdn.cn/vant/rabbit.jpeg', 'https://img.yzcdn.cn/vant/bird.jpeg' ] return avatars[Math.floor(Math.random() * avatars.length)] } /** * 保存登录信息到本地存储 * @param {string} token 访问令牌 * @param {string} refreshToken 刷新令牌(可选) * @param {Object} userInfo 用户信息 */ static saveLoginInfo(token, refreshToken = null, userInfo = null) { try { // 使用配置中定义的存储键名 uni.setStorageSync(HTTP_CONFIG.storageKeys.token, token) if (refreshToken) { uni.setStorageSync(HTTP_CONFIG.storageKeys.refreshToken, refreshToken) } if (userInfo) { uni.setStorageSync(HTTP_CONFIG.storageKeys.userInfo, userInfo) } console.log('登录信息保存成功') } catch (error) { console.error('保存登录信息失败:', error) throw new Error('保存登录信息失败') } } /** * 获取本地存储的token * @returns {string|null} 访问令牌 */ static getToken() { try { return uni.getStorageSync(HTTP_CONFIG.storageKeys.token) || null } catch (error) { console.error('获取token失败:', error) return null } } /** * 获取本地存储的刷新令牌 * @returns {string|null} 刷新令牌 */ static getRefreshToken() { try { return uni.getStorageSync(HTTP_CONFIG.storageKeys.refreshToken) || null } catch (error) { console.error('获取refreshToken失败:', error) return null } } /** * 获取本地存储的用户信息 * @returns {Object|null} 用户信息 */ static getUserInfoFromStorage() { try { const userInfo = uni.getStorageSync(HTTP_CONFIG.storageKeys.userInfo) return userInfo ? (typeof userInfo === 'string' ? JSON.parse(userInfo) : userInfo) : null } catch (error) { console.error('获取用户信息失败:', error) return null } } /** * 检查是否已登录 * @returns {boolean} 是否已登录 */ static isLoggedIn() { const token = this.getToken() return !!token } /** * 清除所有登录信息 * @deprecated 使用 http/utils/auth-helper.js 中的 clearAuthData 替代 */ static clearLoginInfo() { const { clearAuthData } = require('../http/utils/auth-helper.js') clearAuthData() } /** * 跳转到登录页面 * @deprecated 使用 http/utils/auth-helper.js 中的 navigateToLogin 替代 */ static navigateToLogin() { const { navigateToLogin } = require('../http/utils/auth-helper.js') navigateToLogin() } /** * 检查登录状态并处理 * @returns {boolean} 是否已登录 * @deprecated 使用 http/utils/auth-helper.js 中的 checkLoginStatus 替代 */ static checkLoginStatus() { const { checkLoginStatus } = require('../http/utils/auth-helper.js') return checkLoginStatus() } /** * 完整的微信小程序登录流程 * @param {boolean} needUserInfo 是否需要获取用户详细信息 * @returns {Promise} 登录结果 */ static async performWxLogin(needUserInfo = true) { try { // 1. 获取微信授权码 const code = await this.getWxCode() // 2. 准备登录数据 const loginData = { code } // 3. 如果需要用户信息,尝试获取 if (needUserInfo) { try { const userProfile = await this.getUserProfile() loginData.encryptedData = userProfile.encryptedData loginData.iv = userProfile.iv loginData.signature = userProfile.signature loginData.userInfo = userProfile.userInfo } catch (userInfoError) { console.warn('获取用户详细信息失败,使用基本登录:', userInfoError.message) // 继续使用基本登录,不中断流程 } } return { success: true, data: loginData, message: '微信授权成功' } } catch (error) { console.error('微信登录流程失败:', error) return { success: false, error: error.message, message: '微信登录失败' } } } } /** * 默认导出,便于直接导入使用 */ export default WechatAuth