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


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 相关文章推荐
js 多种变量定义(对象直接量,数组直接量和函数直接量)
May 24 Javascript
JavaScript中变量提升 Hoisting
Jul 03 Javascript
js 异步操作回调函数如何控制执行顺序
Dec 24 Javascript
jquery实现简单实用的打分程序实例
Jul 23 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
Jan 26 Javascript
javascript断点调试心得分享
Apr 23 Javascript
javascript防篡改对象实例详解
Apr 10 Javascript
基于react框架使用的一些细节要点的思考
May 31 Javascript
关于 angularJS的一些用法
Nov 29 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
Mar 08 Javascript
VueCli3.0中集成MockApi的方法示例
Jul 05 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
Dec 26 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 动态多文件上传
2009/01/18 PHP
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
javascript 主动派发事件总结
2011/08/09 Javascript
js事件绑定快捷键以ctrl+k为例
2014/09/30 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
AngularJS基础 ng-readonly 指令简单示例
2016/08/02 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
tensorflow没有output结点,存储成pb文件的例子
2020/01/04 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
Currentbody美国/加拿大:美容仪专家
2020/03/09 全球购物
应聘自荐信
2013/12/14 职场文书
市场营销专业个人求职信范文
2013/12/14 职场文书
优秀的自荐信要注意哪些
2014/01/03 职场文书
代理人委托书
2014/08/01 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
解决Go gorm踩过的坑
2021/04/30 Golang