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


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动态创建div
Sep 25 Javascript
javascript获取当前ip的代码
May 10 Javascript
JS获取dom 对象 ajax操作 读写cookie函数
Nov 18 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
Sep 21 Javascript
原生javascript实现图片无缝滚动效果
Feb 12 Javascript
Node.js Express 框架 POST方法详解
Jan 23 Javascript
vue页面加载闪烁问题的解决方法
Mar 28 Javascript
vue.js删除列表中的一行
Jun 30 Javascript
JavaScript使用类似break机制中断forEach循环的方法
Nov 13 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
Dec 10 Javascript
Vue watch响应数据实现方法解析
Jul 10 Javascript
使用react+redux实现计数器功能及遇到问题
Jun 02 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
星际争霸任务指南——人族
2020/03/04 星际争霸
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
PHP利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
php文件上传类的分享
2017/07/06 PHP
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
javascript表单验证大全
2015/08/12 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
python range()函数取反序遍历sequence的方法
2018/06/25 Python
详解python和matlab的优势与区别
2019/06/28 Python
python面试题之列表声明实例分析
2019/07/08 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
python re的findall和finditer的区别详解
2020/11/15 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
Camille Jewelry官网:现代女性时尚首饰
2019/07/07 全球购物
药剂学专业应届生自荐信
2013/09/29 职场文书
英语专业个人求职信范文
2014/02/01 职场文书
环保公益广告语
2014/03/13 职场文书
学校班班通实施方案
2014/06/11 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
同学会感言
2015/07/30 职场文书
服务行业标语口号
2015/12/26 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
go goroutine 怎样进行错误处理
2021/07/16 Golang
SpringBoot2零基础到精通之数据库专项精讲
2022/03/22 Java/Android
Golang 入门 之url 包
2022/05/04 Golang