1.微信隐私说明:
涉及处理用户个人信息的小程序开发者,需通过弹窗等明显方式提示用户阅读隐私政策等收集使用规则。
为规范开发者的用户个人信息处理行为,保障用户合法权益,微信要求开发者主动同步微信当前用户已阅读并同意小程序的隐私政策等收集使用规则,方可调用微信提供的隐私接口。
关于小程序隐私保护指引设置的公告,从 2023 年 9 月 15 日起必须用户点击同意隐私保护政策并同步给微信之后,开发者才可以调用微信提供的隐私接口。涉及到使用了隐私接口的小程序必须在「小程序管理后台」设置《小程序用户隐私保护指引》。
2.隐私相关 api:
- wx.getPrivacySetting:查询隐私授权情况
- wx.openPrivacyContract:跳转到隐私协议页面
- wx.onNeedPrivacyAuthorization:监听隐私接口需要用户授权事件
- wx.requirePrivacyAuthorize :模拟隐私接口调用,并触发隐私弹窗逻
3.开发分析
开发者可以在需要调用隐私接口时弹窗、也可以在小程序打开时弹窗,而且只需要授权一次,授权之后只要用户没有删除小程序可以一直调用用到的全部隐私接口,一番研究之后我选择在页面显示时就判断是否需要授权,授权之后以后就不需要授权了,最终确定的流程如下:
- 页面显示时使用 wx.getPrivacySetting 接口判断是否需要授权,需要则展示弹窗;
- 用户点击查看隐私保护指引
- 由于是服务商模式,即采用自定义隐私弹窗(隐私协议自定义),服务商模式是需要后端主动通过接口向微信提交请求;
- 个人的小程序建议直接采用官方弹窗,,使用 wx.openPrivacyContract 接口打开隐私保护指引页面;
- 用户点击“拒绝”则不去定位但是正常进入,下次涉及隐私的地方重新唤起隐私弹窗,用户点击“同意”则不再弹出弹窗。
考虑到用户可能有通过分享、扫码等直接进入到某个需要调用隐私接口的界面的情况,代码需要多次复用,直接写成组件更合适,组件外部的代码越少越好。
4.uniapp 小程序的隐私弹窗代码
{{ privacyContractName }}
亲爱的用户,欢迎您!
我们根据移动互联网应用程序信息服务管理及用户账号信息管理相关规定,制定了
《用户隐私政策》
《用户服务协议》 ,请您在使用我们的产品前自行阅读,并充分理解相关条款,以了解您的权利。
※您可以通过《用户隐私政策》《用户服务协议》了解我们处理您的个人信息情况,以及您享有的相关权利,若同意仅代表您已了解小程序提供的功能,以及功能运行所需的必要个人信息,并不代表您已同意我们可以收集非必要个人信息。
※如您不同意《用户隐私政策》,将为您提供游客模式,可浏览我们的商品与服务,但是无法注册购买,为了给您更优的用户体验,推荐您使用完整的功能模式。
不同意
export default {
onLaunch(option) {
// 提前调用隐私协议(一进入页面就调用,避免在其他地方调用)
this.getPrivacySettingFn()
},
methods: {
getPrivacySettingFn() {
const that = this
return new Promise((resolve, reject) => {
try {
// 监听调用隐私API回调(防止弹出官方弹窗)
if (wx.onNeedPrivacyAuthorization) {
wx.onNeedPrivacyAuthorization(resolve => {
console.log('onNeedPrivacyAuthorization', resolve)
// 打开隐私弹窗
// this.$emit('update:showPrivacy', true)
// _this.resolvePrivacyAuthorization = resolve
})
}
wx.getPrivacySetting({
success(res) {
// this.privacyContractName = res.privacyContractName
console.log(res) // 返回结果为: res = { needAuthorization: true/false, privacyContractName: '《xxx隐私保护指引》' }
if (res.needAuthorization) {
console.log('需要弹出隐私协议弹窗')
that.globalData.isAllowCollectMsg = 1
uni.setStorageSync('IS_AGREE_PRIVACY', 0)
resolve(true)
} else {
console.log(
'用户已经同意过隐私协议,不需要再弹出隐私协议,正常调用已声明过的隐私接口'
)
that.globalData.isAllowCollectMsg = 0
uni.setStorageSync('IS_AGREE_PRIVACY', 2)
resolve(false)
}
},
fail(err) {
console.log(err, '获取隐私弹窗失败')
uni.setStorageSync('IS_AGREE_PRIVACY', 2)
reject(err)
},
complete() {
that.globalData.isAllowCollectMsg = 2
}
})
} catch (error) {
uni.setStorageSync('IS_AGREE_PRIVACY', 2)
}
})
}
}
}
// 处理弹窗 handlePrivacy(id) { //
1.需要隐私弹窗且没点从未击过弹窗IS_AGREE_PRIVACY:0:从未点击过,1:点击过不同意,2:点击过同意
if (!uni.getStorageSync('IS_AGREE_PRIVACY')) { this.showPrivacy = true } }
5.关于官方隐私弹窗和自定义隐私弹窗会同时展示处理
1.建议将隐私 API 组件放到页面最前面加载,一进入页面就加载,就能避免 其他涉及 用户隐私(如常见的 定位、手机号授权、用户信息授权、手机相册等等)先于隐私 API 弹窗前调用; 2.关于同时会出现官方隐私弹窗和自定义隐私弹窗问题,官方给的回复如下:“原因是小程序在调用隐私接口之后才注册 wx.onNeedPrivacyAuthorization 监听,建议改成先注册 wx.onNeedPrivacyAuthorization 再调用隐私接口”。
针对以上,我们试着将 wx.onNeedPrivacyAuthorization 主动监听隐私 提到 wx.onNeedPrivacyAuthorization 前面执行,发现不会再弹出官方的隐私弹窗,成功解决问题。
onLaunch(option) { //1.提前调用隐私协议(一进入页面就调用,避免在其他地方调用)
this.getPrivacySettingFn() }, methods:{ getPrivacySettingFn(){
//2.主动调用监听wx.onNeedPrivacyAuthorization,且将其放到wx.getPrivacySetting之前调用
if (wx.onNeedPrivacyAuthorization) { wx.onNeedPrivacyAuthorization(resolve => {
console.log('onNeedPrivacyAuthorization', resolve) // 打开隐私弹窗 //
this.$emit('update:showPrivacy', true) // _this.resolvePrivacyAuthorization =
resolve }) } wx.getPrivacySetting({ success(res) { // this.privacyContractName =
res.privacyContractName console.log(res) // 返回结果为: res = {
needAuthorization: true/false, privacyContractName: '《xxx隐私保护指引》' } if
(res.needAuthorization) { console.log('需要弹出隐私协议弹窗') } else {
console.log(
'用户已经同意过隐私协议,不需要再弹出隐私协议,正常调用已声明过的隐私接口' ) } }
}) } }