微信小程序(uniapp)隐私授权弹窗

微信小程序(uniapp)隐私授权弹窗实现指南

在微信小程序开发中,隐私授权是保障用户权益的重要环节。随着用户对隐私保护的重视,微信官方提供了相关接口,如 uni.getPrivacySettinguni.openPrivacyContract,帮助开发者规范隐私授权流程。本文将详细介绍如何在 uniapp 中实现隐私授权弹窗,并提供完整的实现思路和代码示例。


一、隐私授权的背景与重要性
  1. 隐私授权的背景
    根据相关法律法规和微信平台要求,小程序在收集、使用用户个人信息前,必须明确告知用户并获得其授权。

  2. 隐私授权的重要性

    • 保障用户知情权,提升用户信任度。
    • 避免因违规收集用户信息导致的法律风险。
    • 提升小程序通过审核的概率,确保合规运营。

二、uniapp 隐私授权相关接口
  1. uni.getPrivacySetting
    该接口用于获取用户的隐私设置,包括是否同意隐私协议。

  2. uni.openPrivacyContract
    该接口用于打开隐私协议详情页面,用户可查看具体的隐私条款。


三、实现隐私授权弹窗的完整步骤
1. 检查用户隐私授权状态

在小程序启动时或需要收集用户信息前,调用 uni.getPrivacySetting 检查用户是否已同意隐私协议。

2. 弹出隐私授权提示

如果用户未同意隐私协议,弹出自定义弹窗,提示用户阅读并同意隐私协议。

3. 引导用户查看隐私协议

在弹窗中提供按钮,用户点击后可调用 uni.openPrivacyContract 打开隐私协议详情页面。

4. 用户同意后继续操作

用户同意隐私协议后,记录授权状态,并继续后续操作。


四、详细实现代码
1. 检查隐私授权状态

在App.vue globalData中定义 privacyContractNameshowPrivacy 两个变量。使用uni.getPrivacySetting 检查是否需要隐私协议授权。

注意:uni.getPrivacySetting 方法 小程序基础版本库必须高于或等于3.0.0,不然方法报错。

	// App.vue
	globalData: {
		privacyContractName: '', //隐私协议的名字
		showPrivacy: false //控制隐私弹窗显隐
	},
	onLaunch(option) {
		// 隐私授权弹窗
		uni.getPrivacySetting({
			success: res => {
				console.log('是否需要授权:', res.needAuthorization, '隐私协议的名称为:', res.privacyContractName);
				if (res.needAuthorization) {
					this.globalData.privacyContractName = res.privacyContractName;
					this.globalData.showPrivacy = true;
				} else {
					this.globalData.showPrivacy = false;
				}
			}
		});
	}
2. 封装隐私授权弹窗组件

创建一个名为 PrivacyPopup.vue 的组件文件。添加以下代码:

<template>
	<view class="privacy" v-if="showPrivacy">
		<view class="content">
			<view class="title">隐私保护指引</view>
			<view class="des">
				在使用当前小程序服务之前,请仔细阅读
				<text class="link" @click="openPrivacyContract">{{ privacyContractName }}</text>
				。如果你同意{{ privacyContractName }},请点击“同意”开始使用。
			</view>
			<view class="btns">
				<button class="item reject" @click="exitMiniProgram">拒绝</button>
				<button id="agree-btn" class="item agree" open-type="agreePrivacyAuthorization"
					@agreeprivacyauthorization="handleAgreePrivacyAuthorization">同意</button>
			</view>
		</view>
	</view>
</template>
export default {
		name: 'privacyPopup',
		data() {
			return {
				privacyContractName: '',
				showPrivacy: false
			};
		},
		created() {
			setTimeout(() => {
				this.showPrivacy = getApp().globalData.showPrivacy;
				this.privacyContractName = getApp().globalData.privacyContractName;
			}, 500);
		},
		methods: {
			// 同意隐私协议
			handleAgreePrivacyAuthorization() {
				const that = this;
				uni.requirePrivacyAuthorize({
					success: res => {
						that.showPrivacy = false;
						getApp().globalData.showPrivacy = false;
					}
				});
			},
			// 拒绝隐私协议
			exitMiniProgram() {
				const that = this;
				uni.showModal({
					content: '如果拒绝,我们将无法获取您的信息, 包括手机号、位置信息等该小程序十分重要的功能,您确定要拒绝吗?',
					success: res => {
						if (res.confirm) {
							that.showPrivacy = false;
							uni.exitMiniProgram({
								success: () => {
									console.log('退出小程序成功');
								}
							});
						}
					}
				});
			},
			// 跳转协议页面  
			// 在真机上点击高亮的协议名字会自动跳转页面 微信封装好的不用操作
			openPrivacyContract() {
				uni.openPrivacyContract({
					fail: () => {
						uni.showToast({
							title: '网络错误',
							icon: 'error'
						});
					}
				});
			}
		}
	};
