微信小程序授权登录及解密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 相关文章推荐
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
Jun 28 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
Jul 25 Javascript
javascript 窗口加载蒙板 内嵌网页内容
Nov 19 Javascript
10款非常有用的 Ajax 插件分享
Mar 14 Javascript
Javascript基础教程之关键字和保留字汇总
Jan 18 Javascript
纯JavaScript代码实现移动设备绘图解锁
Oct 16 Javascript
js将滚动条滚动到指定位置的简单实现方法
Jun 25 Javascript
URL中“#” “?” &amp;“”号的作用浅析
Feb 04 Javascript
windows下vue-cli导入bootstrap样式
Apr 25 Javascript
antd Upload 文件上传的示例代码
Dec 14 Javascript
在微信小程序中使用mqtt服务的方法
Dec 13 Javascript
vue或react项目生产环境去掉console.log的操作
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
用php随机生成福彩双色球号码的2种方法
2013/02/04 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
Javascript 构造函数 实例分析
2008/11/26 Javascript
JS 自动完成 AutoComplete(Ajax 查询)
2009/07/07 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
js确定对象类型方法
2012/03/30 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
实例分析JS与Node.js中的事件循环
2017/12/12 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
Node.js进阶之核心模块https入门
2018/05/23 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
[06:07]DOTA2-DPC中国联赛3月5日Recap集锦
2021/03/11 DOTA
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
在CMD命令行中运行python脚本的方法
2018/05/12 Python
pandas数据处理进阶详解
2019/10/11 Python
软件测试面试题
2015/10/21 面试题
机电一体化职业规划书
2014/01/07 职场文书
安全生产活动月方案
2014/03/09 职场文书
住宅使用说明书
2014/05/09 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
运动会宣传稿100字
2015/07/23 职场文书
创业计划书之淘宝网店
2019/10/08 职场文书
python unittest单元测试的步骤分析
2021/08/02 Python
Go语言 详解net的tcp服务
2022/04/14 Golang