在开发微信小程序时,会先调用wx.login 获取 code 以后 调用 wx.getUserProfile() 获取rawData、signature、encryptedData、iv等信息,到后台进行处理;

但是随着4月28日24时后发布的新版本小程序,接口调整,这样写就会报错:error msg: ''getUserProfile:fail can only be invoked by user TAP gesture"。

文档说明:

常见问题

开始聊之前说一下我个人遇到过的偶发性不能解密encryptedData,导致提示签名失败

1、把wx.login() 放在了 wx.getUserProfile() 前执行;要保证获取 sessionKey 在getUserProfile 之前,不然就会出现解密失败的问题;

2、在wx.logon() 的 success 回调中包裹 wx.getUserProfile,来保证获取code 和 获取 encryptedData,从而避免解密失败,但是官网明确规定,wx.getUserProfile() 只能通过tap点击去出发,不然就error:getUserProfile:fail can only be invoked by user TAP gesture

3、参考网上做法 把wx.login() 放在 wx.getUserProfile() 的success 回调中去执行,发现还是会出现偶发性的 解密失败;

实现:通过Promise串行保证顺序执行

Tips: 由于是使用uniapp 进行开发,写法和 小程序的语法不太一样,但是思路都是一样的

export default{data(){return{}},methods:{getUserProfile() {return new Promise((resolve, reject) => {uni.getUserProfile({desc: '獲取您的昵稱、頭像、地區及性別',success: userRes => {console.log('getUserProfile-res', userRes);resolve(userRes);},fail: userErr => {uni.showToast({title: '授權失敗',icon: 'error'});console.log('getUserProfile-err', userErr);reject(userErr);}});});},getLoginCode() {return new Promise((resolve, reject) => {uni.login({provider: 'weixin',success: loginRes => {console.log('loginRes', loginRes);resolve(loginRes);}});});},}}

html中绑定click事件

<button @click.stop="goLogin" class="bottom-btn" type="default" size="mini">登入</button>

goLogin方法中使用promise.all 来保证顺序执行

export default{data(){return{}},methods:{goLogin() {// 注意使用函数的写法,避免出现错误let userProFile = this.getUserProfile();let loginCode = this.getLoginCode();loginCode.then(code => {return code;}).then(logCode => {return new Promise((resolve, reject) => {userProFile.then(res => {resolve({ logCode, iv: res.iv, rawData: res.rawData, encryptedData: res.encryptedData, signature: res.signature });}).catch(err => {reject(err);});});}).then(res => {console.log('promise-res', res);}).catch(err => {console.log('userProfile-err', err);});}}
}

这样经过几天的间断性测试没有出现偶发的 解密失败的问题!

wx.login 和 wx.getUserProfile 同时使用问题相关推荐

  1. 微信小程序wx.login()、wx.getSetting、wx.getUserInfo的区别和联系?

    1.wx.login 前端使用wx.login是获取登录凭证(code),将code发送给后台,后台向微信发送请求获取用户的唯一标识(openid)及本次登录的会话密钥(session_key),然后 ...

  2. 实现等待wx.login完成后在执行其他请求

    wx.login以及wx.request不支持async 和 await 通过Promise封装 getCode(e){return new Promise((resolve, reject) =&g ...

  3. 微信小程序通过getUserProfile和wx.login获取后端的token

    后端接口要求encryptedData,iv,rawData,signature,code这个5个参数,前4个在getUserProfile方法中,后一个在wx.login中,最后在掉接口,所以我想到 ...

  4. 关于微信小程序如何调用wx.login获取openId和用户信息

    首先我们需要在微信开发小工具获取code临时登录凭证,下面是js文件也就是一些需要调用的函数.需要做这个的话我们需要上微信公众平台获取AppId和AppSecret Page({data: {},on ...

  5. wx_login.php,wx.login 获取 用户的openid

    小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系. 其中 openid 是用户的唯一标识符,可以在页面中要求用户输入手机号 再将手机号与其绑定起来, 省 ...

  6. 微信小程序登录功能wx.login

    wx.login(object,object) //index.js Page ({data: {openid: null,session_key: null,unionid: null,},onLo ...

  7. 获取微信小程序wx.login 生成的code

    微信小程序获取用户信息需要调用微信内置都wx.login()方法,这个方法会生成一个时效很短的code,通过微信另外都接口,使用code作为参数我们可以获得用户的openid.unionid等信息,然 ...

  8. 微信小程序-登录(wx.login)

    用户微信登录小程序有两种情况,分别为弹出登录提示和不弹出登录提示两种.弹出登录提示的情况下,用户确定后会向后台传入更多参数,例如用户昵称等.不弹出登录提示只能获取到用户的临时登录凭证code.主要根据 ...

  9. 微信小程序和百度小程序的登录 wx.login() swan.login() , 以及存在的问题处理

    一说到小程序,很多人都知道 微信小程序,但是如果你是小程序开发者,那么也可能知道百度小程序: 有一句开发者的至理名言,如果你在开发百度小程序中遇到了问题,那么第一时间不是取看文档,逛社区论坛, 因为你 ...

  10. 微信小程序app.js调用wx.login

    只为梳理一下自己调用微信登陆的思路 先做一个简单的封装,将接口地址存到变量中,方便调用. 在utils中建立一个文件constant.js var rqcfg = {domin: 'https://a ...

最新文章

  1. Science | 化学合成文献数字化自动执行通用系统
  2. 浅谈Java/Android下的注解
  3. 唤起微信/QQ返回不了当前页面解决方法
  4. Linux - How to Take ‘Snapshot of Logical Volume and Restore’ in LVM
  5. 网络通信之 字节序转换原理与网络字节序、大端和小端模式
  6. 【渝粤题库】国家开放大学2021春2038财务管理题目
  7. 51单片机外部中断实验 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管
  8. 如何使用Elasticsearch在.NET应用程序中实现全文搜索
  9. JavaScript 物体的运动
  10. 【紫书第七章】暴力美学(能用暴力解决的事情为什么要动脑子?)
  11. python实现【国家统计局】三级区划代码和城乡划分代码爬取
  12. Linux C编程学习之路
  13. 项目管理人员达到最高层所需的八大能力
  14. v4l2-ctl基本使用方法
  15. 如何对Windows 2000中出现的“Stop 0x0000007B”错误信息进行故障诊断
  16. 机器学习 深度学习 EM算法 深度解析
  17. YOLOv3 cfg文件详解
  18. 垂直搜索引擎的存在意义
  19. UEFI和Legacy及UEFI+Legacy启动的区别
  20. 你其实并不需要那么多的FaceBook账号

热门文章

  1. 参考文献标引方式_参考文献标注方法有哪些 为什么要标注参考文献
  2. kubectl源码分析之drain
  3. UCB CS285课程笔记目录
  4. 汕尾话专用专注微信聊天表情GIF图片
  5. 服务器代理跳过上网限制策略
  6. iOS TableView实现QQ好友列表(一)
  7. Unity-Some objects were not cleaned up when closing the scene.
  8. Java图片高保真缩放工具类
  9. 逆向实战 2#去除程序注册、正版校验,绕过联网校验
  10. VMware 磁碟機未備妥