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


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 Demo模态窗口
Dec 06 Javascript
关于全局变量和局部变量的那些事
Jan 11 Javascript
JS获取当前日期和时间的简单实例
Nov 19 Javascript
Jquery选择器中使用变量实现动态选择例子
Jul 25 Javascript
jQuery validate插件实现ajax验证重复的2种方法
Jan 22 Javascript
基于javascript实现图片滑动效果
May 07 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
May 17 Javascript
Bootstrap3 多选和单选框(checkbox)
Dec 29 Javascript
对于input 框限定输入值为浮点型的js代码
Sep 25 Javascript
vue中promise的使用及异步请求数据的方法
Nov 08 Javascript
node爬取新型冠状病毒的疫情实时动态
Feb 06 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
Mar 11 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初学者头疼问题总结
2006/07/08 PHP
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
PHP开发需要注意的安全问题
2010/09/01 PHP
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
PHP捕获Fatal error错误的方法
2014/06/11 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
window.opener用法和用途实例介绍
2013/08/19 Javascript
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
ES6 let和const定义变量与常量的应用实例分析
2019/06/27 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
Vue程序化的事件监听器(实例方案详解)
2020/01/07 Javascript
Python实现公历(阳历)转农历(阴历)的方法示例
2017/08/22 Python
python利用sklearn包编写决策树源代码
2017/12/21 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
对Python信号处理模块signal详解
2019/01/09 Python
python-sys.stdout作为默认函数参数的实现
2020/02/21 Python
详解python如何引用包package
2020/06/07 Python
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
银行求职信个人范文
2013/12/16 职场文书
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
Python turtle编写简单的球类小游戏
2022/03/31 Python
js判断两个数组相等的5种方法
2022/05/06 Javascript