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


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 相关文章推荐
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
Dec 22 Javascript
js获取当前月的第一天和最后一天的小例子
Nov 18 Javascript
Javascript实现滚动图片新闻的实例代码
Nov 27 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
Jan 08 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
Jan 13 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
Jan 31 Javascript
JS实现的在线调色板实例(附demo源码下载)
Mar 01 Javascript
基于javascript实现图片切换效果
Apr 17 Javascript
Vue下的国际化处理方法
Dec 18 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
Nov 21 Javascript
JS开发 富文本编辑器TinyMCE详解
Jul 19 Javascript
国内常用的js类库大全(CDN公共库)
Jun 24 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中include()与require()的区别说明
2010/03/10 PHP
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
php中session定期自动清理的方法
2015/11/12 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
js 操作select和option常用代码整理
2012/12/13 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
详解vue.js组件化开发实践
2016/12/14 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
AngularJS页面传参的5种方式
2017/04/01 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
Python读取环境变量的方法和自定义类分享
2014/11/22 Python
Python中使用ElementTree解析XML示例
2015/06/02 Python
python取代netcat过程分析
2018/02/10 Python
python中的变量如何开辟内存
2018/06/26 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
python爬虫 urllib模块反爬虫机制UA详解
2019/08/20 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
标准导师推荐信(医学类)
2013/10/28 职场文书
业务代表的岗位职责
2013/11/16 职场文书
后勤主管工作职责
2013/12/07 职场文书
运动会解说词50字
2014/01/18 职场文书
四风问题自查报告剖析材料
2014/02/08 职场文书
《画风》教学反思
2014/04/16 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
实验室安全管理制度
2015/08/05 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书