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


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中的location用法简单介绍
Mar 07 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
Jan 11 Javascript
jqplot通过ajax动态画折线图的方法及思路
Dec 08 Javascript
jQuery实现Tab选项卡切换效果简单演示
Nov 23 Javascript
JS获取鼠标坐标位置实例分析
Jan 20 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
Jul 28 Javascript
Angularjs 制作购物车功能实例代码
Sep 14 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
Sep 29 Javascript
详解Node.js串行化流程控制
May 04 Javascript
JavaScript调用模式与this关键字绑定的关系
Apr 21 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
May 12 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
Oct 31 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&amp;&amp;mysql)三
2006/10/09 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
php猜单词游戏
2015/09/29 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
javascript 写类方式之三
2009/07/05 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
微信小程序实现折线图的示例代码
2019/06/07 Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
2019/12/25 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
Python中常用操作字符串的函数与方法总结
2016/02/04 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
django执行原始查询sql,并返回Dict字典例子
2020/04/01 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
乌克兰网上珠宝商店:GoldSoveren
2020/03/31 全球购物
计算机开发个人求职信范文
2013/09/26 职场文书
韩语专业本科生求职信
2013/10/01 职场文书
办公室内勤岗位职责范本
2013/12/09 职场文书
高中历史教学反思
2014/02/08 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
学校端午节活动方案
2014/08/23 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
医院病假条怎么写
2015/08/17 职场文书