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


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 相关文章推荐
动态改变textbox的宽高的js
Oct 26 Javascript
js调用flash的效果代码
Apr 26 Javascript
jQuery 自动增长的文本输入框实现代码
Apr 02 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
May 07 Javascript
Javascript 颜色渐变效果的实现代码
Oct 01 Javascript
JavaScript检查某个function是否是原生代码的方法
Aug 20 Javascript
jQuery中fadeOut()方法用法实例
Dec 24 Javascript
jQuery实现图片向左向右切换效果的简单实例
May 18 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
Jul 20 Javascript
js实现简单选项卡功能
Mar 23 Javascript
对angularJs中$sce服务安全显示html文本的实例
Sep 30 Javascript
vue实现微信分享功能
Nov 28 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 XML操作类DOMDocument
2009/12/16 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
php实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
javascript用函数实现对象的方法
2015/05/14 Javascript
jquery siblings获取同辈元素用法实例分析
2016/07/25 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
Vue非父子组件通信详解
2017/06/12 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
Nest.js散列与加密实例详解
2021/02/24 Javascript
python+POP3实现批量下载邮件附件
2018/06/19 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
Python中itertools的用法详解
2020/02/07 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
python 实现IP子网计算
2021/02/18 Python
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
英语一分钟演讲稿
2014/04/29 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
学校宣传标语
2014/06/18 职场文书
匿名检举信范文
2015/03/02 职场文书
爱的教育读书笔记
2015/06/26 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
Python Flask实现进度条
2022/05/11 Python