微信小程序 登录
app.js
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// app.js const interfaces = require("./utils/urlconfig") App({ onLaunch() { // 展示本地存储能力 const logs = wx.getStorageSync('logs') || []; logs.unshift(Date.now()) wx.setStorageSync('logs', logs); this.getUserMsg(); }, //获取登录权限后 调取服务器接口 传递 code getUserMsg() { // 获取用户信息 wx.getSetting({ success: res => { if (res.authSetting['scope.userInfo']) { const that = this; // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框 wx.login({ success: function (res) { var code = res.code; //登录凭证 if (code) { //2、调用获取用户信息接口 wx.getUserInfo({ lang: 'zh_CN', success: function (res) { //3.请求自己的服务器,解密用户信息 获取unionId等加密信息 let obj = { encryptedData: res.encryptedData, iv: res.iv, code: code, type: 3 } wx.request({ url: interfaces.decodeUserInfo, //自己的服务接口地址 method: 'post', header: { 'content-type': 'application/x-www-form-urlencoded' }, data: { encryptedData: res.encryptedData, iv: res.iv, code: code, type: 3 }, success: function (data) { //4.解密成功后 获取自己服务器返回的结果 console.log(data, '-----------------') if (data.data.status == 1) { var userInfo = data.data.userInfo; // userInfo.isAdmin = false; userInfo.isGetInfo = false; // userInfo.schoolId = null; that.globalData.userInfo = userInfo; that.globalData.session_key = data.data.session_key; that.globalData.openId = data.data.openId; that.globalData.hasUserInfo = true; if (that.userInfoReadyCallback) { that.userInfoReadyCallback(data) } } else { console.log('解密失败') } }, fail: function () { console.log('系统错误') } }) }, fail: function (res) { console.log(res); console.log('获取用户信息失败' + res); } }) } else { console.log("获取用户登录凭证失败"); } }, fail: function () { } }) } else { console.log("未登录授权"); that.globalData.hasLogin = false; if (that.userInfoReadyCallback) { that.userInfoReadyCallback({ data: { userInfo: null } }) } } } }) }, onShow() { const self = this; wx.getStorage({ key: 'userInfo', success(res) { if (res.data) { self.globalData.userInfo = res.data; } } }) //获取顶部导航栏胶囊部分高度 let menuButtonObject = wx.getMenuButtonBoundingClientRect(); wx.getSystemInfo({ success: (res) => { // console.log(res.windowHeight*2) let statusBarHeight = res.statusBarHeight; const navTop = menuButtonObject.top; //胶囊按钮与顶部的距离 const navHeight = statusBarHeight + menuButtonObject.height + (menuButtonObject.top - statusBarHeight) * 2; //导航高度 let height = res.windowHeight * 2 - navHeight * 2 - 40 - 315 - 40; self.globalData.defineHeader.navHeight = navHeight * 2 self.globalData.defineHeader.navTop = navTop * 2 } }) }, globalData: { userInfo: null, defineHeader: { navHeight: null, navTop: null, } }, })
第一次获取用户权限 之后才能使用wx.login 返回code 在调用服务器接口 返回openId
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
login() { wx.getUserProfile({ desc: '获取你的昵称、头像、地区及性别', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写 success: (res) => { app.getUserMsg() }, fail: function () { console.log('获取用户信息失败') } }) }, onShow: function () { let that = this; //自定义底部导航栏跳转方法 if (typeof that.getTabBar === 'function' && this.getTabBar()) { this.getTabBar().setData({ selected: 0 }) } // console.log(app.globalData,'-----------') if (app.globalData.userInfo) { that.setData({ userInfo: app.globalData.userInfo, hasUserInfo: true }) } else { //由于getuserinfo是一个网络请求,可能会在当前page.onload之后才返回 //为了防止这种情况发生,所以此处加入callback app.userInfoReadyCallback = res => { that.setData({ userInfo: res.data.userInfo, hasUserInfo: true }); } } },