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


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 相关文章推荐
Extjs列表详细信息窗口新建后自动加载解决方法
Apr 02 Javascript
JavaScript中使用构造器创建对象无需new的情况说明
Mar 01 Javascript
JS等比例缩小图片尺寸的实例
Feb 27 Javascript
javascript格式化日期时间方法汇总
Jun 19 Javascript
js省市区级联查询(插件版&amp;无插件版)
Mar 21 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
Feb 09 Javascript
详解使用mpvue开发github小程序总结
Jul 25 Javascript
浅谈小程序 setData学问多
Feb 20 Javascript
JS大坑之19位数的Number型精度丢失问题详解
Apr 22 Javascript
使用JS判断页面是首次被加载还是刷新
May 26 Javascript
vue-cli4项目开启eslint保存时自动格式问题
Jul 13 Javascript
详解ES6 扩展运算符的使用与注意事项
Nov 12 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防注入,表单提交值转义的实现详解
2013/06/10 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
php的array数组和使用实例简明教程(容易理解)
2014/03/20 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
JS OOP包机制,类创建的方法定义
2009/11/02 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
了解JavaScript中let语句
2019/05/30 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
详解element上传组件before-remove钩子问题解决
2020/04/08 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
Python实现的中国剩余定理算法示例
2017/08/05 Python
Python连接字符串过程详解
2020/01/06 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
化学实验员岗位职责
2013/12/28 职场文书
九年级化学教学反思
2014/01/28 职场文书
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
公安机关纪律作风整顿剖析
2014/10/10 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
离职感谢信怎么写
2015/01/22 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript