微信小程序授权登录及解密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 缩图函数 (onDOMLoaded)……
Oct 23 Javascript
Javascript JSQL,SQL无处不在,
May 05 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
Sep 29 Javascript
jquery实现平滑的二级下拉菜单效果
Aug 26 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
Jan 12 Javascript
Javascript中call,apply,bind方法的详解与总结
Dec 12 Javascript
微信小程序实现锚点定位楼层跳跃的实例
May 18 Javascript
bootstrap datetimepicker控件位置异常的解决方法
Nov 23 Javascript
angular 服务随记小结
May 06 Javascript
JS开发常用工具函数(小结)
Jul 04 Javascript
layui动态绑定事件的方法
Sep 20 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 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
了解咖啡雨林联盟认证 什么是雨林认证 雨林认证是什么意思
2021/03/05 新手入门
十天学会php之第四天
2006/10/09 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
解决vuex刷新状态初始化的方法实现
2019/08/15 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
获取python文件扩展名和文件名方法
2018/02/02 Python
python样条插值的实现代码
2018/12/17 Python
python 实现倒排索引的方法
2018/12/25 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
学python安装的软件总结
2019/10/12 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
python解析xml文件方式(解析、更新、写入)
2020/03/05 Python
Python 如何创建一个简单的REST接口
2020/07/30 Python
如何实现一个python函数装饰器(Decorator)
2020/10/12 Python
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
《池塘边的叫声》教学反思
2014/04/12 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
Python基础详解之邮件处理
2021/04/28 Python
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫
Java基础之this关键字的使用
2021/06/30 Java/Android