微信小程序隐私协议接入

2023-10-26

自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,微信要求,仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则后,方可调用微信提供的隐私接口。

相关公告见:关于小程序隐私保护指引设置的公告 | 微信开放社区

公告里已经介绍了相关流程,具体可以参考小程序隐私协议开发指南 | 微信开放文档。这里不再赘述。下面我们将着重谈一下代码实现。

触发式隐私协议

首先,我们要知道的一点是如果用户没有同意过隐私协议,调用某些API(具体参看:小程序用户隐私保护指引内容介绍 | 微信开放文档)是会触发隐私协议弹窗的,这种叫触发式隐私协议。如果用户同意,这个API调用还能继续执行,否则就会报失败。所以我们要做的是在这个时候,在当前页面弹出我们自定义的隐私协议alert,并且接收resolve。然后在用户同意和拒绝的时候调用这个resolve。具体代码如下:

// page.wxml
<view wx:if="{{showPrivacy}}">
  <view>隐私弹窗内容....</view>
  <button id="agree-btn" open-type="agreePrivacyAuthorization" bindagreeprivacyauthorization="handleAgreePrivacyAuthorization">同意</button>
</view>
// page.js
Page({
  data: {
    showPrivacy: false
  },
  onLoad() {
    wx.onNeedPrivacyAuthorization(resolve => {
      // 需要用户同意隐私授权时
      // 弹出开发者自定义的隐私授权弹窗
      this.setData({
        showPrivacy: true
      })
      this.resolvePrivacyAuthorization = resolve
    })

    wx.getUserProfile({
      success: console.log,
      fail: console.error
    })
  },
  handleAgreePrivacyAuthorization() {
    // 用户点击同意按钮后
    this.resolvePrivacyAuthorization({ buttonId: 'agree-btn', event: 'agree' })
    // 用户点击同意后,开发者调用 resolve({ buttonId: 'agree-btn', event: 'agree' })  告知平台用户已经同意,参数传同意按钮的id。为确保用户有同意的操作,基础库在 resolve 被调用后,会去检查对应的同意按钮有没有被点击过。检查通过后,相关隐私接口会继续调用
    // 用户点击拒绝后,开发者调用 resolve({ event:'disagree' }) 告知平台用户已经拒绝
  }
})

 这里同意的按钮必须使用系统提供的这个写法,需要指定一个id和回调方法。拒绝的按钮没有什么要求。这里务必要保存resolve,并且在同意和拒绝中调用它,否则触发隐私协议的API的成功和失败回调就不会走。这里有个问题,可能多个页面都有API会触发,但是onNeedPrivacyAuthorization只能注册一个,前面注册的会被后面的覆盖。所以,如果把注册方法写在load里可能造成,页面回来的时候就不会触发了。因此建议这个注册放在show的时候注册。关于这个API的更多内容可以查看:wx.onNeedPrivacyAuthorization(function listener) | 微信开放文档

隐私协议的弹窗是我们自定义的,里面的文本建议根据官方的例子来写,要获取指引的名字,可以通过wx.getPrivacySetting这个API。点击指引前往查看隐私协议的页面,可以我们自己写,也可以用微信官方提供的页面,只需要调用接口wx.openPrivacyContract就行。注意,阅读隐私协议不是必须的,所以你可以强制要求用户前往阅读,也可以什么都不做。

主动式隐私协议

前面我们讲的触发式隐私协议,相对比较麻烦,要去找到这些敏感接口调用的页面,然后全都处理一下。还有一种是主动式隐私协议。主动式隐私协议,就是你在关键入口,主动弹出这个协议窗口,让用户去同意或者拒绝。这时候就没有resolve了。但是这样做有个问题,如果用户点了同意,那么后续这些API都会调用成功,用户和开发者都很高兴。但是万一用户拒绝,如果你没有注册onNeedPrivacyAuthorization并进行适当处理,那后续调用都会失败。这时候偷懒的做法是,用户拒绝后就退出小程序,但是这种做法体验不佳。我们应该尽量让用户能使用其他功能,毕竟这些涉及的API可能我们并不太关心,譬如说用户只是不能上传下载图片,而这些并非我们小程序的核心功能。

组件实现

从用户体验上来讲,对于使用相关API比较多的小程序,为了避免遗漏和一些特殊场景,建议在入口主动弹出隐私协议。对于用量较少的小程序,可以采用触发式隐私协议。无论我们采取何种做法,我们都将其封装为一个组件。

