微信小程序获取用户信息并保存登录状态详解


Posted in Javascript onMay 10, 2019

前言

微信小程序的运行环境不是在浏览器下运行的。所以不能以cookie来维护登录态。下面我就来说说我根据官方给出的方法来写出的维护登录态的方法吧。

一、登录态维护

官方的文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject

通过 wx.login() 获取到用户登录态之后,需要维护登录态。开发者要注意不应该直接把 session_key、openid 等字段作为用户的标识或者 session 的标识,而应该自己派发一个 session 登录态(请参考登录时序图)。对于开发者自己生成的 session,应该保证其安全性且不应该设置较长的过期时间。session 派发到小程序客户端之后,可将其存储在 storage ,用于后续通信使用。

登录时序图

微信小程序获取用户信息并保存登录状态详解

从上图可以看出。当我们通过wx.login()获取code的后,发送给我们的服务器,然后去请求微信服务器换取得到对应的openid与session_key,openid是该用户在小程序中的唯一标识用于模板通知之类的。session_key就是用来解密用户的敏感信息。unionid之类的。unionid是微信用户在所有微信平台下的唯一标识。下面我会讲解一下如何得到。

微信小程序获取用户信息并保存登录状态详解

以上就是我的实现方法。调用wx.login()得到code后请求服务器获取openid与session_key缓存在服务器当中。其中生成一个随机数为key,value为openid与session_key。然后返回到小程序通过wx.setStorageSync('LoginSessionKey',得到的随机数key)缓存在小程序当中。每当我们去请求服务器时带上LoginSessionKey即可给服务器读取从而判断用户是否在登录。是不是很简单呢?

二、用户数据的加解密

通过wx.login()登录之后。我们可以通过wx.getUserInfo()获取用户信息。其中一些不敏感的信息在返回的 result中的userInfo里。如想要获取敏感信息。openid,unionid之类的。则需要从密文中去解密得到。

而密文则在encryptedData这个字段当中。我们去请求我们服务器去解密然后得到敏感信息后则可以保存起来。

加密数据解密算法

接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
  2. 对称解密的目标密文为 Base64_Decode(encryptedData),
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节
  4. 对称解密算法初始向量 iv 会在数据接口中返回。

微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。

这时候我们通过小程序得到的result.encryptedData与result.iv与后端得到的session_key 解密出我们得到的敏感用户信息了。

官方给出的解密文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html

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

Javascript 相关文章推荐
tagName的使用,留一笔
Jun 26 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
Nov 18 Javascript
轻松实现js弹框显示选项
Sep 13 Javascript
javascript 单例模式详解及简单实例
Feb 14 Javascript
layui导航栏实现代码
May 19 Javascript
详解JavaScript中操作符和表达式
Sep 12 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
May 13 Javascript
js中offset,client , scroll 三大元素知识点总结
Sep 11 Javascript
KnockoutJS数组比较算法实例详解
Nov 25 Javascript
JS 事件机制完整示例分析
Jan 15 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
Apr 28 Javascript
node+vue实现文件上传功能
May 28 Javascript
jsonp实现百度下拉框功能的方法分析
May 10 #Javascript
微信小程序用户授权,以及判断登录是否过期的方法
May 10 #Javascript
利用es6 new.target来对模拟抽象类的方法
May 10 #Javascript
Angular4.0动画操作实例详解
May 10 #Javascript
Angular 2使用路由自定义弹出组件toast操作示例
May 10 #Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
May 10 #Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
May 10 #Javascript
You might like
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
深入php常用函数的使用汇总
2013/06/08 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
javascript IFrame 强制刷新代码
2009/07/23 Javascript
JavaScript 图像动画的小demo
2012/05/23 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
向JavaScript的数组中添加元素的方法小结
2015/10/24 Javascript
js实现简单的验证码
2015/12/25 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
最适应的vue.js的form提交涉及多种插件【推荐】
2018/08/27 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
python中list循环语句用法实例
2014/11/10 Python
打包发布Python模块的方法详解
2016/09/18 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
python实现聊天小程序
2018/03/13 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
python面向对象法实现图书管理系统
2019/04/19 Python
Python3+Appium安装使用教程
2019/07/05 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
2014年生产管理工作总结
2014/12/23 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
js之ajax文件上传
2021/05/13 Javascript
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android