微信小程序授权登录及解密unionId出错的方法


Posted in Javascript onSeptember 26, 2018

注:没有在微信开放平台做开发者资质认证的就不要浪费时间了,没认证无法获取unionId,认证费用300元/年,emmmm....

微信授权登录流程

第一步:wx.login获取 用户临时登录凭证code

第二步:wx.getUserInfo获取加密过的数据encryptedData和解密参数iv

第三步:把步骤一、二中的code、encryptedData、iv传到开发者自己服务端

第三步:服务端获取到code、encryptedData、iv之后用get方法请求如下微信接口

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

appid:小程序appid

secret: 小程序密钥

js_code: 第一步获取的临时登录凭证code

grant_type:'authorization_code'

接口会返回 openid, session_key,注意:用户已经授权过的平台还会返回unionId,如果你只是需要unionId,则到此为止

官方文档说法如图:

微信小程序授权登录及解密unionId出错的方法

没有授权过则用encryptedData、session_key、iv、appid、secret进行解密,官方多语言解密示例下载链接:
unionId解密示例

包含c++ php python node

第四步:仿照示例解密后获得unionId,想做什么就做什么了~

以下是授权登录前端代码:

authLogin () {
  wx.login({
   success: loginRes => {
    let code = loginRes.code // 获取用户临时code
    wx.getUserInfo({
     success: function (res) {
      let encryptedData = res.encryptedData // 获取加密数据
      let iv = res.iv // 解密参数
      // 发送解密必要数据到服务端
      wx.request({
       url: 'http://localhost',
       methods: 'POST',
       data: {
        code: code,
        encryptedData: encryptedData,
        iv: iv
       },
       succeess: res => {
        // 服务端首先调用微信接口获取session_key
        // 用户已经授权过的平台会直接返回unionId
        // 没有授权过则用session_key进行解密
        // 解密成功后服务端根据逻辑返回自定义信息
       }
      })
     }
    })
   }
  })
 }

以上步骤可行,但是微信调整了用户授权方式

微信小程序授权登录及解密unionId出错的方法

新的授权需用button组件调用getUserInfo,所以在这之前无法调用wx.login,但是如果先调用获取用户信息再调用wx.login的话,解密过程会出错,猜测code对应的session_key和之前getUserInfo获取的encryptedData不匹配

解决办法:

在页面的onLoad生命周期里调用wx.login,获取的code存入data以备需要的时候使用,但是code失效时间为5分钟,如果用户停留页面时间过长后点击授权登录,此时的code已经过期了,所以,获取code的函数应该每4分钟左右调用一次

wxml按钮授权:

<button open-type='getUserInfo' bindgetuserinfo="authLogin">微信登录</button>

js:

// 获取code
 onLoad: function (options) {
  this.getCodeTimer()
 },
 getCodeTimer () {
  wx.login({
   success: res => {
    this.data.code = res.code
    setTimeout(() => {
     this.getCodeTimer()
    }, 4 * 60 * 1000)
   }
  })
 },
 // 授权登录
 authLogin(event) {
  if (event.detail.errMsg == 'getUserInfo:ok') {
   wx.showLoading()
   let reqData = {
    code: this.data.code,
    encryptedData: event.detail.encryptedData,
    iv: event.detail.iv
   }
   wx.request({
    url: 'http://localhost:8080',
    methods: 'POST',
    data: reqData,
    success: (res) => {
     console.log(res)
      // 请求完成
    }
   })
  } else {
   console.log('用户拒绝授权')
  }
 }

授权逻辑修改后实测没有出过错

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery autocomplete自动完成插件的的使用方法
Aug 07 Javascript
jQuery 全选/反选以及单击行改变背景色实例
Jul 02 Javascript
jQuery()方法的第二个参数详解
Apr 29 Javascript
高性能JavaScript 重排与重绘(2)
Aug 11 Javascript
javascript跨域的方法汇总
Oct 23 Javascript
使用JavaScript实现ajax的实例代码
May 11 Javascript
微信小程序 地图定位简单实例
Oct 14 Javascript
easyui form validate总是返回false的原因及解决方法
Nov 07 Javascript
关于微信jssdk实现多图片上传的一点心得分享
Dec 13 Javascript
Vue中axios拦截器如何单独配置token
Dec 27 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
May 12 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
Jul 29 Javascript
vue根据进入的路由进行原路返回的方法
Sep 26 #Javascript
vue-router之nuxt动态路由设置的两种方法小结
Sep 26 #Javascript
Vue 配合eiement动态路由,权限验证的方法
Sep 26 #Javascript
react-navigation之动态修改title的内容
Sep 26 #Javascript
React项目动态设置title标题的方法示例
Sep 26 #Javascript
Vue resource三种请求格式和万能测试地址
Sep 26 #Javascript
JS返回页面时自动回滚到历史浏览位置
Sep 26 #Javascript
You might like
php图片加中文水印实现代码分享
2012/10/31 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
javascript Xml增删改查(IE下)操作实现代码
2009/01/30 Javascript
斜45度寻路实现函数
2009/08/20 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
2013/11/07 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
详解nodejs express下使用redis管理session
2017/04/24 NodeJs
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
JavaScript类型相关的常用操作总结
2019/02/14 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
利用python循环创建多个文件的方法
2018/10/25 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
python实现宿舍管理系统
2019/11/22 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
Python3爬虫中关于中文分词的详解
2020/07/29 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
表扬信格式
2014/01/12 职场文书
学习标兵获奖感言
2014/02/20 职场文书
领导新年致辞2016
2015/07/29 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android