【微信小程序】 权限接口梳理以及代码实现

news2025/1/16 15:46:19

1、权限接口说明

官方权限说明
  部分接口需要经过用户授权统一才能调用。我们把这些接口按使用范围分成多个scope,用户选择对scope进行授权,当授权给一个scope之后,其对应的所有接口都可以直接使用。

此类接口调用时:

  • 如果用户未接受或拒绝过此权限,会弹窗询问用户,用户点击同意后方可调用接口;
  • 如果用户已授权,可以直接调用接口;
  • 如果用户已拒绝授权,则不会出现弹窗,而是直接进入接口 fail 回调。请开发者兼容用户拒绝授权的场景。

获取用户授权设置
开发者可以使用 wx.getSetting 获取用户当前的授权状态。

打开设置界面
用户可以在小程序设置界面(「右上角」 - 「关于」 - 「右上角」 - 「设置」)中控制对该小程序的授权状态。

开发者可以调用 wx.openSetting 打开设置界面,引导用户开启授权。

提前发起授权请求
开发者可以使用 wx.authorize 在调用需授权 API 之前,提前向用户发起授权请求。

scope 列表
scope	对应接口	描述
scope.userInfo	wx.getUserInfo	用户信息
scope.userLocation	wx.getLocation	地理位置
scope.werun	wx.getWeRunData	微信运动步数
scope.writePhotosAlbum	wx.saveImageToPhotosAlbum	保存到相册
scope.WxFriendInteraction	对应开放数据域内的 wx.getFriendCloudStorage 、wx.getGroupCloudStorage 、wx.getGroupInfo 、wx.getPotentialFriendList 、wx.getUserCloudStorageKeys 、wx.getUserInfo 、GameServerManager.getFriendsStateData 接口,以及主域内的 wx.getUserInteractiveStorage 接口。	是否授权使用你的微信朋友信息

授权有效期
一旦用户明确同意或拒绝过授权,其授权关系会记录在后台,直到用户主动删除小程序。

最佳实践
在真正需要使用授权接口时,才向用户发起授权申请,并在授权申请中说明清楚要使用该功能的理由。

注意事项
wx.authorize({scope: “scope.userInfo”}),不会弹出授权窗口,请使用 wx.createUserInfoButton
需要授权 scope.userLocation 时必须配置地理位置用途说明。

2、具体权限接口介绍

2.1 wx.authorize()

官方说明 wx.authorize在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 wx.openSetting()

官方说明 wx.openSetting()
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 、权限申请方式

  • 通过 button 的 open-type 方式来获取相应的权限及信息。
  • 通过 wx.authorize()和wx.openSetting() 两个接口来申请相应的权限。
    特别注意的是:需要授权 scope.userLocation、scope.userLocationBackground 时必须配置地理位置用途说明

通过button申请权限

通过button获取权限对于开发者来说相对简单一些,开发者只需要绑定相应的回调函数即可,权限申请的成功和失败都可以在回调函数中处理。
其实我们可以把通过button申请权限的方式当作普通的信息获取接口,只不过这个接口必须通过button组件来调用而已。

通过wx.authorize()来申请权限

通过wx.authorize()来申请权限的方式是比较繁琐的。因为它的状态比较多,大致可分为:

  • 如果用户未接受或拒绝过此权限,会弹窗询问用户,用户点击同意后方可调用接口;
  • 如果用户已授权,可以直接调用接口;
  • 如果用户已拒绝授权,则不会出现弹窗,而是直接进入接口 fail 回调。请开发者兼容用户拒绝授权的场景

