微信小程序用户授权、位置授权及获取微信绑定手机号


Posted in Javascript onJuly 18, 2019

1.位置授权

位置授权相对简单,可以直接调用方法wx.getLocation()就可以弹出授权框,

在调用前需要在app.json中设置用途说明

Page({
"permission": {
 "scope.userLocation": {
 "desc": "你的位置信息将用于xxx"
 }
 }
})

授权框

微信小程序用户授权、位置授权及获取微信绑定手机号

但是存在不少用户会拒绝授权,如果拒绝授权就不会再弹窗,而是直接进入接口 fail 回调,就要手动授权,我们可以通过自定义弹窗来诱导用户授权。我这里用的是wx.showMoadl确认框。

确认框

微信小程序用户授权、位置授权及获取微信绑定手机号

如果确认就调用wx.opensetting调出授权设置页面

wx.showModal({
   title: '提醒',
   content: '您拒绝了位置授权,将无法使用大部分功能,点击确定重新获取授权',
   success(res) {
   //如果点击确定
   if (res.confirm) {
    wx.openSetting({ //打开设置页
    success(res) { //成功,返回页面回调
     //如果同意了位置授权则userLocation=true
     if (res.authSetting["scope.userLocation"]) { //授权中如果有位置授权则执行逻辑
     /*你的代码*/
     }
    }
    })
   }
   }
  })

授权设置页

微信小程序用户授权、位置授权及获取微信绑定手机号

完整代码

wx.getLocation({
  success: function(res) {
  app.globalData.lat = res.latitude;
  app.globalData.lon = res.longitude;
  },
  fail() {
  wx.showModal({
   title: '提醒',
   content: '您拒绝了位置授权,将无法使用大部分功能,点击确定重新获取授权',
   success(res) {
   //如果点击确定
   if (res.confirm) {
    wx.openSetting({
    success(res) {
     //如果同意了位置授权则userLocation=true
     if (res.authSetting["scope.userLocation"]) {
     that.onLoad()
     }
    }
    })
   }
   }
  })
  }
 })

2.用户信息授权

用户授权步骤相对会复杂一点,因为现在获取wx.getUserInfo 接口后续将不再出现授权弹窗。需要手动点击去授权,所以也是需要诱导用户去点击按钮。

<button open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">确认</button>

open-type 我用到了两种

  • getUserInfo 获取用户信息,可以从bindgetuserinfo回调中获取到用户信息
  • getPhoneNumber 获取用户手机号,可以从bindgetphonenumber回调中获取到用户信息(下面有)

注意:这里必须是button组件才能触发

这里我将他封装成了一个模拟的弹出框(样式丑陋,自己修改),wxss就不发出来了

模拟弹出框

微信小程序用户授权、位置授权及获取微信绑定手机号

<!-- wxml -->
<view class='getInfo' wx:if="{{haveInfo}}">
 <view class='content'>
 <view class='text'>我们需要获取您的授权信息</view>
 <view class='btn_block'>
  <button class='btn1' bindtap='no'>拒绝</button>
  <button class='btn2' open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">确认</button>
 </view>
 </view>
</view>

调用bindUserInfo,如果e.detail.userInfo存在,则说明授权成功