.privacy {
		position: fixed;
		top: 0;
		right: 0;
		bottom: 0;
		left: 0;
		background: rgba(0, 0, 0, 0.5);
		z-index: 9999999;
		display: flex;
		align-items: center;
		justify-content: center;

		.content {
			width: 85vw;
			padding: 50rpx;
			box-sizing: border-box;
			background: #fff;
			border-radius: 16rpx;

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

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

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

			.btns {
				margin-top: 60rpx;
				display: flex;
				justify-content: space-between;

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

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

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

完整代码:

<template>
	<view class="privacy" v-if="showPrivacy">
		<view class="content">
			<view class="title">隐私保护指引</view>
			<view class="des">
				在使用当前小程序服务之前,请仔细阅读
				<text class="link" @click="openPrivacyContract">{{ privacyContractName }}</text>
				。如果你同意{{ privacyContractName }},请点击“同意”开始使用。
			</view>
			<view class="btns">
				<button class="item reject" @click="exitMiniProgram">拒绝</button>
				<button id="agree-btn" class="item agree" open-type="agreePrivacyAuthorization"
					@agreeprivacyauthorization="handleAgreePrivacyAuthorization">同意</button>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		name: 'privacyPopup',
		data() {
			return {
				privacyContractName: '',
				showPrivacy: false
			};
		},
		created() {
			setTimeout(() => {
				this.showPrivacy = getApp().globalData.showPrivacy;
				this.privacyContractName = getApp().globalData.privacyContractName;
			}, 500);
		},
		methods: {
			// 同意隐私协议
			handleAgreePrivacyAuthorization() {
				const that = this;
				uni.requirePrivacyAuthorize({
					success: res => {
						that.showPrivacy = false;
						getApp().globalData.showPrivacy = false;
					}
				});
			},
			// 拒绝隐私协议
			exitMiniProgram() {
				const that = this;
				uni.showModal({
					content: '如果拒绝,我们将无法获取您的信息, 包括手机号、位置信息等该小程序十分重要的功能,您确定要拒绝吗?',
					success: res => {
						if (res.confirm) {
							that.showPrivacy = false;
							uni.exitMiniProgram({
								success: () => {
									console.log('退出小程序成功');
								}
							});
						}
					}
				});
			},
			// 跳转协议页面  
			// 在真机上点击高亮的协议名字会自动跳转页面 微信封装好的不用操作
			openPrivacyContract() {
				uni.openPrivacyContract({
					fail: () => {
						uni.showToast({
							title: '网络错误',
							icon: 'error'
						});
					}
				});
			}
		}
	};
</script>

<style lang="scss" scoped>
	.privacy {
		position: fixed;
		top: 0;
		right: 0;
		bottom: 0;
		left: 0;
		background: rgba(0, 0, 0, 0.5);
		z-index: 9999999;
		display: flex;
		align-items: center;
		justify-content: center;

		.content {
			width: 85vw;
			padding: 50rpx;
			box-sizing: border-box;
			background: #fff;
			border-radius: 16rpx;

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

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

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

			.btns {
				margin-top: 60rpx;
				display: flex;
				justify-content: space-between;

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

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

				.agree {
					background: #07c160;
					color: #fff;
				}
			}
		}
	}
</style>
五、代码解析
  1. uni.getPrivacySetting
    该接口用于获取用户的隐私设置。如果 res.privacyContractName 为空,表示用户未同意隐私协议。
  2. 自定义弹窗
    使用 v-if 控制弹窗的显示,提供“查看隐私协议”、“同意”和“不同意”按钮。
  3. uni.openPrivacyContract
    用户点击“查看隐私协议”按钮后,调用该接口打开隐私协议详情页面。
  4. 用户同意或不同意
    根据用户的选择,记录授权状态并提示相应信息。
六、注意事项
  1. 隐私协议的合规性
    确保隐私协议内容符合相关法律法规要求,并在微信后台进行备案。
  2. 用户体验
    隐私授权弹窗应简洁明了,避免过度打扰用户。
  3. 接口调用频率
    避免频繁调用 uni.getPrivacySetting,建议在必要时(如首次启动、收集用户信息前)调用。
  4. 错误处理
    在调用接口时,做好错误处理,确保用户体验。
  5. 小程序基础版本库
    版本库必须高于或等于3.0.0,否则 uni.getPrivacySetting 会报错。
七、总结

通过 uniapp 提供的 uni.getPrivacySettinguni.openPrivacyContract 接口,开发者可以轻松实现隐私授权弹窗功能,确保小程序合规运营。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值