针对这三种状态,开发者的处理方式也有所不同。

  • 用户未接受或拒绝过此权限,会弹窗询问用户,用户点击同意 —— 可调用相应接口。

  • 用户未接受或拒绝过此权限,会弹窗询问用户,用户点击拒绝 —— 打开设置页面。

  • 如果用户已授权 —— 可调用相应接口。

  • 用户已拒绝授权 —— 打开设置页面。

    上述情况的2/4是需要开发者结合 wx.openSetting() 来帮助用户进行二次授权的。
    就是这个 openSetting 打开设置页面的过程让开发者比较抓狂。
    2.3.0 版本开始,用户发生点击行为后,才可以跳转打开设置页。
    也就是说 openSetting 只能通过 button 组件和点击(bindtap)的回调函数里来调用。
    然而我们在申请权限的时候无法保证用户一定会在第一次申请的时候同意,所以一定是需要配合openSetting来使用的。
    那我们在每个调用openSetting的地方都加一个button也是很不别扭的。
    当下来说我们最好的处理方案就是把wx.authorize()和wx.openSetting()结合起来使用,并把他们放在一个bindtap/catchtap(或其他手势事件)的回调函数里。
    接下来我们重点来整合一下这种方式的权限处理。

4、权限申请整合代码

4.1 参考工具类代码

以下是整合的工具类代码,我们暂时命名其为 authorizer.js,可直接复制使用。


const authsName = {
  "scope.userInfo": "用户信息",// 请用button获取该信息
  "scope.userLocation": "地理位置",
  "scope.userLocationBackground": "后台定位",
  "scope.address": "通讯地址",
  "scope.invoiceTitle": "发票抬头",
  "scope.invoice": "获取发票",
  "scope.werun": "微信运动步数",
  "scope.record": "录音功能",
  "scope.writePhotosAlbum": "保存到相册",
  "scope.camera": "摄像头",
}


var scope = null;
var success = null;
var fail = null;
var denyBack = null;
var deniedFun = null;

/**
 * 申请某个权限
 * _scope 权限名称
 * _success 成功回调
 * _fail 失败回调
 * _denyBack 申请权限时用户 拒绝 后的回调
 * _deniedFun 之前申请过该权限但被拒绝了,该情况下调用此函数
 */
function authorize(_scope, _success, _fail, _denyBack, _deniedFun) {

  resetData();

  scope = _scope;
  success = _success;
  fail = _fail;
  denyBack = _denyBack;
  deniedFun = _deniedFun;

  if (!scope) {
    return;
  }

  // 判断权限状态
  wx.getSetting({

    success: function(res) {

      let currentScope = res.authSetting[scope];

      if (currentScope == undefined || currentScope == null) {

        // 之前没有申请或该权限
        wx.authorize({
          scope: scope,
          success: function(res) {

            authSuccess(res);
          },

          fail: function(err) {

            authDeny();
          }
        });

      } else if (currentScope == false) {

        // 之前申请过该权限但被拒绝了, 如果配置 deniedFun 函数,则有执行 deniedFun 方法,
        // 由调用者决定改中情况下如何处理。
        if (authDenied()) {
          return;
        }

        // 如果没有配置 deniedFun 函数,走默认逻辑,打开设置界面
        wx.showModal({
          title: '权限申请',
          content: '点击 “确定” 按钮,打开 “' + authsName[scope] + '” 的权限设置界面',
          cancelText: '取消',
          confirmText: '确定',
          success(res) {
            if (res.confirm) {

              wx.openSetting({
                success: function(res) {

                  let cScope = res.authSetting[scope];
                  if (cScope) {

                    authSuccess();
                  } else {

                    authFail();
                  }
                },

                fail: function(res) {

                  authFail();
                }
              });
            }
          }
        });

      } else {

        // 已经获得该权限
        authSuccess();
      }
    },

    fail: function() {

      authFail();
    }
  });
}



/**
 * 权限申请成功
 */
function authSuccess(res) {

  if (success && typeof success == 'function') {
    success(res);
  }

  resetData();
}

/**
 * 权限申请失败
 */
function authFail() {

  if (fail && typeof fail == 'function') {
    fail();
  }

  resetData();
}

/**
 * 拒绝使用该权限
 */
function authDeny() {

  if (denyBack && typeof denyBack == 'function') {
    denyBack();
  }

  resetData();
}


