微信小程序授权登录及解密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开源框架-jQuery使用手册(1)
Mar 10 Javascript
JavaScript版TAB选项卡效果实例
Aug 16 Javascript
JavaScript禁止页面操作的示例代码
Dec 17 Javascript
jQuery淡入淡出元素让其效果更为生动
Sep 01 Javascript
javascript简单实现类似QQ头像弹出效果的方法
Aug 03 Javascript
简单实现js间歇或无缝滚动效果
Jun 29 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
Aug 03 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
Dec 08 Javascript
AngularJS监听路由变化的方法
Mar 07 Javascript
import与export在node.js中的使用详解
Sep 28 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
May 07 Javascript
JavaScript中的类型检查
Feb 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
Laravel 5框架学习之环境与配置
2015/04/08 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
Extjs中使用extend(js继承) 的代码
2012/03/15 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
jQuery自定义数值抽奖活动代码
2016/06/11 Javascript
JQuery的attr 与 val区别
2016/06/12 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
jquery实现企业定位式导航效果
2018/01/01 jQuery
JS实现图片旋转动画效果封装与使用示例
2018/07/09 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
electron制作仿制qq聊天界面的示例代码
2018/11/26 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
剖析Python的Tornado框架中session支持的实现代码
2015/08/21 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
浅析pandas 数据结构中的DataFrame
2019/10/12 Python
Windows下Anaconda和PyCharm的安装与使用详解
2020/04/23 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
员工自我鉴定
2013/10/09 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
敬老院标语
2014/06/27 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python
python scrapy简单模拟登录的代码分析
2021/07/21 Python