微信小程序授权登录及解密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 相关文章推荐
js中获取事件对象的方法小结
Mar 13 Javascript
jQuery层次选择器选择元素使用介绍
Apr 18 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
Aug 22 Javascript
indexOf 和 lastIndexOf 使用示例介绍
Sep 02 Javascript
限制复选框最多选择项的实现代码
May 30 Javascript
javascript宿主对象之window.navigator详解
Sep 07 Javascript
如何使用Vuex+Vue.js构建单页应用
Oct 27 Javascript
Vue.js系列之vue-router(上)(3)
Jan 03 Javascript
bootstrap Table的一些小操作
Nov 01 Javascript
javaScript手机号码校验工具类PhoneUtils详解
Dec 08 Javascript
IE8中jQuery.load()加载页面不显示的原因
Nov 15 jQuery
three.js搭建室内场景教程
Dec 30 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中实现图片的锐化
2006/10/09 PHP
代码获取历史上的今天发生的事
2014/04/11 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
JavaScript中Form表单技术汇总(推荐)
2016/06/26 Javascript
基于BootStrap实现局部刷新分页实例代码
2016/08/08 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
JS常用倒计时代码实例总结
2017/02/07 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
2018/09/06 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
Python获取当前时间的方法
2014/01/14 Python
python的keyword模块用法实例分析
2015/06/30 Python
学习python 之编写简单乘法运算题
2016/02/27 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
Python 中@property的用法详解
2020/01/15 Python
深入了解NumPy 高级索引
2020/07/24 Python
Python提取视频中图片的示例(按帧、按秒)
2020/10/22 Python
中国电视购物:快乐购
2017/02/04 全球购物
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
师德个人剖析材料
2014/02/02 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
党员评议自我评价
2015/03/03 职场文书
庆七一晚会主持词
2015/06/30 职场文书
小学学习委员竞选稿
2015/11/20 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript
详解JS数组方法
2021/11/20 Javascript