微信小程序用户授权最佳实践指南


Posted in Javascript onMay 08, 2021

前言

开发微信小程序中,经常会用到获取一些用户权限的页面,比如你要登录,就要获取个人信息、你要做人脸识别,就要获取相机权限、你要做位置地图功能、就要获取用户的位置权限,你要将图片保存在用户的相册,需要获取相册权限等等

微信的 scope 流程:

微信小程序用户授权最佳实践指南

大多数功能都是没有授权不可用的,一般我会检测是否开启权限,然后如果开启了就继续使用,没开启就给出提示继续请求授权..如果还是拒绝 就给出提示 然后让用户手动去设置页打开...

#正常逻辑

但是这一套写下来可能就是这样的:

wx.getSetting({
    success(res)=>{
        if (!res.authSetting['scope']) {
          console.log('未授权')
              wx.authorize({
                scope: 'scope',
                success() {
                    console.log('授权成功')
                },
                fail() {
                    console.log('授权失败,让用户手动授权')
                    wx.showModal({
                        title: '温馨提示',
                        content: '未打开xxx权限',
                        showCancel: false,
                        success(res) {
                        if (res.confirm) {
                            console.log('用户点击确定')
                            wx.openSetting({
                                success(res) {
                                    console.log(res.authSetting)
                                    res.authSetting = {
                                    "scope.camera": true,
                                    }
                                }
                            })
                        } else if (res.cancel) {
                            console.log('用户点击取消')
                        }
                        }
                  })
                }
             })
        } else {
          console.log('已授权')
        }
    },
    fail(err)=>{}
})

现在都 1202 年了,这一套写下来,再掺杂着业务逻辑,那真的是惨不忍睹~

我是受不了,花了点时间封装了个函数,只需传入指定的权限名称,就能检测用户是否开启权限,没有开启,会提示,提示还不开就去设置页手动打开(总之必须打开)。

本来想写个代码片段,后来发现工具上在调用 openSetting 时有问题,只好放弃。

#代码细节

// utils/auth.js

/**
 * @param {
 * authType: 授权类型
 * }
 */

module.exports = async function wxAuth(authType) {
  // scopeArr ref: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html
  let scopeArr = [
    "userInfo",
    "userLocation",
    "userLocationBackground",
    "address",
    "invoiceTitle",
    "invoice",
    "werun",
    "record",
    "writePhotosAlbum",
    "camera",
  ];
  if (scopeArr.indexOf(authType) == -1) {
    return console.error("请输入正确的授权类型");
  }
  let scope = "scope." + authType;
  let isUserSet = await getSettingSync(scope);
  if (isUserSet) return true;
  let isAuthorize = await authorizeSync(scope);
  if (isAuthorize) return true;
  let showModalMes = await showModalSync(scope);
  // 弹框提示去授权
  if (showModalMes) {
    // 去手动授权
    let openSet = await openSettingSync(scope);
    if (openSet) {
      return true;
    } else {
      return false;
    }
  } else {
    // 拒绝授权
    return false;
  }
};

// 判断用户是否开启该授权
function getSettingSync(scope) {
  return new Promise((resolve, reject) => {
    wx.getSetting({
      success(res) {
        if (!res.authSetting[scope]) {
          console.log("未授权");
          resolve(false);
        } else {
          console.log("已授权");
          resolve(true);
        }
      },
      fail(err) {
        reject();
        console.error("wx.getSetting Error", err);
      },
    });
  });
}
// 请求用户授权
function authorizeSync(scope) {
  return new Promise((resolve, reject) => {
    wx.authorize({
      scope: scope,
      success() {
        resolve(true);
        console.log("授权成功");
      },
      fail() {
        resolve(false);
        console.log("授权失败");
      },
    });
  });
}
// 弹框提示用户手动授权
function showModalSync(scope) {
  return new Promise((resolve, reject) => {
    wx.showModal({
      title: "提示",
      content: `为了更好的用户体验,请您授权 ${scope} 功能`,
      confirmText: "去授权",
      showCancel: false,
      success(res) {
        if (res.confirm) {
          console.log("点击确认");
          resolve(true);
        } else if (res.cancel) {
          resolve(false);
        }
      },
      fail(err) {
        reject();
        console.error(err, "wx.showModal Error");
      },
    });
  });
}
// 调起客户端小程序设置界面,返回用户设置的操作结果
function openSettingSync(scope) {
  return new Promise((resolve, reject) => {
    wx.openSetting({
      success(res) {
        console.log(res.authSetting);
        if (res.authSetting[scope]) {
          resolve(true);
        } else {
          resolve(false);
        }
      },
      fail(err) {
        reject();
        console.error(err, "wx.openSetting Error");
      },
    });
  });
}

#使用

JS 代码参考:

import auth from './../../utils/auth'
Page({
   data:{
     isCameraAuth: false
   },
   onLoad(){
         // 授权代码
    auth('camera').then(() => {
      console.log('授权成功')
      this.setData({
        isCameraAuth: true
      }
    }).catch((err) => {
      console.error('授权失败');
    })
   }
})

wxml 代码参考:

<!-- index.wxml -->
<view>是否授权:{{isCameraAuth}}</view>
<camera wx:if="{{isCameraAuth}}" style="width: 100%; height: 300px;"></camera>

#预览

为此,我制作了一个 Demo,点击Demo 预览 ,即可在开发工具中直接打开预览。

总结

到此这篇关于微信小程序用户授权最佳实践的文章就介绍到这了,更多相关微信小程序用户授权内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript写的一个链表实现代码
Oct 25 Javascript
JavaScript 面向对象的 私有成员和公开成员
May 13 Javascript
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
Jul 09 Javascript
javascript 获取图片尺寸及放大图片
Sep 04 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
Nov 08 Javascript
浅谈javascript中字符串String与数组Array
Dec 31 Javascript
JavaScript实现表格点击排序的方法
May 11 Javascript
jQuery控制控件文本的长度的操作方法
Dec 05 Javascript
利用js判断手机是否安装某个app的多种方案
Feb 13 Javascript
轻量级JS Cookie插件js-cookie的使用方法
Mar 22 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
Nov 27 jQuery
nginx部署多个vue项目的方法示例
Sep 06 Javascript
vue完美实现el-table列宽自适应
详解JS WebSocket断开原因和心跳机制
May 07 #Javascript
如何用threejs实现实时多边形折射
详解JS ES6编码规范
May 07 #Javascript
html5中sharedWorker实现多页面通信的示例代码
May 07 #Javascript
详解如何使用Node.js实现热重载页面
May 06 #Javascript
关于Vue Router的10条高级技巧总结
May 06 #Vue.js
You might like
php sprintf()函数让你的sql操作更安全
2008/07/23 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
一个报数游戏js版(约瑟夫环问题)
2010/08/05 Javascript
js取滚动条的尺寸的函数代码
2011/11/30 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
2014/10/17 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
2015/08/31 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
详解几十行代码实现一个vue的状态管理
2019/01/28 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
Python数据类型详解(一)字符串
2016/05/08 Python
Python 打印中文字符的三种方法
2018/08/14 Python
python读取各种文件数据方法解析
2018/12/29 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
广州盈通面试题
2015/12/05 面试题
大二自我鉴定范文
2013/10/05 职场文书
会计毕业生自荐信
2013/11/21 职场文书
创建文明城市标语
2014/06/16 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
结婚堵门保证书
2015/05/08 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
Python list列表删除元素的4种方法
2021/11/01 Python
浅谈Node的内存泄露问题
2022/05/06 NodeJs