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


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 相关文章推荐
在js中单选框和复选框获取值的方式
Nov 06 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
Dec 28 Javascript
jquery实现input输入框实时输入触发事件代码
Jan 28 Javascript
JavaScript按位运算符的应用简析
Feb 04 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
Nov 02 Javascript
jQuery获取DOM节点实例分析(2种方式)
Dec 15 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
Jul 14 Javascript
jQuery validate插件功能与用法详解
Dec 15 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
Sep 11 Javascript
cdn模式下vue的基本用法详解
Oct 07 Javascript
一个小时快速搭建微信小程序的方法步骤
Apr 15 Javascript
微信小程序静默登录的实现代码
Jan 08 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
php中用foreach来操作数组的代码
2011/07/17 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
Mootools 1.2教程 事件处理
2009/09/15 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
Extjs单独定义各组件的实例代码
2013/06/25 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
2016/05/12 Javascript
javascript 封装Date日期类实例详解
2017/05/28 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
vue-video-player 断点续播的实现
2021/02/01 Vue.js
python操作xml文件示例
2014/04/07 Python
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
用python实现刷点击率的示例代码
2019/02/21 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
python实现邮件发送功能
2019/08/10 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
次世代生活态度:Hypebeast
2018/07/05 全球购物
时尚圣经:The Fashion Bible
2019/03/03 全球购物
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
好邻里事迹材料
2014/01/16 职场文书
精彩的广告词
2014/03/19 职场文书
市场部经理岗位职责
2014/04/10 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
道德模范事迹材料
2014/12/20 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书