微信小程序授权登录及解密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代码
Jul 01 Javascript
js图片延迟加载的实现方法及思路
Jul 22 Javascript
js 三级关联菜单效果实例
Aug 13 Javascript
jQuery遍历之next()、nextAll()方法使用实例
Nov 08 Javascript
jquery手风琴特效插件
Feb 04 Javascript
Jquery使用val方法读写value值
May 18 Javascript
总结Javascript中数组各种去重的方法
Oct 04 Javascript
Javascript Function.prototype.bind详细分析
Dec 29 Javascript
vue组件父子间通信详解(三)
Nov 07 Javascript
vue-cli扩展多模块打包的示例代码
Apr 09 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
Sep 29 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
Sep 02 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
php代码审计比较有意思的例子
2014/05/07 PHP
PHP检测用户语言的方法
2015/06/15 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
Vue3.0的优化总结
2020/10/16 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
Python读取Excel的方法实例分析
2015/07/11 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
django中的数据库迁移的实现
2020/03/16 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
夏洛特和乔治婴儿和儿童时装精品店:Charlotte and George
2018/06/06 全球购物
公司JAVA开发面试题
2015/04/02 面试题
介绍一下linux文件系统分配策略
2012/11/17 面试题
环境科学专业个人求职信
2013/12/15 职场文书
《会走路的树》教后反思
2014/04/19 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
毕业证明模板
2015/06/19 职场文书
家长会感言
2015/08/01 职场文书
辅导员学期工作总结
2015/08/14 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android