bindGetUserInfo(e) {
 //用户点击允许授权
 if (e.detail.userInfo) {
  //业务逻辑
 }

授权成功后即可再调用wx.getUserInfo(),就可以获得用户信息

完整代码

bindGetUserInfo(e) {
 //用户点击允许授权
 if (e.detail.userInfo) {
  this.setData({
  haveInfo: false
  })
  // 获取用户信息
  wx.getSetting({
  success: res => {
   if (res.authSetting['scope.userInfo']) {
   wx.getUserInfo({
    success: res => {
    app.globalData.userInfo = res.userInfo
    //业务代码
    }
   })
   }
  }
  })
 }
 }

3.获取用户手机授权

用户手机授权也是需要诱导用户去点击按钮触发的授权框,所以也是要自定义。

和获取用户信息的自定义框不同的是按钮属性

<button class='btn2' open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">确认</button>

bindgetphonenumber函数调用成功会返回三个值:

  • encryptedData:包括敏感数据在内的完整用户信息的加密数据,详细见加密数据解密算法
  • iv:加密算法的初始向量,详细见加密数据解密算法
  • cloudID:敏感数据对应的云 ID,开通云开发的小程序才会返回,可通过云调用直接获取开放数据,详细见云调用直接获取开放数据

其中我用到的是encryptedData、iv,将这两个发给后端去解码,可以获得三个值(写入数据库就交给后端了,就不用再多个步骤)

  • phoneNumber:用户绑定的手机号(国外手机号会有区号)
  • purePhoneNumber:没有区号的手机号
  • countryCode:区号

如果获取成功才会返回三个值,失败则不会,所以我们判断是否授权获取手机可以直接用那三个值判断

我的代码↓

//获取用户手机
 getPhoneNumber(e) {
 if (e.detail.encryptedData) {
  this.setData({
  havePhone: false
  })
  wx.request({
  url: app.globalData.url + 'xiao_bindphone',
  method: 'POST',
  header: {
   "Content-Type": "application/x-www-form-urlencoded"
  },
  data: {
   user_id: app.globalData.user_id,
   sessionKey: app.globalData.sessionKey,
   encryptedData: e.detail.encryptedData,
   iv: e.detail.iv
  },
  success(res) {
   //业务代码
  }
  })
 }
 },

三个授权就写到这啦,下面写下我的流程和逻辑

————————————————————————————————

如果是新用户进入小程序的话,提交code到后端,后端在数据库创建新的用户,此时的新用户数据只有少量数据的(如后端自己创建的id),所以我们需要将能获取到的值传给后端完善数据库。

一、判断数据库中此用户是否有头像和名称,没有则需要授权用户数据(传头像和名称),将得到的头像和名称传到后端完善数据库,此时需要用到用户信息的授权,即wx.getUserInfo。

二、判断数据库中此用户是否有手机号,没有则调用获取手机号授权,即getPhoneNumber。

三、关于位置授权是项目需要,可调用wx.getLocation。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
总结AJAX相关JS代码片段和浏览器模型
Aug 15 Javascript
深入理解Javascript闭包 新手版
Dec 28 Javascript
JavaScript常用全局属性与方法记录积累
Jul 03 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
Dec 29 Javascript
JS 作用域与作用域链详解
Apr 07 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
Jul 22 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
Aug 11 Javascript
angularjs 源码解析之scope
Aug 22 Javascript
详解Javascript数据类型的转换规则
Dec 12 Javascript
vuejs父子组件通信的问题
Jan 11 Javascript
JavaScript事件发布/订阅模式原理与用法分析
Aug 21 Javascript
详解JavaScript 的执行机制
Sep 18 Javascript
EasyUI 数据表格datagrid列自适应内容宽度的实现
Jul 18 #Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
Jul 18 #Javascript
jquery实现下载图片功能
Jul 18 #jQuery
jQuery实现图片下载代码
Jul 18 #jQuery
使用react context 实现vue插槽slot功能
Jul 18 #Javascript
jquery图片预览插件实现方法详解
Jul 18 #jQuery
vue使用自定义指令实现拖拽
Jan 29 #Javascript
You might like
php PDO中文乱码解决办法
2009/07/20 PHP
php的大小写敏感问题整理
2011/12/29 PHP
smarty模板判断数组为空的方法
2015/06/10 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
JavaScript 10件让人费解的事情
2010/02/15 Javascript
jquery indexOf使用方法
2013/08/19 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python设计模式之门面模式简单示例
2018/01/09 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
2018/10/17 Python
Python中作用域的深入讲解
2018/12/10 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
美国最大网上鞋店:Zappos
2016/07/25 全球购物
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
全球地下的服装和态度:Slam Jam
2018/02/04 全球购物
人民调解员先进事迹材料
2014/05/08 职场文书
新郎婚礼致辞
2015/07/27 职场文书
创业计划书之熟食店
2019/10/16 职场文书
Go语言实现Base64、Base58编码与解码
2021/07/26 Golang
MySQL约束超详解
2021/09/04 MySQL
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫
「约定的梦幻岛」作画发布诺曼生日新绘
2022/03/21 日漫
分享几个实用的CSS代码块
2022/06/10 HTML / CSS