// app.js App({ globalData: { userInfo: null, token: null, sessionKey: null, // 微信会话密钥,用于解密手机号等敏感数据 baseUrl: 'http://localhost:8080/api/graphql', // 后台GraphQL接口地址 hasPhoneAuth: false, // 是否已授权手机号 rejectPhone: false, // 是否拒绝过手机号授权 cos: { secretId: 'AKIDfSG2e3Gev1xgBTaVDiz2rTr790d3FH8l', secretKey: 'VmqgIh1B9aopcCYklbBdsthaHkeS3RbY', bucket: 'ryc-1379367838', region: 'ap-chengdu' } }, onLaunch() { console.log('小程序启动') // 检查是否拒绝过手机号授权 const rejectPhone = wx.getStorageSync('rejectPhone') if (rejectPhone) { this.globalData.rejectPhone = true } // 先恢复本地用户数据到globalData this.restoreUserData() // 始终调用登录流程,获取最新的微信code this.login() }, onShow() { console.log('小程序显示') }, onHide() { console.log('小程序隐藏') }, onError(msg) { console.error('小程序错误:', msg) }, // 检查登录状态 // 从本地存储恢复用户数据到globalData(仅用于数据恢复,不做登录判断) restoreUserData() { console.log('=== 恢复本地用户数据 ===') try { const token = wx.getStorageSync('token') const userInfo = wx.getStorageSync('userInfo') const sessionKey = wx.getStorageSync('sessionKey') console.log('本地存储token存在:', !!token) console.log('本地存储userInfo存在:', !!userInfo) console.log('本地存储sessionKey存在:', !!sessionKey) if (token) { console.log('Token长度:', token.length) this.globalData.token = token } if (userInfo) { console.log('用户信息:', { userId: userInfo.userId, name: userInfo.name, phone: userInfo.phone || '未授权' }) this.globalData.userInfo = userInfo } if (sessionKey) { console.log('SessionKey长度:', sessionKey.length) this.globalData.sessionKey = sessionKey } console.log('✅ 本地用户数据恢复完成') } catch (err) { console.error('❌ 恢复本地用户数据时发生错误:', err) // 清除可能损坏的本地存储数据 try { wx.removeStorageSync('token') wx.removeStorageSync('userInfo') wx.removeStorageSync('sessionKey') console.log('已清除损坏的本地存储数据') } catch (clearErr) { console.error('清除本地存储失败:', clearErr) } } }, // 微信登录 login() { console.log('=== 开始微信登录流程 ===') console.log('当前时间:', new Date().toISOString()) console.log('小程序版本:', wx.getAccountInfoSync().miniProgram.version || 'develop') wx.login({ success: (res) => { if (res.code) { console.log('✅ 获取微信登录code成功') console.log('登录code:', res.code) console.log('code长度:', res.code.length) console.log('准备调用后端wxLogin接口...') this.wxLogin(res.code) } else { console.error('❌ 获取微信登录code失败') console.error('错误信息:', res.errMsg) console.error('完整响应:', res) } }, fail: (err) => { console.error('❌ 微信登录API调用失败') console.error('错误详情:', err) console.error('错误类型:', typeof err) wx.showToast({ title: '登录失败,请重试', icon: 'error' }) } }) }, // 调用后台wxLogin接口 wxLogin(code) { const that = this const deviceInfo = this.getDeviceInfo() const requestData = { code: code, loginIp: '127.0.0.1', // 小程序无法获取真实IP,使用默认值 deviceInfo: deviceInfo } console.log('=== 准备调用后端wxLogin接口 ===') console.log('请求URL:', this.globalData.baseUrl) console.log('设备信息:', deviceInfo) console.log('请求参数:', requestData) console.log('请求开始时间:', new Date().toISOString()) wx.request({ url: this.globalData.baseUrl, method: 'POST', header: { 'Content-Type': 'application/json' }, data: { query: ` mutation wxLogin($input: WxLoginRequest!) { wxLogin(input: $input) { token userInfo { userId name phone wxOpenid } isNewUser loginRecordId sessionKey } } `, variables: { input: requestData } }, success: (res) => { console.log('=== 后端wxLogin接口响应 ===') console.log('响应时间:', new Date().toISOString()) console.log('HTTP状态码:', res.statusCode) console.log('响应头:', res.header) console.log('响应数据:', JSON.stringify(res.data, null, 2)) if (res.statusCode !== 200) { console.error('❌ HTTP请求失败,状态码:', res.statusCode) wx.showToast({ title: '服务器错误', icon: 'error' }) return } if (res.data.errors) { console.error('❌ GraphQL错误:', res.data.errors) wx.showToast({ title: '登录失败', icon: 'error' }) return } if (res.data.data && res.data.data.wxLogin) { const loginResult = res.data.data.wxLogin console.log('✅ 登录成功!') console.log('用户ID:', loginResult.userInfo.userId) console.log('用户名:', loginResult.userInfo.name) console.log('手机号:', loginResult.userInfo.phone || '未授权') console.log('是否新用户:', loginResult.isNewUser) console.log('登录记录ID:', loginResult.loginRecordId) console.log('Token长度:', loginResult.token ? loginResult.token.length : 0) console.log('SessionKey长度:', loginResult.sessionKey ? loginResult.sessionKey.length : 0) // 保存登录信息 try { wx.setStorageSync('token', loginResult.token) wx.setStorageSync('userInfo', loginResult.userInfo) if (loginResult.sessionKey) { wx.setStorageSync('sessionKey', loginResult.sessionKey) } console.log('✅ 登录信息已保存到本地存储') } catch (storageErr) { console.error('❌ 保存登录信息到本地存储失败:', storageErr) } that.globalData.token = loginResult.token that.globalData.userInfo = loginResult.userInfo that.globalData.sessionKey = loginResult.sessionKey // 如果是新用户且未拒绝过手机号授权,弹出手机号授权 if (loginResult.isNewUser && !that.globalData.rejectPhone) { console.log('🔔 新用户,准备显示手机号授权弹窗') that.showPhoneAuthModal() } else { console.log('ℹ️ 老用户或已拒绝手机号授权,跳过授权弹窗') } } else { console.error('❌ 响应数据格式错误,缺少wxLogin字段') console.error('实际响应:', res.data) wx.showToast({ title: '登录失败', icon: 'error' }) } }, fail: (err) => { console.error('=== 后端wxLogin接口请求失败 ===') console.error('失败时间:', new Date().toISOString()) console.error('错误详情:', err) console.error('错误类型:', typeof err) console.error('错误代码:', err.errMsg || 'unknown') wx.showToast({ title: '网络错误,请检查网络连接', icon: 'error', duration: 3000 }) } }) }, // 获取设备信息 getDeviceInfo() { try { const systemInfo = wx.getSystemInfoSync() return `${systemInfo.brand} ${systemInfo.model} ${systemInfo.system}` } catch (e) { return 'Unknown Device' } }, // 显示手机号授权弹窗 showPhoneAuthModal() { wx.showModal({ title: '手机号授权', content: '为了更好的服务体验,建议您授权手机号', confirmText: '授权', cancelText: '取消', success: (res) => { if (res.confirm) { // 用户点击授权,跳转到授权页面或触发授权流程 console.log('用户同意授权手机号') } else { // 用户取消授权,记录到本地存储 wx.setStorageSync('rejectPhone', true) this.globalData.rejectPhone = true console.log('用户拒绝授权手机号') } } }) }, // GraphQL请求封装 graphqlRequest(query, variables = {}) { return new Promise((resolve, reject) => { wx.request({ url: this.globalData.baseUrl, method: 'POST', header: { 'Content-Type': 'application/json', 'Authorization': this.globalData.token ? `Bearer ${this.globalData.token}` : '' }, data: { query: query, variables: variables }, success: (res) => { console.log('GraphQL响应:', res.data) if (res.data.errors) { console.error('GraphQL错误:', res.data.errors) reject(res.data.errors) } else if (res.data.data) { resolve(res.data.data) } else { console.error('GraphQL响应异常:', res.data) reject('请求失败') } }, fail: (err) => { reject(err) } }) }) } })