/**
 * 之前申请过该权限但被拒绝了
 */
function authDenied() {

  if (deniedFun && typeof deniedFun == 'function') {
    deniedFun();
    resetData();
    return true;
  } else {
    return false;
  }
}

/**
 * 重置参数
 */
function resetData() {

  scope = null;
  success = null;
  fail = null;
  denyBack = null;
  deniedFun = null;
}


module.exports = {
  authorize: authorize,
}

工具类的使用
wxml代码:

 <view bindtap="authApply">权限申请</view>

js代码:

/**
 * 权限申请--微信步数
 */
authApply(e) {
  authorizer.authorize("scope.werun", function(res) {
    console.log('success', res);
    wx.getWeRunData({success: function(res){
      console.log('WeRunData', res)
    }});
  }, function(err) {
    console.log('denyback', err);
  }, function(err) {
    console.log('deniedBack', err);
  });
},

4.2 实际代码实现

data:{
authScope:"scope.werun",//要申请的权限
    },
  /**
   * 申请权限
   * _scope 权限名称
   * _authSuccess 成功回调
   * _authFail 失败回调
   * _authDeny 申请权限时用户 拒绝 后的回调
   * _authDenied 之前申请过该权限但被拒绝了,该情况下调用此函数
   */

 //授权成功
  authSuccess(){
      let that = this
      console.log("授权成功")
      that.setData({
          hasWerun:true
      })
      that.getUserRun()
  },

  //授权失败
  authFail(){
      console.log("授权失败")
      wx.showToast({
          title: '授权失败',
          icon: 'none',
          duration: 1000
      })
  },
  //拒绝授权
authDeny(){
      console.log("authorize调用失败,引导重新吊起")
      wx.showToast({
          title: '您未授权微信运动 请点击右上角设置 进入列表手动授权',
          icon: 'none',
          duration: 3000
      })
  }, 
  //已被拒绝授权过的权限,重新吊起
authDenied(){
      console.log("currentScope == false 已被拒绝授权过的权限,引导重新吊起")
      wx.showToast({
          title: '您未授权微信运动 请点击右上角设置 进入列表重新授权',
          icon: 'none',
          duration: 3000
      })
  },

  authApply:function(){
      let that = this
      let scope = that.data.authScope
      if (!scope) {
        return;
      }
      // 判断权限状态
      wx.getSetting({
        success: function(res) {
          console.log("当前权限列表")
          console.log(res)
          let currentScope = res.authSetting[scope];
          if (currentScope == undefined || currentScope == null) {
            // 之前没有申请或该权限
            console.log("之前没有申请或该权限")
            wx.authorize({
              scope: scope,
              success: function() {
                that.authSuccess();
              },
              fail: function(err) {
                that.authDeny();
              }
            });
          } else if (currentScope == false) {
            // 之前申请过该权限但被拒绝了
              that.authDenied()
              return;
          } else {
            // 已经获得该权限
            that.authSuccess();
          }
        },
        fail: function() {
          that.authFail();
        }
      });
  },
  //设置按钮绑定权限列表  
  getOpenSetting: function () {
      let that = this
      wx.openSetting({
      success(res) {
          if (res.authSetting[that.data.authScope]) {
          // 用户在设置页面开启权限后,重新授权成功
          // 可以调用相应的 API 接口
          that.setData({
              hasWerun:true
          })
          console.log("openSetting已获取到授权")
          that.authSuccess()
          } else {
          // 用户在设置页面未开启权限,授权失败
          that.authFail()
          }
      },
      fail() {
          console.log("openSetting拉起失败")
          // 调用 wx.openSetting 接口失败
          that.authFail()
      }
      })
  }, 

wxml

 <text class="info-text" bindtap="getOpenSetting">权限</text>

总结

微信小程序的权限申请有两种方式;
分析了一下wx.authorize这种方式发生的几种情况以及相应的处理;
整理了一份wx.authorize使用的通用方法,且此方法须在某个手势事件的回调函数中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小红书报告:2023美妆个护白皮书解读

