微信小程序授权登录及解密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 相关文章推荐
解决FLASH需要点击激活的代码
Dec 20 Javascript
seajs中模块的解析规则详解和模块使用总结
Mar 12 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
Jul 08 Javascript
超精准的javascript验证身份证号的具体实现方法
Nov 18 Javascript
AngularJS ng-template寄宿方式用法分析
Nov 07 Javascript
vue实现列表的添加点击
Dec 29 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
Sep 01 Javascript
LayUI表格批量删除方法
Aug 15 Javascript
基于element-ui的rules中正则表达式
Sep 04 Javascript
JavaScript模板引擎实现原理实例详解
Dec 14 Javascript
JavaScript实现烟花绽放动画效果
Aug 04 Javascript
如何在vue-cli中使用css-loader实现css module
Jan 07 Vue.js
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实现的CSS更新类实例
2014/09/22 PHP
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
2017/11/20 PHP
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
2010/12/10 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
node.js中的socket.io入门实例
2014/04/26 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
2016/12/13 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
2018/03/06 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
JS实现多功能计算器
2020/10/28 Javascript
Python下的subprocess模块的入门指引
2015/04/16 Python
实例介绍Python中整型
2019/02/11 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
python3 下载网络图片代码实例
2019/08/27 Python
Python函数基本使用原理详解
2020/03/19 Python
Python 绘制可视化折线图
2020/07/22 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
python之随机数函数的实现示例
2020/12/30 Python
HTML5中Localstorage的使用教程
2015/07/09 HTML / CSS
医院院务公开实施方案
2014/05/03 职场文书
最常使用的求职信
2014/05/25 职场文书
企业趣味活动方案
2014/08/21 职场文书
关于幸福的感言
2015/08/03 职场文书
员工给公司的建议书
2019/06/24 职场文书
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis