微信小程序 隐私协议弹窗授权
开发微信小程序的第一步往往是隐私协议授权,尤其是在涉及用户隐私数据时,必须确保用户明确知晓并同意相关隐私政策。我们才可以开发后续的小程序内容。友友们在按照文档开发时可能会遇到一些问题,我把所有的授权方法和可能遇到的问题都整理出来,欢迎大家一起交流哦!
前置准备:(在授权隐私协议弹窗前必须准备的,不能少!!!)
1.确保小程序管理后台填写的《用户隐私保护协议》已经通过,状态是下面这种就没问题了
2.在app.json中或者manifest.json中配置__usePrivacyCheck__:true(如果你使用微信小程序开发就用app.json,如果你使用uniapp开发,就在manifest.json中配置)下面是manifest.json中的配置,app.json李也一样加上__usePrivacyCheck__:true就好了
方法一:官方隐私弹窗
为了方便小程序开发者们开发,我们自己不用手写隐私弹窗啦,只要前置准备按照我说的做好,官方会自动寻找我们在小程序中使用的一个隐私相关接口,当小程序加载到第一个隐私相关接口时,就会自动弹窗。(微信内部逻辑就是微信方会自动判断此次调用是否需要触发wx.onNeedPrivacyAuthorization 事件,如果我们不做处理,微信就自己弹窗。这种方式适合简单的需求,如果我们要更改样式,还是建议友友们自定义隐私协议弹窗。)
方法二:自定义隐私协议弹窗
梳理流程逻辑:(tips:文章最下面有完整代码,直接复制粘贴就可以使用啦)
现在隐私协议弹窗有两种方式:第一种是需要调用隐私协议时弹窗,第二种是小程序进入页面就授权,只需要授权一次,授权之后就可以使用所有隐私接口了。现在我们一般都是用第二种,更符合用户体验。咱们先梳理下第二种方法的流程:注意接下来我使用的是uniapp
1.进入首页使用 uni.getPrivacySetting 接口判断是否需要授权,需要则展示弹窗;
2.弹窗弹开,用户点击查看隐私协议内容时,我们使用 uni.openPrivacyContract 接口打开隐私保护指引页面
3.用户点击同意关闭弹窗
4.用户点击拒绝,我们就直接让他退出小程序
1.进入首页使用 uni.getPrivacySetting 接口判断是否需要授权,需要则展示弹窗;
这里我写了一个弹窗,然后在onLoad函数里使用wx.getPrivacySetting去判断隐私协议弹窗是否授权,如果函数返回needAuthorization为true就代表用户还没授权,如果没授权就打开弹窗,返回false就是授权过了如果授权过了我们就不管它:
<template><u-popup :show="isPrivacy" mode="bottom" :round="20" ><view class="privacyBox"><view class="privacyTit">用户隐私保护提示</view><view class="privacyDesc"><view>感谢您的使用,在您使用Anywheel服务之前,请仔细阅读</view><text @click="openClick" style="color:#20D169">《我的 小程序隐私保护指引》</text><view >如您同意该指引,请点击"同意"开始使用本程序</view></view><view style="display:flex;margin-top:50rpx;height:92rpx;"><button id="disagree-btn" @click="closePopup" size="mini" style="flex: 1;margin-right: 8px;line-height: 46px">拒绝</button><button id="agree-btn" size="mini" type="primary" style="flex: 1;line-height: 46px" open-type="agreePrivacyAuthorization" @agreeprivacyauthorization="handleAgree">同意</button></view></view></u-popup>
</template>
<script>
export default {data(){return {isPrivacy:false}},onLoad(){uni.getPrivacySetting({success: res => {// res.needAuthorization 为true代表用户还没授权,这时候就需要弹出授权弹窗if (res.needAuthorization) {this.isPrivacy = true}else {// 用户已经同意过隐私协议,所以不需要再弹出隐私协议,直接进行页面正常流程}},fail: () => {},})}
}</script>
2.弹窗弹开,用户点击查看隐私协议内容时,我们使用 wx.openPrivacyContract 接口打开隐私保护指引页面
弹窗打开后,如果用户想点击弹窗里的隐私协议想查看具体内容怎么办,我这里绑定了openClick方法,openClick方法中调用uni.openPrivacyContract()方法就可以了。如果你们不能使用uni.openPrivacyContract()换成wx.openPrivacyContract()也行
<template><u-popup :show="isPrivacy" mode="bottom" :round="20" ><view class="privacyBox"><view class="privacyTit">用户隐私保护提示</view><view class="privacyDesc"><view>感谢您的使用,在您使用Anywheel服务之前,请仔细阅读</view><text @click="openClick" style="color:#20D169">《我的 小程序隐私保护指引》</text><view >如您同意该指引,请点击"同意"开始使用本程序</view></view><view style="display:flex;margin-top:50rpx;height:92rpx;"><button id="disagree-btn" @click="closePopup" size="mini" style="flex: 1;margin-right: 8px;line-height: 46px">拒绝</button><button id="agree-btn" size="mini" type="primary" style="flex: 1;line-height: 46px" open-type="agreePrivacyAuthorization" @agreeprivacyauthorization="handleAgree">同意</button></view></view></u-popup>
</template>
<script>
export default {data(){return {isPrivacy:false}},onLoad(){uni.getPrivacySetting({success: res => {// res.needAuthorization 为true代表用户还没授权,这时候就需要弹出授权弹窗if (res.needAuthorization) {this.isPrivacy = true}else {// 用户已经同意过隐私协议,所以不需要再弹出隐私协议,直接进行页面正常流程}},fail: () => {},})},methods:{openClick() {wx.openPrivacyContract({success: () => {}, // 打开成功fail: () => {}, // 打开失败complete: () => {}})},}
}</script>
3.用户点击同意关闭弹窗
注意,用户同意这块我用button按钮写的,button按钮上有open-type="agreePrivacyAuthorization"属性,当我们绑定 @agreeprivacyauthorization="handleAgree"时,就自动通知微信那边用户已经同意授权了,具体代码在下面:
<template><u-popup :show="isPrivacy" mode="bottom" :round="20" ><view class="privacyBox"><view class="privacyTit">用户隐私保护提示</view><view class="privacyDesc"><view>感谢您的使用,在您使用Anywheel服务之前,请仔细阅读</view><text @click="openClick" style="color:#20D169">《我的 小程序隐私保护指引》</text><view >如您同意该指引,请点击"同意"开始使用本程序</view></view><view style="display:flex;margin-top:50rpx;height:92rpx;"><button id="disagree-btn" @click="closePopup" size="mini" style="flex: 1;margin-right: 8px;line-height: 46px">拒绝</button><button id="agree-btn" size="mini" type="primary" style="flex: 1;line-height: 46px" open-type="agreePrivacyAuthorization" @agreeprivacyauthorization="handleAgree">同意</button></view></view></u-popup>
</template>
<script>
export default {data(){return {isPrivacy:false}},onLoad(){uni.getPrivacySetting({success: res => {// res.needAuthorization 为true代表用户还没授权,这时候就需要弹出授权弹窗if (res.needAuthorization) {this.isPrivacy = true}else {// 用户已经同意过隐私协议,所以不需要再弹出隐私协议,直接进行页面正常流程}},fail: () => {},})},methods:{openClick() {wx.openPrivacyContract({success: () => {}, // 打开成功fail: () => {}, // 打开失败complete: () => {}})},handleAgree() {let that = this// 如果用户之前已经同意过隐私授权,会立即返回success回调wx.requirePrivacyAuthorize({success: res => {that.isPrivacy = false// 同意协议后,后面正常执行后续流程}});},}
}</script>
4.用户点击拒绝,我们就直接让他退出小程序
用户拒绝隐私协议授权,代表着我们的小程序他是没法使用的,我们使用uni.exitMiniProgram给他退出小程序即可
下面是完整的代码:直接复制粘贴就可以使用:
<template><u-popup :show="isPrivacy" mode="bottom" :round="20" ><view class="privacyBox"><view class="privacyTit">用户隐私保护提示</view><view class="privacyDesc"><view>感谢您的使用,在您使用Anywheel服务之前,请仔细阅读</view><text @click="openClick" style="color:#20D169">《我的 小程序隐私保护指引》</text><view >如您同意该指引,请点击"同意"开始使用本程序</view></view><view style="display:flex;margin-top:50rpx;height:92rpx;"><button id="disagree-btn" @click="closePopup" size="mini" style="flex: 1;margin-right: 8px;line-height: 46px">拒绝</button><button id="agree-btn" size="mini" type="primary" style="flex: 1;line-height: 46px" open-type="agreePrivacyAuthorization" @agreeprivacyauthorization="handleAgree">同意</button></view></view></u-popup>
</template>
<script>
export default {data(){return {isPrivacy:false}},onLoad(){uni.getPrivacySetting({success: res => {// res.needAuthorization 为true代表用户还没授权,这时候就需要弹出授权弹窗if (res.needAuthorization) {this.isPrivacy = true}else {// 用户已经同意过隐私协议,所以不需要再弹出隐私协议,直接进行页面正常流程}},fail: () => {},})},methods:{openClick() {wx.openPrivacyContract({success: () => {}, // 打开成功fail: () => {}, // 打开失败complete: () => {}})},handleAgree() {let that = this// 如果用户之前已经同意过隐私授权,会立即返回success回调wx.requirePrivacyAuthorize({success: res => {that.isPrivacy = false// 同意协议后,后面正常执行后续流程}});},closePopup() {this.isPrivacy = falseuni.exitMiniProgram({success: function() {console.log('退出小程序成功');},fail: function(err) {console.log('退出小程序失败', err);}})},}
}</script>
<style>
privacyBox {/* width: 600rpx; */padding: 60rpx 60rpx 80rpx 60rpx;box-sizing: border-box;line-height: 1.5;}.privacyTit {font-size: 32rpx;font-weight: bold;// color: $uni-text-main;text-align: center;overflow: hidden;}.privacyDesc {font-size: 28rpx;// color: $uni-text-sub;overflow: hidden;margin-top: 30rpx;}.privacyDesc text {// color: $uni-primary;}.privacyPost {overflow: hidden;margin-top: 60rpx;display: flex;justify-content: center;align-items: center;}.privacyPost .refuseBtn {flex: 1;height: 80rpx;line-height: 80rpx;text-align: center;font-size: 28rpx;font-weight: bold;color: #fff;border-radius: 40rpx;box-sizing: border-box;overflow: hidden;}.privacyPost .agreeBtn {flex: 1;height: 80rpx;line-height: 80rpx;text-align: center;font-size: 28rpx;font-weight: bold;color: #fff;border-radius: 40rpx;box-sizing: border-box;overflow: hidden;margin-left: 20rpx;}
</style>
遇到的问题及解决:
1.官方隐私协议弹窗和自己开发的自定义协议弹窗同时出现:
我在开发的过程中出现了官方隐私协议弹窗和自定义隐私协议弹窗同是出现的情况,原因是我在app.vue中使用到了隐私相关接口,官方检测到隐私协议接口就会弹隐私协议弹窗,而我们自定义隐私协议弹窗一般在首页index.vue中处理,所以就会出现两次。我们可以在app.vue页面的onLaunch函数中加入下面这段代码,就只展示我们自定义的弹窗啦
onLaunch() {// 隐私协议前置if(uni.onNeedPrivacyAuthorization){uni.onNeedPrivacyAuthorization((resolve)=>{console.log('onNeedPrivacyAuthorization',resolve)})}
}
2.needAuthorization一直返回false
这个时候就看下我写的前置准备工作有没有做好,一般出现在隐私协议被拒的情况,审核不通过是进行不了下一步的,只有下面这种状态才可以,一定别忘了哦!
相关文章:

微信小程序 隐私协议弹窗授权
开发微信小程序的第一步往往是隐私协议授权,尤其是在涉及用户隐私数据时,必须确保用户明确知晓并同意相关隐私政策。我们才可以开发后续的小程序内容。友友们在按照文档开发时可能会遇到一些问题,我把所有的授权方法和可能遇到的问题都整理出…...
题目 3325: 蓝桥杯2025年第十六届省赛真题-2025 图形
题目 3325: 蓝桥杯2025年第十六届省赛真题-2025 图形 时间限制: 2s 内存限制: 192MB 提交: 494 解决: 206 题目描述 小蓝要画一个 2025 图形。图形的形状为一个 h w 的矩形,其中 h 表示图形的高,w 表示图形的宽。当 h 5,w 10 时,图形如下所…...

金众诚业财一体化解决方案如何提升项目盈利能力?
在工程项目管理领域,复杂的全生命周期管理、成本控制的精准性以及业务与财务的高效协同,是决定项目盈利能力的核心要素。随着数字化转型的深入,传统的项目管理方式已难以满足企业对效率、透明度和盈利能力的需求。基于金蝶云星空平台打造的金…...
bitbar环境搭建(ruby 2.4 + rails 5.0.2)
此博客为武汉大学WA学院网络安全课程,理论课大作业Web环境搭建。 博主搭了2天!!!血泪教训是还是不能太相信ppt上的教程。 一开始尝试了ppt上的教程,然后又转而寻找网络资源 cs155源代码和docker配置,做到…...
从零起步搭建基于华为云构建碳排放设备管理系统的产品设计
目录 🌿 华为云 IoT:轻松上手碳排放设备管理系统搭建 🌍 逐步搭建搭建规划 🚀 一、系统蓝图:5大核心模块,循序渐进 1️⃣ 设备管理与数据采集层 2️⃣ 数据传输与协议转换层 3️⃣ 数据处理与分析层…...

LabVIEW中EtherCAT从站拓扑离线创建及信息查询
该 VI 主要用于演示如何离线创建 EtherCAT 从站拓扑结构,并查询从站相关信息。EtherCAT(以太网控制自动化技术)是基于以太网的实时工业通信协议,凭借其高速、高效的特性在自动化领域广泛应用。与其他常见工业通讯协议相比…...
SpringBoot-11-基于注解和XML方式的SpringBoot应用场景对比
文章目录 1 基于注解的方式1.1 @Mapper1.2 @select1.3 @insert1.4 @update1.5 @delete2 基于XML的方式2.1 namespace2.2 resultMap2.3 select2.4 insert2.5 update2.6 delete3 service和controller3.1 service3.2 controller4 注解和xml的选择如果SQL简单且项目规模较小,推荐使…...

Flutter 3.32 新特性
2天前,Flutter发布了最新版本3.32,我们来一起看下29到32有哪些变化。 简介 欢迎来到Flutter 3.32!此版本包含了旨在加速开发和增强应用程序的功能。准备好在网络上进行热加载,令人惊叹的原生保真Cupertino,以及与Fir…...
前端面试热门知识点总结
URL从输入到页面展示的过程 版本1 1.用户在浏览器的地址栏输入访问的URL地址。浏览器会先根据这个URL查看浏览器缓存-系统缓存-路由器缓存,若缓存中有,直接跳到第6步操作,若没有,则按照下面的步骤进行操作。 2.浏览器根据输入的UR…...

windows和mac安装虚拟机-详细教程
简介 虚拟机:Virtual Machine,虚拟化技术的一种,通过软件模拟的、具有完整硬件功能的、运行在一个完全隔离的环境中的计算机。 在学习linux系统的时候,需要安装虚拟机,在虚拟机上来运行操作系统,因为我使…...
【Hive 开发进阶】窗口函数深度解析:OVER/NTILE/RANK 实战案例与行转列高级技巧
一、窗口函数 OVER 详解 窗口函数用于在分组内进行数据排名、聚合计算等操作,语法格式: 函数名() over([partition by 分组字段] [order by 排序字段] [window子句])案例:员工信息与部门平均工资 create table emp (id int,dept string,sa…...
在STM32上配置图像处理库
在STM32上配置并使用简单的图像滤波库(以实现均值滤波为例,不依赖复杂的大型图像处理库,方便理解和在资源有限的STM32上运行)为例,给出代码示例,使用STM32CubeIDE开发环境和HAL库,假设已经初始化好了相关GPIO和DMA(如果有图像数据传输需求),并且图像数据存储在一个二…...

【C++】vector容器实现
目录 一、vector的成员变量 二、vector手动实现 (1)构造 (2)析构 (3)尾插 (4)扩容 (5)[ ]运算符重载 5.1 迭代器的实现: (6&…...
RocketMQ 深度解析:消息中间件核心原理与实践指南
一、RocketMQ 概述 1.1 什么是 RocketMQ RocketMQ 是阿里巴巴开源的一款分布式消息中间件,后捐赠给 Apache 基金会成为顶级项目。它具有低延迟、高并发、高可用、高可靠等特点,广泛应用于订单交易、消息推送、流计算、IoT 等场景。 1.2 核心特性 高吞…...

使用Docker Compose部署Dify
目录 1. 克隆项目代码2. 准备配置文件3. 配置环境变量4. 启动服务5. 验证部署6. 访问服务注意事项 1. 克隆项目代码 首先,克隆Dify项目的1.4.0版本: git clone https://github.com/langgenius/dify.git --branch 1.4.02. 准备配置文件 进入docker目录…...
基于 Vue3 与 exceljs 实现自定义导出 Excel 模板
在开发中,我们需要常常为用户提供更多的数据录入方式,Excel 模板导出与导入是一个常见的功能点。本文将介绍如何使用 Vue3、exceljs 和 file-saver 实现一个自定义导出 Excel 模板,并在特定列添加下拉框选择的数据验证功能。 技术选型 excelj…...

杰发科技AC7840——CSE硬件加密模块使用(1)
1. 简介 2. 功能概述 3. 简单的代码分析 测试第二个代码例程 初始化随机数 这里的CSE_CMD_RND在FuncID中体现了 CSE_SECRET_KEY在17个用户KEY中体现 最后的读取RNG值,可以看出计算结果在PRAM中。 总的来看 和示例说明一样,CSE 初次使用,添加…...

前端地图数据格式标准及应用
前端地图数据格式标准及应用 坐标系EPSGgeojson标准格式基于OGC标准的地图服务shapefile文件3D模型数据常见地图框架 坐标系EPSG EPSG(European Petroleum Survey Group)是一个国际组织,负责维护和管理地理坐标系统和投影系统的标准化编码 E…...

threejs几何体BufferGeometry顶点
1. 几何体顶点位置数据和点模型 本章节主要目的是给大家讲解几何体geometry的顶点概念,相对偏底层一些,不过掌握以后,你更容易深入理解Threejs的几何体和模型对象。 缓冲类型几何体BufferGeometry threejs的长方体BoxGeometry、球体SphereGeometry等几…...

向量数据库选型实战指南:Milvus架构深度解析与技术对比
导读:随着大语言模型和AI应用的快速普及,传统数据库在处理高维向量数据时面临的性能瓶颈日益凸显。当文档经过嵌入模型处理生成768到1536维的向量后,传统B-Tree索引的检索效率会出现显著下降,而现代应用对毫秒级响应的严苛要求使得…...

java方法重写学习笔记
方法重写介绍 子类和父类有两个返回值,参数,名称都一样的方法, 子类的方法会覆盖父类的方法。 调用 public class Overide01 {public static void main(String[] args) {Dog dog new Dog();dog.cry();} }Animal类 public class Animal {…...
解决WPF短暂的白色闪烁(白色闪屏)
在 WPF 应用程序启动时出现 短暂的白色闪烁(白色闪屏),通常是由于以下原因导致的: 主要原因 WPF 默认窗口背景是白色,在加载 UI 之前会短暂显示白色背景。 解决方案 设置窗口背景为透明或黑色(推荐&…...
如何在Java中处理PDF文档(教程)
在开发文档管理系统、自动化工具或商业应用程序时,Java开发者常需处理PDF文档的编辑需求。无论是添加页面、调整内容尺寸、插入水印还是添加注释,选择一套可靠易用的Java PDF开发工具包至关重要。 JPedal(Java PDF开发工具包)的新…...

TensorBoard安装与基本操作指南(PyTorch)
文章目录 什么是TensorBoard?TensorBoardX与TensorBoard的依赖关系易混关系辨析Pytorch安装TensorBoard并验证1. TensorBoard安装和访问2. TensorBoard主要界面介绍实用技巧 什么是TensorBoard? TensorBoard是TensorFlow生态系统中的一款强大的可视化工…...
基于PyTorch的残差网络图像分类实现指南
以下是一份超过6000字的详细技术文档,介绍如何在Python环境下使用PyTorch框架实现ResNet进行图像分类任务,并部署在服务器环境运行。内容包含完整代码实现、原理分析和工程实践细节。 基于PyTorch的残差网络图像分类实现指南 目录 残差网络理论基础服务…...

2025/5/25 学习日记 linux进阶命令学习
tree:以树状结构显示目录下的文件和子目录,方便直观查看文件系统结构。 -d:仅显示目录,不显示文件。-L [层数]:限制显示的目录层级(如 -L 2 表示显示当前目录下 2 层子目录)。-h:以人类可读的格…...

【MPC控制 - 从ACC到自动驾驶】4 MPC的“实战演练”:ACC Simulink仿真与结果深度解读
【MPC控制 - 从ACC到自动驾驶】MPC的“实战演练”:ACC Simulink仿真与结果深度解读 在过去的几天里,我们一起: Day 1: 认识了ACC这位聪明的“跟车小能手”和MPC这位“深谋远虑的棋手”。Day 2: 给汽车“画了像”,建立了它的纵向…...
【时时三省】Python 语言----牛客网刷题笔记
目录 1,常用函数 1,input() 2,map() 3,split() 4,range() 5, 切片 6,列表推导式 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,常用函数 1,input() 该函数遇到 换行停止接收,返回类型为字符串 2,map() 该函数出镜率较高,目的是将一个可迭…...

OPENEULER搭建私有云存储服务器
一、关闭防火墙和selinux 二、下载相关软件 下载nginx,mariadb、php、nextcloud 下载nextcloud: sudo wget https://download.nextcloud.com/server/releases/nextcloud-30.0.1.zip sudo unzip nextcloud-30.0.1.zip -d /var/www/html/ sudo chown -R…...
PyQt学习系列10-性能优化与调试技巧
PyQt学习系列笔记(Python Qt框架) 第十课:PyQt的性能优化与调试技巧 课程目标 掌握 PyQt应用的性能优化策略(内存管理、渲染优化、多线程)学习 调试技巧(日志输出、断点设置、性能分析工具)解…...