微信小程序授权登录及解密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 相关文章推荐
javascript ie6兼容position:fixed实现思路
Apr 01 Javascript
JavaScript中的数值范围介绍
Dec 29 Javascript
JavaScript中DOM详解
Apr 13 Javascript
JS实现Ajax的方法分析
Dec 20 Javascript
livereload工具实现前端可视化开发【推荐】
Dec 23 Javascript
koa-router路由参数和前端路由的结合详解
May 19 Javascript
详解Webpack抽离第三方类库以及common解决方案
Mar 30 Javascript
JavaScript console的使用方法实例分析
Apr 28 Javascript
JS实现拖拽元素时与另一元素碰撞检测
Aug 27 Javascript
vue制作toast组件npm包示例代码
Oct 29 Javascript
JavaScript动态生成表格的示例
Nov 02 Javascript
Vue中使用import进行路由懒加载的原理分析
Apr 01 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
帝国cms常用标签汇总
2015/07/06 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
2016/12/29 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
JS日历 推荐
2006/12/03 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
javascript 中模板方法单例的实现方法
2017/10/17 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
为Python的web框架编写前端模版的教程
2015/04/30 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
如何使用python传入不确定个数参数
2020/02/18 Python
详解Python中pyautogui库的最全使用方法
2020/04/01 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
详解rem 适配布局
2018/10/31 HTML / CSS
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
应届生体育教师自荐信
2013/10/03 职场文书
水务局局长岗位职责
2013/11/28 职场文书
留学推荐信写作指南
2014/01/25 职场文书
经理秘书求职自荐信范文
2014/03/23 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
城管个人总结
2015/02/28 职场文书
未婚证明范本
2015/06/15 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
基于Golang 高并发问题的解决方案
2021/05/08 Golang
Python 如何解决稀疏矩阵运算
2021/05/26 Python
DSP接收机前端设想
2022/04/05 无线电