导语 面对风云变幻的市场&#xff0c;消费行业始终是增长的重要引擎之一&#xff0c;其中美妆个护行业在过去六年里&#xff08;2016-2022年&#xff09;仍保持高增速与消费潜力 。 新的一年&#xff0c;市场呈现什么新变化&#xff0c;品牌又有哪些新动作&#xff1f;本期为…

20-HTML

目录 1.概念 2.创建HTML页面 3.运行HTML程序 4.HTML结构 4.1.HTML文件基本结构 4.2.标签层次结构 PS&#xff1a;开发者工具简单介绍 PS&#xff1a;快速生成代码框架&#xff1a; 5.HTML常见标签 5.1.注释标签 5.2.标题标签&#xff1a;h1 - h6 5.3.段落标签&…

Doris(8):数据导入(Load)之Insert Into

Insert Into 语句的使用方式和 MySQL 等数据库中 Insert Into 语句的使用方式类似。但在 Doris 中&#xff0c;所有的数据写入都是一个独立的导入作业。所以这里将 Insert Into 也作为一种导入方式介绍。 主要的 Insert Into 命令包含以下两种&#xff1b; INSERT INTO tbl S…

PX4控制云台的两种方式

1、配置MNT_MODE_IN参数后重启飞控&#xff0c;释放出mount的设置参数 控制信号输入为RC 则接收机必须连接对应的通道至AUX辅助通道&#xff0c;并通过MNT_MAN_*参数设置pitch/roll/yaw对应的AUX通道 &#xff08;遥控器摇杆 → 接收机通道输出 → 飞控AUX通道输入 → AUX通道…

Spring IOC 入门简介【自定义容器实例】

目录 前言 Spring简介 Spring体系结构 一、IOC控制反转思想 二、IOC自定义对象容器 1. 创建实体类&#xff0c;Dao接口&#xff0c;实现类 2. 创建配置文件bean.properties 3. 创建容器管理类 4. 创建StudentService类 5. 测试方法 6. 测试结果 前言 Spring简介 Spr…

Android 详解基本布局以及ListView和RecyclerView

前言 一个丰富的界面有很多个控件组成&#xff0c;那么就需要布局来实现控件有条不紊的摆放。 一 LinearLayout 线性布局 LinearLayout 又称作线性布局&#xff0c;是一种常用的布局。有横向和竖向两个方向。 通过下面的属性进行设置 android:orientation"vertical"…

【科研】Michaelis–Menten 曲线(米氏曲线)中反应速率的计算

参考文献&#xff1a;Standardized assays for determining the catalytic activity and kinetics of peroxidase-like nanozymes | Nature Protocols SCI-Hub链接&#xff1a; https://sci-hub.se/10.1038/s41596-018-0001-1 科研需要&#xff0c;需要绘制所制备纳米酶的Mi…

亿发软件:中小企业定制一体化管理解决方案,全面提升数据价值

亿发软件&#xff1a;中小企业定制一体化管理解决方案&#xff0c;全面提升数据价值 一体化信息管理系统是为中小企业提供简化运营、提高效率和生产力的工具。随着经济的快速发展&#xff0c;企业细分管理的多样化需求显著增加。很多企业都在为找不到适合自己的一体化信息管理…

一文看懂数据云平台的“可观测性”技术实践

背景 这是一家大型制造集团。为监控及预测工厂设备运行情况&#xff0c;IT部门在数据云平台DataSimba上按天执行数据作业&#xff0c;每24小时对工厂设备的日志数据进行分析&#xff0c;发现能对业务起到很好的辅助作用&#xff0c;效果不错。 “要不升级为每1个小时跑一次&am…

android hook(Toast BadTokenException案例)

什么是Hook? hook 技术又叫做钩子函数&#xff0c;在系统没有调用该函数之前&#xff0c;钩子程序先捕捉该消息&#xff0c;钩子函数先得到控制权&#xff0c;这时钩子函数即可以加工处理&#xff08;改变&#xff09;该函数的执行行为&#xff0c;还可以强制结束消息的传递。…