UI部分没有什么特别的,我们找个写好的,类似微信风格的实现:

 相关页面代码:

<view class="privacy" wx:if="{{showPrivacy}}">
    <view class="content">
        <view class="title">隐私保护指引</view>
        <view class="des">
            在使用当前小程序服务之前,请仔细阅读<text class="link" bind:tap="openPrivacyContract">{{privacyContractName}}</text>。如你同意{{privacyContractName}},请点击“同意”开始使用。
        </view>
        <view class="btns">
            <button class="item reject" bind:tap="refusePrivacy">拒绝</button>
            <button id="agree-btn" class="item agree" open-type="agreePrivacyAuthorization" bindagreeprivacyauthorization="handleAgreePrivacyAuthorization">同意</button>
        </view>
    </view>
</view>
.privacy {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background: rgba(0, 0, 0, .5);
  z-index: 9999999;
  display: flex;
  align-items: center;
  justify-content: center;
}

.content {
  width: 632rpx;
  padding: 48rpx;
  box-sizing: border-box;
  background: #fff;
  border-radius: 16rpx;
}

.content .title {
  text-align: center;
  color: #333;
  font-weight: bold;
  font-size: 32rpx;
}

.content .des {
  font-size: 26rpx;
  color: #666;
  margin-top: 40rpx;
  text-align: justify;
  line-height: 1.6;
}

.content .des .link {
  color: #07c160;
  text-decoration: underline;
}

.btns {
  margin-top: 48rpx;
  display: flex;
}

.btns .item {
  justify-content: space-between;
  width: 244rpx;
  height: 80rpx;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 16rpx;
  box-sizing: border-box;
  border: none;
}

.btns .reject {
  background: #f4f4f5;
  color: #909399;
}

.btns .agree {
  background: #07c160;
  color: #fff;
}

在组件实现里,我们声明了三个属性,forceShow用于主动式隐私协议,设置true的时候可以强制显示。false的时候,则组件显示由注册回调触发,是触发式隐式协议。forceRead控制用户是否需要强制阅读协议。exitOnRefuse指当用户拒绝的时候,是否需要强制退出小程序。我们在页面show的时候,注册隐私协议触发回调,调用getPrivacySetting获取协议的名称。这里用到了组件的pageLifetimes。后面就是实现打开协议,同意和拒绝的回调。同意和拒绝的回调里,我们要判断是否保存了resolve,有的话是触发式的,需要进行调用,调用完了立刻将其清空。因为我们能区分这两种隐私协议,因此我们在拒绝的时候,显示了不同的错误提示:对于主动式的,我们就说部分功能不可用。对于触发式的,我们就说该功能不可用。

完整的js代码如下:

