详解小程序用户登录状态检查与更新实例


Posted in Javascript onMay 15, 2019

这篇文章主要解决以下问题:用户每次登录小程序(包括第一次使用)及点击小程序的每个页面的时候,我们如何判断他当前的登录状态是否过期?如果过期,如何重新获取用户信息并发送至开发者服务器更新用户信息,以及设置新的用户登录状态?

将这个部分单独作为一篇文章有两个原因:

① wx.getUserInfo(OBJECT) 接口调整,废弃了以前直接获取用户信息的方法;

② 上篇文章授权、登录、session_key、unionId 只梳理了登录流程而没有贴实际的代码,所以这篇文章以代码实现为主。

1. 代码逻辑分析

(1)用户登录态过期时间如何设置?

在上篇文章中也有提到过,用户登录态可以通过前端设置和后端设置两种方式进行控制。这里我们在前端进行控制,即利用wx.checkSession() 接口来判断session_key 是否过期来作为用户登录态是否过期的标志。如果过期了,则跳转到统一的登录页面引导用户点击按钮重新授权登录,重新登录之后session_key 会刷新,相当于在获取用户最新信息的同时重新设定了过期时间。

(2)onShow() 与onLoad()

小程序js 中有onShow 与onLoad 两种事件。两种事件的区别就在于onLoad 每次打开小程序只加载一次,跳转到其他页面再回来的时候这个事件就不会再触发。而onShow 则每次进入页面都会触发,所以我们在进入每个页面检查用户登录态是否过期的代码需要放在onShow 中。

(3)重新登录过程分析

如果用户登录态过期,则需要进行重新登录。登录过程在上篇文章中也有讲过。这里再简单梳理一下:前端引导用户点击按钮触发getUserInfo 获取最新用户信息 -> 前端调用wx.login() 获取code -> 前端将code 发送给后端获取openid 和seesion_key -> 后端写session 并返回对应session 的唯一标志 -> 前端存储这个唯一标志。

2. 代码实例

在每个页面的onShow 事件中添加以下代码来检查当前用户登录态是否过期:

wx.checkSession({
 success: function () {
 //session_key 未过期,并且在本生命周期一直有效
 return ;
 },
 fail: function () {
 // session_key 已经失效,需要重新执行登录流程
 wx.navigateTo({
  url: "/pages/authorize/index"
 })
 }
})

因为进入每个页面中都需要进行用户登录态是否过期的检查,所以需要有一个公共的授权页面,当检查不同过的时候,就跳转到这个授权页面引导用户重新进行授权,授权页面authorize 代码如下:

wxml

<view class="container">
 <view style='width:100%;padding-left:30rpx;font-size: 28rpx;margin-top:30rpx;'>1、同意当前小程序获取我的微信头像;</view>
 <view style='width:100%;padding-left:30rpx;font-size: 28rpx;margin-top:30rpx;'>2、同意当前小程序获取我的微信昵称等其他信息;</view>
 <button open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo" class="save-btn">授权登录</button>
</view>

wxss

page{
 height: 100%;
}
.container{
 background-color: #f5f5f9;
 justify-content: initial;
}
.save-btn{
 width: 690rpx;
 height: 80rpx;
 line-height: 80rpx;
 text-align: center;
 margin-top:30rpx; 
 border-radius: 6rpx;
 box-sizing: border-box;
 background-color: #e64340;
 color:#fff;
}

js