(详细)HTTP协议(应用层重点协议)

目录 一、HTTP协议工作过程 二、 协议格式 1、抓包工具Fiddler 2、HTTP请求格式 3、HTTP响应格式 4、HTTP协议格式总结 三、HTTP请求&#xff08;Request&#xff09; 1、URL &#xff08;1&#xff09;URL基本格式 &#xff08;2&#xff09;URL实例 &#xff08;…

什么是伪原创?SEO伪原创该怎么做

伪原创是指在原有的文章或内容基础上进行修改或调整&#xff0c;以产生看起来是全新内容的文章&#xff0c;但实际上并没有创造新的价值。多数情况下&#xff0c;伪原创的目的是为了在文章相对原创的情况下&#xff0c;提高搜索引擎的排名。 一、高质量伪原创 做好伪原创&#…

SpringCloud消息总线——Bus

Bus 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 在SpringCloud Config学习过程中&#xff0c;还遗留下来一个问题&#xff1a;当运维更新git上的配置信息时&#xff0c;要想更改所有的客户端服务&#xff0c;必须得手动给客户端服务发送post请…

ESP32学习笔记14-mqtt-连接官方mqtt,onenet,thingsboard物联网平台

12.MQTT 12.0工程里的WiFi密码和ssid设置 工程的WiFi配置 ssid password 打开配置 配置ssid和密码 工程配置文件sdkconfig IP和端口配置 乐鑫服务器mqtt 12.1数据结构和配置函

力扣sql中等篇练习(四)

力扣sql中等篇练习(四) 1 游戏玩法分析IV 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 首次登录后第二天登录的玩家数量/玩家总数量(去重) # 注意首日注册指的是表中的最早的一个日期 SELECT ROUND((SELECT count(distinct t1.player_id)FRO…

给孩子买台灯什么牌子好?盘点学生专用台灯第一品牌

现在的孩子近视率很高&#xff0c;双减政策的执行&#xff0c;也有导致许多孩子长时间接触电子产品&#xff0c;没有正确的看书姿势&#xff0c;合理的用眼距离等&#xff0c;使用专业的护眼台灯&#xff0c;能让孩子眼睛拥有一个好的视力。 要注意养成预防近视好习惯&#xf…

dsp28335杂记3

文章目录 DAC实验&#xff0c;SPITLV5620DACADC0实验-------niceDMAADC实验&#xff08;外设到存储器&#xff09; 中断 了解皮毛&#xff0c;嘿嘿内置XINTF接口配置 外扩SRAM DMA支持 了解皮毛&#xff0c;嘿嘿eCAP脉冲捕获&#xff0c;重点啦eCAP输出PWM&#xff08;APWM模…

【学习笔记】从MySQL快速入门 PostgreSQL

PGSQL 菜鸟教程/在线api文档 数据类型语法 DML条件 高级 一、数据类型 数值类型&#xff1a;和mysql类似&#xff0c;叫法不同 特殊&#xff1a;serial 自增整数 名字存储长度描述范围smallint2 字节小范围整数-32768 到 32767integer4 字节常用的整数-2147483648 到 21474…

C++——入门讲解(3)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年4月19日 内容&#xff1a;C入门内容讲解 目录 前言&#xff1a; 1. 引用&#xff08;续&#xff09;&#xff1a; 1.输出型参数&#xff1a; 2.传引用返回&#xff1a; 2.常引用&#xff1a; 3.auto&#xff1a; 结…

Android安全性:保护你的应用和用户数据

Android安全性&#xff1a;保护你的应用和用户数据 引言 在移动应用开发领域&#xff0c;Android系统占据着主导地位&#xff0c;随着智能手机的广泛普及和移动应用的快速发展&#xff0c;越来越多的开发者投入到Android应用的开发中。然而&#xff0c;随着Android应用的数量不…