Component({
  options: {
    pureDataPattern: /^_/ // 指定所有 _ 开头的数据字段为纯数据字段
  },
  /**
   * 组件的属性列表
   */
  properties: {
    forceShow: {
      type: Boolean,
      value: false
    },
    forceRead: {
      type: Boolean,
      value: false
    },
    exitOnRefuse: {
      type: Boolean,
      value: false
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    privacyContractName: '',
    showPrivacy: false,
    _isRead: false
  },
  /**
   * 组件的生命周期
   */
  pageLifetimes: {
    show() {
      const that = this
      wx.onNeedPrivacyAuthorization(resolve => {
        that.resolvePrivacyAuthorization = resolve
        that.setData({
          showPrivacy: true
        })
      })
      wx.getPrivacySetting({
        success(res) {
          that.setData({
            privacyContractName: res.privacyContractName,
            //仅在需要授权的时候才显示,处理多个tab切换每个页面都显示的问题
            showPrivacy: that.data.forceShow && res.needAuthorization
          })
        }
      })
    }
  },
  /**
   * 组件的方法列表
   */
  methods: {
    // 打开隐私协议页面
    openPrivacyContract() {
      const that = this
      wx.openPrivacyContract({
        success: () => {
          that.setData({
            _isRead: true
          })
        },
        fail: () => {
          wx.showToast({
            title: '指引打开失败',
            icon: 'error'
          })
        }
      })
    },
    // 拒绝隐私协议
    refusePrivacy() {
      if(this.data.exitOnRefuse){
        // 直接退出小程序
        wx.exitMiniProgram()
        return
      }
      let tips = ""
      if (this.resolvePrivacyAuthorization) {
        this.resolvePrivacyAuthorization({
          event: 'disagree'
        })
        this.resolvePrivacyAuthorization = null
        tips = '该功能不可用'
      } else {
        tips = '部分功能不可用'
      }
      this.setData({
        showPrivacy: false
      })
      wx.showToast({
        title: tips,
        icon: 'error'
      })
    },
    // 同意隐私协议
    handleAgreePrivacyAuthorization() {
      const {
        _isRead,
        forceRead
      } = this.data
      if (_isRead || !forceRead) {
        if (this.resolvePrivacyAuthorization) {
          this.resolvePrivacyAuthorization({
            buttonId: 'agree-btn',
            event: 'agree'
          })
          this.resolvePrivacyAuthorization = null
        }
        this.setData({
          showPrivacy: false
        })
      } else {
        wx.showToast({
          title: '请先阅读指引',
          icon: 'error'
        })
      }
    },
  },

  observers: {
    "forceShow": function (forceShow) {
      this.setData({
        showPrivacy: forceShow
      })
    }
  }
})

整个组件的使用非常简单,只需要在相关页面的json文件里引入。如果涉及的页面较多的话,也可以在小程序全局组件配置里引入:

{

  "usingComponents": {
    "Privacy": "/components/privacy/privacy"
  }
}

以及在所有相关wxml里引入:

<Privacy/>

这里效果图和部分代码参考了:GitHub - 94xy/miniprogram-privacy: 小程序用户隐私保护授权弹窗组件表示感谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序隐私协议接入 的相关文章

  • 达芬奇无法播放视频,黑屏,不能预览画面

    说一下其中一个原因 是因为用了像是xdisplay super display这类软件 他们会安装一个显卡驱动而这个驱动就会导致这个问题 方法很简单 在设备管理器里面 显示卡一览 卸载掉除了你的电脑显卡以外的虚拟显卡驱动
  • element ui 中table表格刷新、input输入框添加enter触发搜索、连续点击的处理办法

    8 25小结 1 table表格刷新 elementy ui有一个v loading 我们可以给它绑定一个布尔值 truer就是转圈圈 false就是停止转圈圈 在刷新按钮上绑定一个事件来控制这个布尔值的改变 但是需要加一个定时器才能看出来
  • spring-boot-maven-plugin爆红解决方案,亲测有效

    报错信息提示如下 Plugin org springframework boot spring boot maven plugin not found 我使用idea中的spring initialer 来创建的 maven项目 但是在下载
  • 揭秘——STL空间配置器

    为什么要有空间配置器呢 这主要是从两个方面来考虑的 1 小块内存带来的内存碎片问题 单从分配的角度来看 由于频繁分配 释放小块内存容易在堆中造成外碎片 极端情况下就是堆中空闲的内存总量满足一个请求 但是这些空闲的块都不连续 导致任何一个单独
  • java中常见的异常类型

    Throwable 类是 Java 语言中所有错误或异常的超类 只有当对象是此类 或其子类之一 的实例时 才能通过 Java 虚拟机或者 Java throw 语句抛出 类似地 只有此类或其子类之一才可以是 catch 子句中的参数类型 两

随机推荐

  • 基于MATLAB的多聚类相位展开算法实现

    基于MATLAB的多聚类相位展开算法实现 相位展开是一种常见的信号处理算法 用于从相位差模糊的信号中恢复出准确的相位信息 多聚类相位展开算法是相位展开的一种改进方法 能够有效处理多个相位聚类的情况 本文将介绍如何使用MATLAB实现多聚类相
  • 【转载】Parameter must be a descendant of this view问题的解决方案

    转载 原文链接为 http www cnblogs com monodin p 3675040 html 关于ViewFlow和GridView嵌套导致Parameter must be a descendant ofthis view问题
  • arcgis图不见了_arcgis的左边图层边栏不见了怎么弄出来

    1 要加载使用 空间分析模块 首先得在ArcMap中执行菜单命令 在扩展模块管理窗口中 将 空间分析 spatial analyst 前的检查框打勾 然后 在ArcMap 工具栏的空白区域点右键 在出现的右键菜单中找到 空间分析 spati
  • maven springmvc hibernate shiro 集成

    最近项目需要进行高要求的Web权限管理 在比较Spring security和Shiro之后由于Shiro更大的灵活度和更强的配置性选择了Shiro 不过官方的文档写的对于集成spring不太清楚 尤其是Realm怎样实现 因此 在查阅一系
  • pandas安装完成后,报错:ImportError

    安装完pandas后 在使用时 发现需要更新numpy 系统自带的版本是1 12 1 执行 pip install U numpy 安装成功 Traceback most recent call last File D Anaconda3
  • vue3 实现点击可左右滑动

    具体代码如下
  • WINDOWS的远程桌面。

    http baike baidu com view 372045 htm 1 远程桌面的功能 远程桌面连接组件是从Windows 2000 Server开始由微软公司提供的 在WINDOWS 2000 SERVER中他不是默认安装的 该组件
  • Flutter 页面跳转和数据传值 pop回指定页面(路由实践)

    flutter搭建app 感觉相对简化了很多 布局核心就是万事皆widget 在之前我们不管是iOS 安卓原生 还是rn 我们在页面跳转和回转 我们都要对页面进行管理 从iOS 到安卓 到rn 路由被强调话了 web前端的一些重要设计思想被
  • .NET6用起来-Autofac

    本文的主角是Autofac 它是一款非常奈斯的依赖注入框架 暂时先不讨论 先分享几个名词 DI 依赖注入 IOC 控制反转 IOC容器 通过Demo 认识这些名词 Demo很简单 创建一个Asp NET Core项目 新增一个用户服务类 U
  • matplotlib中的3D绘图警告解决:MatplotlibDeprecationWarning: Axes3D(fig) adding itself to the figure

    在用matplotlib绘图中 ax Axes3D fig 我们得到了下面的警告 MatplotlibDeprecationWarning Axes3D fig adding itself to the figure is deprecat
  • 物联网安全技术提高区块链应用数据的可信度

    简介 物联网设备可信上链 物联网设备可信上链 为物联网设备上链提供可信的 一站式 多层级的安全服务 与阿里云BaaS等企业级区块链服务无缝对接 相关产品了解TEE 安全能力 密钥全生命周期管理和安全计算 支持企业级区块链 HyperLedg
  • AWB常见面试问题

    1 有没有处理过生产线问题 如何处理的 2 AWB客观和主观的整体调试流程 常用的机制有哪些 3 色差不过该如何解决 4 处理过那些严重偏色问题 解决思路是什么 5 如何根据偏色问题定位需要调试的模块 6 简述一下AWB的算法流程 7 SA
  • display aspect ratio和遥控器上的调整

    刚刚通过实验新鲜总结出来的 科普一下 一张DVD电影碟片 其解码出来的视频画面大小总是固定的 比如NTSC的DVD 总是720x480 其实不一定 但可以姑且这么认为 显示比例为4 3 不过 值得注意的是 现代的DVD Player和电视机
  • C++模板

    模板定义 函数模板 template
  • websocket 心跳机制

    WebSocket 是一种在客户端和服务器之间创建持久连接的技术 为了保持连接的稳定性 就需要通过发送心跳消息来维持 WebSocket 连接 1 创建一个webscoket基本的使用 创建 WebSocket 对象 传入服务器地址 con
  • k8s--基础--23.7--认证-授权-准入控制--限制用户操作k8s资源的权限

    k8s 基础 23 7 认证 授权 准入控制 限制用户操作k8s资源的权限 1 生成一个证书 1 1 生成一个私钥 cd etc kubernetes pki umask 077 openssl genrsa out lucky key 2
  • 使用Mindstudio调用Modelarts进行模型训练

    使用MindStudio连接ModelArts进行模型训练 1 介绍 本文介绍如何使用MindStudio调用ModelArts资源进行模型训练 ModelArts是面向AI开发者的一站式开发平台 帮助用户快速创建和部署模型 管理全周期AI
  • 彩虹医疗器械彩超、内窥镜维修技能学习

    近几年随着医疗行业的快速发展 医疗器械的需求量不断增加 同时对医疗器械的维修和保养需求也在不断增长随着医疗技术的不断进步 新型 复杂的医疗器械不断涌现 这对维修技术提出了更高的要求 加强技术研发是必经之路 通过加强工程师培训 提高工程师工作
  • 安卓搜不到airpods_完美兼容 安卓手机连接AirPods必懂方法

    苹果的AirPods被很多人认为是最好的蓝牙耳机 除了iOS用户外 不少安卓用户也折服于其产品力 购买了它并搭配安卓机使用 不过AirPods和安卓机之间的配合 显然不如和iOS那样天衣无缝 虽然AirPods也能通过蓝牙连接安卓听歌 但不
  • 微信小程序隐私协议接入

    自2023年9月15日起 对于涉及处理用户个人信息的小程序开发者 微信要求 仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则后 方可调用微信提供的隐私接口 相关公告见 关于小程序隐私保护指引设置的公告 微信开放社