微信小程序授权登录及解密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 相关文章推荐
通过ifame指向的页面高度调整iframe的高度
Oct 05 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
Oct 29 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
Nov 14 Javascript
js用Date对象处理时间实现思路及代码
Jan 31 Javascript
js实现按Ctrl+Enter发送效果
Sep 18 Javascript
基于JavaScript实现一定时间后去执行一个函数
Dec 14 Javascript
JS Canvas定时器模拟动态加载动画
Sep 17 Javascript
JavaScript获取中英文混合字符串长度的方法示例
Feb 04 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
May 11 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
Jun 26 jQuery
vue-scroller记录滚动位置的示例代码
Jan 17 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
Dec 03 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
晶体管来复再生式二管收音机
2021/03/02 无线电
php你的验证码安全码?
2007/01/02 PHP
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
XENON基于JSON变种
2010/07/27 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
2013/03/11 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
javascript 中模板方法单例的实现方法
2017/10/17 Javascript
vue 实现复制内容到粘贴板clipboard的方法
2018/03/17 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
Django Admin实现上传图片校验功能
2016/03/06 Python
python面试题小结附答案实例代码
2019/04/11 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
沪江旗下的海量优质课程平台:沪江网校
2017/11/07 全球购物
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
幼儿园儿童节主持词
2014/03/21 职场文书
2014国庆节商场促销活动策划方案
2014/09/16 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
考研复习计划
2015/01/19 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书