微信小程序 调用微信授权窗口相关问题解决


Posted in Javascript onJuly 25, 2019

引言

微信小程序为了优化用户体验,取消了在进入小程序时立马出现授权窗口。需要用户主动点击按钮,触发授权窗口。

那么,在我实践过程中,出现了以下问题。

  • 1. 无法弹出授权窗口
  • 2. 希望在用户已经授权的情况下,不显示按钮

1. 具体实现

app.js的onLaunch()函数中,添加获取用户个人信息的代码段。实现在用户已经授权的情况(例如第二次打开小程序时)下,自动获取用户个人信息,而不需要用户的授权。

// 获取用户信息
wx.getSetting({
  success: res => {
    if (res.authSetting['scope.userInfo']) {
      console.log("app: " + "用户已经授权")
      // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
      wx.getUserInfo({
        success: res => {
          // 可以将 res 发送给后台解码出 unionId
          this.globalData.userInfo = res.userInfo
          console.log(this.globalData.userInfo)
          this.globalData.hasUserInfo = true
          // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
          // 所以此处加入 callback 以防止这种情况
          if (this.userInfoReadyCallback) {
            this.userInfoReadyCallback(res)
          }
        },
        fail: (res) => {
          console.log("app: " + "获取用户信息失败")
        }
      })
    }else {
      console.log("app: " + "用户暂时未授权")
    }
  }
})

me.wxml中添加授权按钮(具体的页面根据大家的实际情况)。这里的button组件必须按照如下的形式。

<button open-type="getUserInfo" bindgetuserinfo="你自己定义函数"></button>
<block wx:if="{{!hasUserInfo}}">
  <image src='../../images/icon/wechat.png'></image>
  <button open-type="getUserInfo" bindgetuserinfo="getUserInfo">微信授权登录</button>
</block>

效果这样,具体的样式根据大家的喜好更改

微信小程序 调用微信授权窗口相关问题解决

me.js中添加如下变量和方法,在用户之前没有授权的情况下,需要用户主动点击按钮。

data: {
  userInfo: null,
  hasUserInfo: false
},
getUserInfo: function(e) {
  console.log("me: " + "用户点击授权")
  if(e.detail.userInfo){
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
    app.data.userInfo = this.userInfo
    app.data.hasUserInfo = true
  }
}

2. 无法弹出授权窗口

微信小程序 调用微信授权窗口相关问题解决

这里一定要注意

授权窗口只会在用户第一次授权时出现,也就是,只会出现一次!!

在微信小程序开发工具里,需要我们清除所有缓存

微信小程序 调用微信授权窗口相关问题解决

3. 已经授权的情况下,不显示按钮

由于用户已经授权的时候,app.js会获取用户个人信息(而不是在用户点击授权按钮时获取),但是这个过程是异步的。

可以看到我们的授权按钮的出现时根据{{!hasUserInfo}}的真值来判断,这个值可以通过app.js是否获取了信息来赋值。

<block wx:if="{{!hasUserInfo}}">
  <image class="userAvatar" src='../../images/icon/wechat.png'></image>
  <button open-type="getUserInfo" bindgetuserinfo="getUserInfo">微信授权登录</button>
</block>

但是,可能出现用户已经授权了,但是app.js获取个人信息时过慢,然而我们的授权按钮却错误的以为app.js没有获取到信息,所以将授权按钮渲染了出来。

这时,我们希望,在app.js判断用户已经授权且获取到信息后,告诉我们的授权按钮。

我们在me.js中添加如下代码段。

onLoad: function() {
  // 获取个人信息
  if(app.globalData.userInfo){
    this.setData({
      userInfo: app.globalData.userInfo,
      hasUserInfo: true
    })
  }else{
    // 在app.js没有获取到信息时,判断app.js的异步操作是否返回信息
    app.userInfoReadyCallback = res => {
      this.setData({
        userInfo: app.globalData.userInfo,
        hasUserInfo: true
      })
    }
  }
}

为什么这里会有个app.userInfoReadyCallback函数呢,我们注意到在app.js的wx.getSetting里有一段回调函数,这个函数就是用来解决异步的问题。

微信小程序 调用微信授权窗口相关问题解决

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
解javascript 混淆加密收藏
Jan 16 Javascript
javascript Firefox与IE 替换节点的方法
Feb 24 Javascript
奉献给JavaScript初学者的编写开发的七个细节
Jan 11 Javascript
浅谈JavaScript中的字符编码转换问题
Jul 07 Javascript
JavaScript中Date对象的常用方法示例
Oct 24 Javascript
javascript实现随机显示星星特效
Jan 28 Javascript
javascript容错处理代码(屏蔽js错误)
Jan 20 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
May 04 Javascript
element-ui使用导航栏跳转路由的用法详解
Aug 22 Javascript
js实现搜索提示框效果
Sep 05 Javascript
JavaScript前端面试扁平数据转tree与tree数据扁平化
Jun 14 Javascript
JavaScript实现音乐播放器
Aug 14 Javascript
mock.js模拟前后台交互
Jul 25 #Javascript
解决Vue打包后访问图片/图标不显示的问题
Jul 25 #Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
Jul 25 #Javascript
vue使用代理解决请求跨域问题详解
Jul 24 #Javascript
Vue父组件如何获取子组件中的变量
Jul 24 #Javascript
mock.js模拟数据实现前后端分离
Jul 24 #Javascript
vue+mock.js实现前后端分离
Jul 24 #Javascript
You might like
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
jQuery中prepend()方法用法实例
2014/12/25 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
jquery实现的仿天猫侧导航tab切换效果
2015/08/24 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
python初学之用户登录的实现过程(实例讲解)
2017/12/23 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
python面向对象法实现图书管理系统
2019/04/19 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
2021/01/27 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
致铅球运动员广播稿精选
2014/01/12 职场文书
党员志愿者活动总结
2014/06/26 职场文书
2014年教研员工作总结
2014/12/23 职场文书
学生通报表扬范文
2015/05/04 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python