微信小程序 登录

app.js

// 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,
    }
  },
})
View Code

第一次获取用户权限 之后才能使用wx.login  返回code 在调用服务器接口 返回openId

  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
        });
      }
    }
  },
View Code
原文地址:https://www.cnblogs.com/lvlisn/p/15672590.html