?2023.09.14更新:
-
隱私相關(guān)功能啟用時(shí)間延期至 2023年10月17日。在 2023年10月17日之前,在 app.json 中配置
__usePrivacyCheck__: true
后,會(huì)啟用隱私相關(guān)功能,如果不配置或者配置為 false 則不會(huì)啟用。在 2023年10月17日之后,不論 app.json 中是否有配置__usePrivacyCheck__
,隱私相關(guān)功能都會(huì)啟用。 -
新增官方隱私授權(quán)彈窗功能,相關(guān)功能參考官方隱私彈窗功能說(shuō)明。此功能目前仍在開發(fā)階段,開發(fā)者目前可以先閱讀本指南文檔和接口文檔進(jìn)行理解,平臺(tái)將會(huì)盡快正式上線相關(guān)能力,上線后會(huì)在本指南文檔中進(jìn)行說(shuō)明。
解讀:調(diào)用相關(guān)接口,如果需要彈出隱私協(xié)議,微信會(huì)檢查開發(fā)者是否實(shí)現(xiàn)了wx.onNeedPrivacyAuthorization,實(shí)現(xiàn)的話,由開發(fā)者的實(shí)現(xiàn)接管后續(xù)流程。否則,微信會(huì)自己彈出隱私協(xié)議窗口。如果用戶同意,相關(guān)接口后續(xù)會(huì)走成功回調(diào),否則走失敗回調(diào)。官方隱私彈窗會(huì)有一些優(yōu)化,10秒內(nèi)不會(huì)重復(fù)彈出,而是直接接口失敗,錯(cuò)誤碼為 103。鑒于可能和其他彈出共存或獨(dú)自存在,官方隱私彈窗將有兩種樣式,不過(guò)不需要開發(fā)者關(guān)注。綜上所述,開發(fā)者可以自己處理隱私協(xié)議查看要求,也可以不做任何處理,或者在接口調(diào)用出現(xiàn)103時(shí)候,做一些特別的提示即可。
自2023年9月15日起,對(duì)于涉及處理用戶個(gè)人信息的小程序開發(fā)者,微信要求,僅當(dāng)開發(fā)者主動(dòng)向平臺(tái)同步用戶已閱讀并同意了小程序的隱私保護(hù)指引等信息處理規(guī)則后,方可調(diào)用微信提供的隱私接口。
相關(guān)公告見:關(guān)于小程序隱私保護(hù)指引設(shè)置的公告 | 微信開放社區(qū)
公告里已經(jīng)介紹了相關(guān)流程,具體可以參考小程序隱私協(xié)議開發(fā)指南 | 微信開放文檔。這里不再贅述。下面我們將著重談一下代碼實(shí)現(xiàn)。
觸發(fā)式隱私協(xié)議
首先,我們要知道的一點(diǎn)是如果用戶沒(méi)有同意過(guò)隱私協(xié)議,調(diào)用某些API(具體參看:小程序用戶隱私保護(hù)指引內(nèi)容介紹 | 微信開放文檔)是會(huì)觸發(fā)隱私協(xié)議彈窗的,這種叫觸發(fā)式隱私協(xié)議。如果用戶同意,這個(gè)API調(diào)用還能繼續(xù)執(zhí)行,否則就會(huì)報(bào)失敗。所以我們要做的是在這個(gè)時(shí)候,在當(dāng)前頁(yè)面彈出我們自定義的隱私協(xié)議alert,并且接收resolve。然后在用戶同意和拒絕的時(shí)候調(diào)用這個(gè)resolve。具體代碼如下:
// page.wxml
<view wx:if="{{showPrivacy}}">
<view>隱私彈窗內(nèi)容....</view>
<button id="agree-btn" open-type="agreePrivacyAuthorization" bindagreeprivacyauthorization="handleAgreePrivacyAuthorization">同意</button>
</view>
// page.js
Page({
data: {
showPrivacy: false
},
onLoad() {
wx.onNeedPrivacyAuthorization(resolve => {
// 需要用戶同意隱私授權(quán)時(shí)
// 彈出開發(fā)者自定義的隱私授權(quán)彈窗
this.setData({
showPrivacy: true
})
this.resolvePrivacyAuthorization = resolve
})
wx.getUserProfile({
success: console.log,
fail: console.error
})
},
handleAgreePrivacyAuthorization() {
// 用戶點(diǎn)擊同意按鈕后
this.resolvePrivacyAuthorization({ buttonId: 'agree-btn', event: 'agree' })
// 用戶點(diǎn)擊同意后,開發(fā)者調(diào)用 resolve({ buttonId: 'agree-btn', event: 'agree' }) 告知平臺(tái)用戶已經(jīng)同意,參數(shù)傳同意按鈕的id。為確保用戶有同意的操作,基礎(chǔ)庫(kù)在 resolve 被調(diào)用后,會(huì)去檢查對(duì)應(yīng)的同意按鈕有沒(méi)有被點(diǎn)擊過(guò)。檢查通過(guò)后,相關(guān)隱私接口會(huì)繼續(xù)調(diào)用
// 用戶點(diǎn)擊拒絕后,開發(fā)者調(diào)用 resolve({ event:'disagree' }) 告知平臺(tái)用戶已經(jīng)拒絕
}
})
?這里同意的按鈕必須使用系統(tǒng)提供的這個(gè)寫法,需要指定一個(gè)id和回調(diào)方法。拒絕的按鈕沒(méi)有什么要求。這里務(wù)必要保存resolve,并且在同意和拒絕中調(diào)用它,否則觸發(fā)隱私協(xié)議的API的成功和失敗回調(diào)就不會(huì)走。這里有個(gè)問(wèn)題,可能多個(gè)頁(yè)面都有API會(huì)觸發(fā),但是onNeedPrivacyAuthorization只能注冊(cè)一個(gè),前面注冊(cè)的會(huì)被后面的覆蓋。所以,如果把注冊(cè)方法寫在load里可能造成,頁(yè)面回來(lái)的時(shí)候就不會(huì)觸發(fā)了。因此建議這個(gè)注冊(cè)放在show的時(shí)候注冊(cè)。關(guān)于這個(gè)API的更多內(nèi)容可以查看:wx.onNeedPrivacyAuthorization(function listener) | 微信開放文檔
隱私協(xié)議的彈窗是我們自定義的,里面的文本建議根據(jù)官方的例子來(lái)寫,要獲取指引的名字,可以通過(guò)wx.getPrivacySetting這個(gè)API。點(diǎn)擊指引前往查看隱私協(xié)議的頁(yè)面,可以我們自己寫,也可以用微信官方提供的頁(yè)面,只需要調(diào)用接口wx.openPrivacyContract就行。注意,閱讀隱私協(xié)議不是必須的,所以你可以強(qiáng)制要求用戶前往閱讀,也可以什么都不做。
主動(dòng)式隱私協(xié)議
前面我們講的觸發(fā)式隱私協(xié)議,相對(duì)比較麻煩,要去找到這些敏感接口調(diào)用的頁(yè)面,然后全都處理一下。還有一種是主動(dòng)式隱私協(xié)議。主動(dòng)式隱私協(xié)議,就是你在關(guān)鍵入口,主動(dòng)彈出這個(gè)協(xié)議窗口,讓用戶去同意或者拒絕。這時(shí)候就沒(méi)有resolve了。但是這樣做有個(gè)問(wèn)題,如果用戶點(diǎn)了同意,那么后續(xù)這些API都會(huì)調(diào)用成功,用戶和開發(fā)者都很高興。但是萬(wàn)一用戶拒絕,如果你沒(méi)有注冊(cè)onNeedPrivacyAuthorization并進(jìn)行適當(dāng)處理,那后續(xù)調(diào)用都會(huì)失敗。這時(shí)候偷懶的做法是,用戶拒絕后就退出小程序,但是這種做法體驗(yàn)不佳。我們應(yīng)該盡量讓用戶能使用其他功能,畢竟這些涉及的API可能我們并不太關(guān)心,譬如說(shuō)用戶只是不能上傳下載圖片,而這些并非我們小程序的核心功能。
組件實(shí)現(xiàn)
從用戶體驗(yàn)上來(lái)講,對(duì)于使用相關(guān)API比較多的小程序,為了避免遺漏和一些特殊場(chǎng)景,建議在入口主動(dòng)彈出隱私協(xié)議。對(duì)于用量較少的小程序,可以采用觸發(fā)式隱私協(xié)議。無(wú)論我們采取何種做法,我們都將其封裝為一個(gè)組件。
UI部分沒(méi)有什么特別的,我們找個(gè)寫好的,類似微信風(fēng)格的實(shí)現(xiàn):
?相關(guān)頁(yè)面代碼:
<view class="privacy" wx:if="{{showPrivacy}}">
<view class="content">
<view class="title">隱私保護(hù)指引</view>
<view class="des">
在使用當(dāng)前小程序服務(wù)之前,請(qǐng)仔細(xì)閱讀<text class="link" bind:tap="openPrivacyContract">{{privacyContractName}}</text>。如你同意{{privacyContractName}},請(qǐng)點(diǎn)擊“同意”開始使用。
</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;
}
在組件實(shí)現(xiàn)里,我們聲明了三個(gè)屬性,forceShow用于主動(dòng)式隱私協(xié)議,設(shè)置true的時(shí)候可以強(qiáng)制顯示。false的時(shí)候,則組件顯示由注冊(cè)回調(diào)觸發(fā),是觸發(fā)式隱式協(xié)議。forceRead控制用戶是否需要強(qiáng)制閱讀協(xié)議。exitOnRefuse指當(dāng)用戶拒絕的時(shí)候,是否需要強(qiáng)制退出小程序。我們?cè)陧?yè)面show的時(shí)候,注冊(cè)隱私協(xié)議觸發(fā)回調(diào),調(diào)用getPrivacySetting獲取協(xié)議的名稱。這里用到了組件的pageLifetimes。后面就是實(shí)現(xiàn)打開協(xié)議,同意和拒絕的回調(diào)。同意和拒絕的回調(diào)里,我們要判斷是否保存了resolve,有的話是觸發(fā)式的,需要進(jìn)行調(diào)用,調(diào)用完了立刻將其清空。因?yàn)槲覀兡軈^(qū)分這兩種隱私協(xié)議,因此我們?cè)诰芙^的時(shí)候,顯示了不同的錯(cuò)誤提示:對(duì)于主動(dòng)式的,我們就說(shuō)部分功能不可用。對(duì)于觸發(fā)式的,我們就說(shuō)該功能不可用。
完整的js代碼如下:
Component({
options: {
pureDataPattern: /^_/ // 指定所有 _ 開頭的數(shù)據(jù)字段為純數(shù)據(jù)字段
},
/**
* 組件的屬性列表
*/
properties: {
forceShow: {
type: Boolean,
value: false
},
forceRead: {
type: Boolean,
value: false
},
exitOnRefuse: {
type: Boolean,
value: false
}
},
/**
* 組件的初始數(shù)據(jù)
*/
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,
//僅在需要授權(quán)的時(shí)候才顯示,處理多個(gè)tab切換每個(gè)頁(yè)面都顯示的問(wèn)題
showPrivacy: that.data.forceShow && res.needAuthorization
})
}
})
}
},
/**
* 組件的方法列表
*/
methods: {
// 打開隱私協(xié)議頁(yè)面
openPrivacyContract() {
const that = this
wx.openPrivacyContract({
success: () => {
that.setData({
_isRead: true
})
},
fail: () => {
wx.showToast({
title: '指引打開失敗',
icon: 'error'
})
}
})
},
// 拒絕隱私協(xié)議
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'
})
},
// 同意隱私協(xié)議
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: '請(qǐng)先閱讀指引',
icon: 'error'
})
}
},
},
observers: {
"forceShow": function (forceShow) {
this.setData({
showPrivacy: forceShow
})
}
}
})
整個(gè)組件的使用非常簡(jiǎn)單,只需要在相關(guān)頁(yè)面的json文件里引入。如果涉及的頁(yè)面較多的話,也可以在小程序全局組件配置里引入:
{
"usingComponents": {
"Privacy": "/components/privacy/privacy"
}
}
以及在所有相關(guān)wxml里引入:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-712632.html
<Privacy/>
這里效果圖和部分代碼參考了:GitHub - 94xy/miniprogram-privacy: 小程序用戶隱私保護(hù)授權(quán)彈窗組件表示感謝。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-712632.html
到了這里,關(guān)于微信小程序隱私協(xié)議接入的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!