一、问题描述:

小程序获取手机号的代码,在 getphonenumber 回调函数里,先调用 login 拿到 code,再用 code 请求后端的接口。会有一定概率返回小程序解密失败。代码如下:

<template><buttonopen-type="getPhoneNumber"lang="zh_CN"@getphonenumber="onGetphonenumber">获取手机号</button>
</template><script>
import { GrantPhoneNumber } from "@/api";export default {methods: {//获取手机号onGetphonenumber(e) {if (e.detail.errMsg.includes("ok")) {//用户授权了手机号wx.login({success: res => {let code = res.code;GrantPhoneNumber({code,encryptedData: encodeURIComponent(e.detail.encryptedData),iv: encodeURIComponent(e.detail.iv)}).then(res => {console.log("GrantPhoneNumber:res :>> ", res);}).catch(err => {console.log("GrantPhoneNumber:err :>> ", err);})}});}}}
};
</script>

二、原因:

从官方文档可以看到,在回调中使用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。建议开发者提前进行 login获取 code;或者在回调中先使用 checkSession 进行登录态检查,避免 login 刷新登录态。

三、解决方法:

看了文档的描述,解决小程序解密失败有两种方式:

  • 一种方法是提前拿到 code,也就是在 getphonenumber 回调之前,先调用 login 拿到 code,再用 code 请求后端的接口。
  • 另一种方法是在请求后端接口的时候先判断 code 是否过期。没过期的话,去请求后端接口,否则重新获取 code。

这里我用的是第一种,通过 login 拿到的 code 的有效期,有的说是5分钟,有的说是3分钟。结合自身业务的使用场景,同时也为了以防万一,我在代码里设置了 code 的有效期是1分钟,1分钟后,如果用户没有登录的操作,则重新去获取 code,完整代码如下:

<template><buttonclass="btnClass"open-type="getPhoneNumber"lang="zh_CN"@getphonenumber="onGetphonenumber":style="btnStyle">获取手机号</button>
</template><script>
import { GrantPhoneNumber } from "@/api";export default {data() {return {code: "", //小程序的codeisLost: false //code是否失效};},onLoad() {//防止出现解密失败,提前进行Loginwx.login({success: res => {console.log("phone_login:res :>> ", res);this.code = res.code;}});let interval = setInterval(() => {if ( wx.getStorageSync("userPhone")) {//如果用户已经登录成功 清除定时器clearInterval(interval);} else {//一分钟后让code失效,重新获取this.isLost = true;}}, 60000);},methods: {//获取手机号onGetphonenumber(e) {if (e.detail.errMsg.includes("ok")) {//用户授权了手机号let _this = this;if (!this.isLost) {//code没过期 进行授权_this.phoneHandler(e.detail.encryptedData, e.detail.iv);} else {//code已过期 重新拿code再授权wx.login({success: res => {console.log("phoneHandler_code已过期 重新拿code :>> ", res);this.code = res.code;_this.phoneHandler(e.detail.encryptedData, e.detail.iv);}});}}},//授权手机号phoneHandler(encryptedData, iv) {GrantPhoneNumber({code: this.code,encryptedData: encodeURIComponent(encryptedData),iv: encodeURIComponent(iv)}).then(res => {console.log("GrantPhoneNumber:res :>> ", res);// 本地缓存存一份wx.setStorageSync("userPhone", JSON.stringify(res.phone));}).catch(err => {console.log("GrantPhoneNumber:err :>> ", err);})}}
};
</script>

参考资料:

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

小程序授权返回小程序解密失败相关推荐

  1. 获取微信code、调用小程序云函数、获取小程序支付二维码、小程序授权、小程序获取SeesionId

    获取微信code.调用小程序云函数.获取小程序支付二维码.小程序授权.小程序获取SeesionId 只需要调用对应的接口就行了 1. 小程序code获取 基本信息 接口状态: 已完成 接口URL: h ...

  2. php 小程序登录授权解密,微信小程序授权登录,PHP解密数据,并返回用户信息token记住登录状态...

    首先创建一个项目,把这些代码都清空,我们自己写! 首先index.wxml,写一个button用于发起登录 index.wxml 点击授权 然后写index.js 通过wx.login()来获取cod ...

  3. 微信小程序AES解密失败

    微信小程序分享群获取群id时后端接口返回"微信AES解密失败",后来定位到原因是服务端用于解密的session_key失效.用户获取到openID存在缓存后,就不会每次login获 ...

  4. uniapp--支付宝小程序授权

    uniapp支付宝小程序授权 支付宝小程序的授权和微信小程序的授权基本相似,都是通过button按钮的open-type来设置的 不过支付宝小程序的另外需要设置 scope="userInf ...

  5. 微信小程序授权登录第一次总是失败,第二次登录便正常了

    微信小程序授权登录第一次总是失败,第二次登录便正常了 错误流程 调用 用户点击授权用户信息按钮 ===> 调用wx.login( )生成code发送给后台生成session_key解密 ===& ...

  6. 小程序获取不到用户头像和昵称返回微信用户问题解决,即小程序授权获取用户头像规则调整的最新解决方案

    最近好多同学在学习石头哥小程序课程的时候,遇到了下面这样的问题,在小程序授权获取用户头像和昵称时,获取到的是下面这样的. 到底是什么原因导致的呢,去小程序官方文档一看,又是官方改规则了. 点进去一看, ...

  7. 关于小程序获取手机号解密失败问题

    问题:小程序在解密手机号.用户信息都出现第一次调用解密失败,第二次成功, 原因: 通过open-type="getUserInfo" 先获取iv和encryptedData,再获取 ...

  8. 【最新无授权全解密影视小程序】电影小程序 流量主广告费 提供苹果CMS接口设置maccms伪静态

    源码简介与安装说明: 环境php7.0 - fileinfo–redismysql5.6nginx1.18 添加站点 上传后端文件 后端文件修改/wxapi/config/dbs.php 后端文件修改 ...

  9. 微信小程序获取用户信息和手机号遇到解密失败-41003问题

    {"session_key":"qYEJjzr500MVRyRsdQ\/PEQ==","openid":"ovMwc4yMNCaz ...

  10. 【uniapp小程序】安卓手机与苹果手机的getPhoneNumber拒绝授权返回错误信息不同

    getPhoneNumber拒绝授权返回错误信息不同 开发工具和ios是getPhoneNumber:fail user deny:安卓手机是getPhoneNumber:fail:user deny ...

最新文章

  1. JS中URL编码参数(UrlEncode)
  2. ODS DWD DWS ADS 数仓分层
  3. 包银消费CTO汤向军:消费金融大数据风控架构与实践
  4. Windows x64内核学习笔记(四)—— 9-9-9-9-12分页
  5. IText实现url转pdf, 解决中文字体问题
  6. 用tp5写了一个简单的登录验证
  7. Sublime Text设置快捷键让html文件在浏览器打开
  8. 怎么扩展磁盘_电脑怎么增加C盘空间 小白教你不花钱增加C盘空间
  9. 智能一代云平台(三十四):后端架构一些总结
  10. ASP.NET前台html页面AJAX提交数据后台ashx页面接收数据
  11. python中面向对象的缺点_面向对象中的多态在 Python 中是否没有什么意义?
  12. checkbox 在jsp中的使用
  13. java实现Execl中的STDEVP函数
  14. 知识点1--认识SSM框架并准备项目
  15. 什么是栈?栈的特点和应用场景
  16. eclipse+tomcat+mysql中JDBC驱动加载失败已解决
  17. 使用MinMaxScaler 中scaler.inverse_transform不能返回原来数据的原因
  18. 水波纹特效怎么制作?这波水波纹特效拉动满满复古感
  19. NER项目--github--A Unified MRC Framework for Named Entity Recognition
  20. 中国三大主流开源Linux操作系统社区及其产品生态

热门文章

  1. yarn 无法加载文件 CUsersAdministratorAppDataRoamingnpmyarn.ps1,因为在此系统上禁止运行脚本。的解决方案
  2. 开端——我和我的丛书
  3. 自制游戏引擎之shader预编译
  4. 我现在在早睡早起武清站球球千与千寻
  5. ArchLinux搭建高效便捷的平铺式桌面
  6. 遥感图像DIOR数据集和VOC转为yolo格式代码
  7. Spring Cloud 常用依赖
  8. OWS.infg 应用程序技术支持
  9. GeoTools实战指南:使用MapContent加载GeoServer的WMTS服务
  10. 二叉树的三种遍历以及根据中序外加其他序确定唯一一颗二叉树