// pages/authorize/index.js
var app = getApp();
let Domain = app.globalData.domain;
Page({
 
 /**
 * 页面的初始数据
 */
 data: { },
 
 /**
 * 生命周期函数--监听页面加载
 */
 onLoad: function (options) { },
 
 /**
 * 生命周期函数--监听页面初次渲染完成
 */
 onReady: function () { },
 
 /**
 * 生命周期函数--监听页面显示
 */
 onShow: function () { },
 
 /**
 * 生命周期函数--监听页面隐藏
 */
 onHide: function () { },
 
 /**
 * 生命周期函数--监听页面卸载
 */
 onUnload: function () { },
 
 /**
 * 页面相关事件处理函数--监听用户下拉动作
 */
 onPullDownRefresh: function () { },
 
 /**
 * 页面上拉触底事件的处理函数
 */
 onReachBottom: function () { },
 
 /**
 * 用户点击右上角分享
 */
 onShareAppMessage: function () { },
 bindGetUserInfo: function (e) {
 // 获得最新的用户信息
 if (!e.detail.userInfo){
  return;
 }
 wx.setStorageSync('userInfo', e.detail.userInfo)
 this.checkSessionAndLogin();
 },
 /* 
 这里使用openid 作为与后端session 连接的标志
 检查是否存在openid,即之前是否登录过
  如果登录过,检查session_key 是否过期
  如果过期了,remove openid 重新执行login 并将用户信息发送到服务器端更新
  如果没过期则返回
  如果没登录过则执行login 并将用户信息发送到服务器更新
 */
 checkSessionAndLogin: function () {
 let that = this;
 let thisOpenId = wx.getStorageSync('openid');
 
 // 已经进行了登录,检查登录是否过期
 if (thisOpenId) {
  console.log('have openid')
  wx.checkSession({
  success: function () {
   //session_key 未过期,并且在本生命周期一直有效
   wx.navigateBack({});
  },
  fail: function () {
   console.log('but session_key expired');
   // session_key 已经失效,需要重新执行登录流程
   wx.removeStorageSync('openid');
   that.checkSessionAndLogin();
  }
  })
 } else {
  // 没有进行登录则先进行登录操作
  console.log('do not have openid');
  that.loginAndGetOpenid();
 }
 },
 // 执行登录操作并获取用户openId
 loginAndGetOpenid: function () {
 console.log('do login and get openid');
 let that = this;
 wx.login({
  success: function (res) {
  if (res.code) {
   wx.request({
   url: Domain + '/user/wx_login',
   data: {
    code: res.code
   },
   success: function (res) {
    res = res.data;
    console.log(res)
    // 保存openId,并将用户信息发送给后端
    if (res.code === 0) {
    wx.showModal({
     title: 'set openid',
     content: res.data,
    })
    wx.setStorageSync('openid', res.data);
    that.sendUserInfoToServer();
    } else {
    wx.showModal({
     title: 'Sorry',
     content: '用户登录失败~',
    })
    }
   }
   })
  }
  }
 })
 },
 sendUserInfoToServer: function () {
 
 console.log('now send user info to server');
 let userInfo = wx.getStorageSync('userInfo');
 let thisOpenId = wx.getStorageSync('openid');
 
 userInfo.openid =thisOpenId;
 
 wx.request({
  url: Domain + '/user/updateUser',
  method: 'POST',
  dataType: 'json',
  data: userInfo,
  success: function (res) {
  res = res.data;
  if (res.code === 0) {
   wx.navigateBack({});
  } else {
   wx.showModal({
   title: 'Sorry',
   content: '同步信息出错~',
   })
  }
  }
 })
 }
})

以上所述是小编给大家介绍的小程序用户登录状态检查与更新实例详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript使用过程中需要注意的地方和一些基本语法
Aug 26 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
Feb 06 Javascript
js select option对象小结
Dec 20 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
Dec 02 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
Jun 30 Javascript
整理一下常见的IE错误
Nov 18 Javascript
详解Angular的双向数据绑定(MV-VM)
Dec 26 Javascript
JS实现iframe自适应高度的方法示例
Jan 07 Javascript
Vue组件通信之Bus的具体使用
Dec 28 Javascript
浅谈实现vue2.0响应式的基本思路
Feb 13 Javascript
使用Vue构建可重用的分页组件
Mar 26 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
Aug 06 Javascript
基于vue如何发布一个npm包的方法步骤
May 15 #Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
May 15 #Javascript
JavaScript页面倒计时功能完整示例
May 15 #Javascript
vue组件间通信六种方式(总结篇)
May 15 #Javascript
JS正则表达式封装与使用操作示例
May 15 #Javascript
微信小程序实现授权登录
May 15 #Javascript
基于vue实现一个神奇的动态按钮效果
May 15 #Javascript
You might like
PHP脚本的10个技巧(1)
2006/10/09 PHP
Javascript与flash交互通信基础教程
2008/08/07 Javascript
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
Javascript浅谈之this
2013/12/17 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
es6中reduce的基本使用方法
2019/09/10 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
[01:14]DOTA2亚洲邀请赛 ShowOpen
2015/02/07 DOTA
浅谈Python基础之I/O模型
2017/05/11 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
在spyder IPython console中,运行代码加入参数的实例
2020/04/20 Python
Python如何在bool函数中取值
2020/09/21 Python
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
Lee牛仔裤澳大利亚官网:美国著名牛仔裤品牌
2017/09/02 全球购物
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
师范大学音乐表演专业求职信
2013/10/23 职场文书
应届毕业生求职信范例分享
2013/12/17 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
机械工程及自动化专业求职信
2014/09/03 职场文书
监考失职检讨书
2015/01/26 职场文书
伏羲庙导游词
2015/02/09 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
angular4实现带搜索的下拉框
2022/03/25 Javascript