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


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 相关文章推荐
代码精简的可以实现元素圆角的js函数
Jul 21 Javascript
jquery CSS选择器笔记
Mar 29 Javascript
javascript利用控件对windows的操作实现原理与应用
Dec 23 Javascript
JQuery中对Select的option项的添加、删除、取值
Aug 25 Javascript
使用JQuery库提供的扩展功能实现自定义方法
Sep 09 Javascript
Angularjs基础知识及示例汇总
Jan 22 Javascript
jquery实现一个简单的表单验证实例
Mar 30 Javascript
实现JavaScript的组成----BOM和DOM详解
May 18 Javascript
使用jquery给新生的th绑定hover事件的实例
Feb 10 Javascript
ES6新特性之函数的扩展实例详解
Apr 01 Javascript
微信小程序实现折叠面板
Jan 31 Javascript
Vuex实现计数器以及列表展示效果
Mar 10 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获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
JavaScript 解析Json字符串的性能比较分析代码
2009/12/16 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
jQuery插件datalist实现很好看的input下拉列表
2015/07/14 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
微信小程序纯文本实现@功能
2020/04/08 Javascript
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
python基于递归解决背包问题详解
2019/07/03 Python
python多线程与多进程及其区别详解
2019/08/08 Python
python实现多线程端口扫描
2019/08/31 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
Foot Locker意大利官网:全球领先的运动鞋和服装零售商
2017/05/30 全球购物
10条PHP编程习惯
2014/05/26 面试题
高中自我鉴定
2013/12/20 职场文书
便利店投资的创业计划书
2014/01/12 职场文书
致200米运动员广播稿
2014/02/06 职场文书
教师一岗双责责任书
2014/04/16 职场文书
小学生演讲稿大全
2014/04/25 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
会计人员岗位职责
2015/02/03 职场文书
公司搬迁通知
2015/04/20 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
python实现过滤敏感词
2021/05/08 Python
JS实现数组去重的11种方法总结
2022/04/04 Javascript