小程序上线前,隐私协议是必须配置的合规文件,否则会被审核驳回甚至下架。本教程将手把手带你完成从协议内容撰写、后台配置到线上展示的全流程,确保你的小程序顺利过审。
**前置准备**
1. **已注册并认证的小程序账号**:确保你拥有微信小程序的管理员权限,且小程序已完成微信认证(需支付300元/年的认证费)。未认证的小程序无法配置部分隐私接口。
2. **文本编辑器**:推荐使用记事本、VS Code或Sublime Text,用于编写和编辑隐私协议文本。避免使用Word,因其格式代码可能干扰纯文本粘贴。
3. **微信开发者工具**:下载并安装最新版,用于在代码中调用隐私协议弹窗。版本需在1.06.2303222及以上。
4. **小程序服务器域名**:如果你计划将隐私协议文件托管在自己的服务器上,需准备好一个已备案且支持HTTPS的域名。若没有,可直接使用微信官方提供的静态托管服务。
5. **了解你的小程序收集了哪些信息**:在动笔前,先梳理你的小程序会获取的用户数据,例如:微信昵称、头像(用户信息)、手机号、位置、相册、摄像头、麦克风、蓝牙、通讯录等。这决定了协议中需要声明的内容。
**分步操作步骤**
**1. 撰写隐私协议文本**
打开文本编辑器,创建一份名为“privacy.txt”的文件。协议内容必须包含以下关键条款,且需根据你的小程序实际功能进行修改。
* 协议标题与引言:明确协议名称,例如“《[你的小程序名称]用户隐私保护指引》”。开头需写明:“本指引旨在帮助您了解我们如何收集、使用、存储和保护您的个人信息。”
* 信息收集范围:逐条列出所有可能收集的信息。例如:
* “当您使用头像昵称功能时,我们会收集您的微信头像和昵称。”
* “当您使用位置服务时,我们会收集您的精确地理位置信息。”
* “当您使用拍照功能时,我们会调用您的摄像头权限。”
* 信息使用目的:说明收集这些信息的具体用途。例如:“用于为您提供附近门店推荐”、“用于完成拍照上传头像功能”。
* 信息存储与安全:声明数据存储地点(通常为境内服务器)和加密措施。例如:“您的个人信息将存储在中华人民共和国境内的服务器,并采用SSL加密传输。”
* 信息共享与披露:说明是否会与第三方共享。例如:“我们不会向任何第三方出售您的个人信息。但为提供服务,可能会与微信平台共享必要的设备信息。”
* 用户权利:告知用户如何查询、更正、删除其个人信息。例如:“您可通过小程序内‘设置-个人信息管理’页面行使您的权利。”
* 协议更新与联系方式:写明协议变更通知方式及客服联系方式。例如:“本指引更新后,我们会通过弹窗提示您。如有疑问,请联系客服邮箱:xxx@xxx.com。”
**关键提示**:不要直接复制其他小程序的协议。微信审核团队会核对协议内容与实际代码调用的API是否一致。例如,你的代码里没有调用“获取手机号”接口,但协议里写了,会被判定为“过度声明”而驳回。
**2. 上传隐私协议文件**
微信提供了两种托管方式:使用官方静态托管(推荐)或自建服务器托管。
* **使用微信官方静态托管(推荐)**:
* 登录微信小程序后台(mp.weixin.qq.com)。
* 左侧菜单依次点击:**开发** -> **开发管理** -> **开发设置**。
* 向下滚动找到“**小程序代码上传**”区域,点击“**上传**”按钮(注意:这不是上传代码,而是上传静态资源)。
* 在弹出的窗口中,将刚才写好的“privacy.txt”文件拖拽上传。系统会自动生成一个链接,格式类似:`https://res.wx.qq.com/你的AppID/.../privacy.txt`。
* **复制这个链接**,它就是你隐私协议的网络地址。
* **使用自建服务器托管**:
* 将“privacy.txt”文件上传到你服务器的HTTPS目录下,例如:`https://yourdomain.com/privacy/privacy.txt`。
* 确保该链接直接在浏览器中打开时,可以显示纯文本内容,且不跳转、不弹下载框。
* 记录下这个完整URL。
**3. 在小程序后台配置隐私协议链接**
* 回到微信小程序后台首页。
* 左侧菜单点击:**设置** -> **基本设置**。
* 在“**服务类目**”下方,找到“**用户隐私保护指引**”区域。
* 点击“**更新**”按钮(如果是首次配置,点击“设置”)。
* 在弹出的对话框里,选择“**已有模板**”或“**自定义**”。如果你刚才上传了文件,选择“**自定义**”,然后将你复制的链接粘贴到输入框中。
* 点击“**确定**”并保存。此时,后台配置完成。
**4. 在代码中接入隐私协议弹窗(关键步骤)**
从2023年9月15日起,微信要求所有调用隐私接口(如获取用户信息、位置、相册等)的小程序,必须先弹窗并获得用户同意。你需要编写代码来实现这个弹窗。
* **第一步:在app.js中监听隐私授权事件**。
在`onLaunch`或`onShow`生命周期中,添加以下代码(以JavaScript为例):
```javascript
// app.js
App({
onLaunch: function () {
// 监听隐私授权弹窗事件
if (wx.onNeedPrivacyAuthorization) {
wx.onNeedPrivacyAuthorization(resolve => {
// 这里需要调用你的隐私弹窗组件
// 将resolve函数传递给弹窗组件,用户点击同意后执行resolve()
this.globalData.privacyResolve = resolve
// 触发自定义事件,让页面显示弹窗
this.globalData.showPrivacy = true
})
}
},
globalData: {
showPrivacy: false,
privacyResolve: null
}
})
```
* **第二步:创建隐私弹窗组件**。
在`components`目录下新建`privacy-popup`组件。组件包含一个半透明遮罩层和一个弹窗,弹窗内显示协议摘要和一个“同意”按钮。
```html
我们即将使用您的个人信息,请仔细阅读
```
```javascript
// components/privacy-popup/privacy-popup.js
const app = getApp()
Component({
properties: {
show: {
type: Boolean,
value: false
}
},
methods: {
onAgree: function () {
// 用户点击同意,执行resolve函数
if (app.globalData.privacyResolve) {
app.globalData.privacyResolve()
}
// 隐藏弹窗
this.setData({ show: false })
app.globalData.showPrivacy = false
}
}
})
```
* **第三步:在页面中使用弹窗**。
在需要调用隐私接口的页面(如首页`index`)中引入该组件,并监听全局的`showPrivacy`状态。
```html
```
```javascript
// pages/index/index.js
const app = getApp()
Page({
data: {
showPrivacy: false
},
onShow: function () {
// 监听全局隐私弹窗状态
this.setData({
showPrivacy: app.globalData.showPrivacy
})
}
})
```
* **第四步:在调用隐私API前检查授权状态**。
例如调用`wx.chooseImage`前,先检查用户是否已授权。如果没有授权,系统会自动触发`onNeedPrivacyAuthorization`事件,你的弹窗就会显示。
```javascript
// 调用相册前
wx.chooseImage({
success: function (res) {
// 用户已授权,正常执行
},
fail: function (err) {
// 用户拒绝授权,引导用户去设置开启
if (err.errMsg.indexOf('fail privacy permission is not authorized') !== -1) {
wx.showToast({ title: '请先同意隐私协议', icon: 'none' })
}
}
})
```
**5. 创建协议详情页(可选但建议)**
为了让用户能阅读完整的协议文本,建议创建一个独立的页面来展示协议全文。
* 在`pages`目录下新建`privacy`页面。
* 在`privacy.wxml`中使用`
```html
```
* 在弹窗组件中,将“《隐私协议》”文字链接的`navigator`的`url`指向这个页面。
**常见问题**
* **问:我上传了隐私协议,但后台显示“文件内容不符合规范”?**
答:检查你的协议文件是否为纯文本格式(.txt),且编码为UTF-8。不要使用Word或WPS直接另存为文本,建议用记事本重新编写并保存。另外,协议内容中不能包含任何HTML标签或Markdown符号。
* **问:用户点击“同意”后,弹窗再次弹出?**
答:这是因为`resolve`函数只被调用了一次,但后续又触发了`onNeedPrivacyAuthorization`事件。解决方案是在用户同意后,将授权状态存储在`wx.setStorageSync`中,并在`onNeedPrivacyAuthorization`事件触发时先检查存储状态,如果已同意,直接执行`resolve()`,不再弹窗。
* **问:我的小程序没有调用任何隐私接口,还需要配置吗?**
答:需要。即使你的小程序不主动调用API,微信基础库2.33.0版本以上也会在启动时检查。建议所有小程序都配置并接入弹窗,否则在低版本基础库上可能出现白屏或接口调用失败。
* **问:隐私协议更新后,用户需要重新同意吗?**
答:微信目前没有强制要求重新弹窗,但建议在协议版本更新时,通过公告或弹窗提示用户“协议已更新,请查看”,并提供跳转链接。合规做法是在用户首次打开更新后的小程序时再次弹窗。
* **问:弹窗样式和微信官方要求的不一致,会被驳回吗?**
答:微信对弹窗样式有基本要求:必须包含完整的协议名称、可点击查看详情的链接、以及明确“同意”或“拒绝”按钮。只要满足这些要素,自定义样式通常可以通过审核。但不要将“拒绝”按钮设计得过于隐蔽或难以点击。
**收尾总结**
至此,你已经完整掌握了小程序隐私协议从撰写、上传、后台配置到前端代码接入的全流程。核心要点有三:协议内容必须真实反映你的数据收集行为;后台配置的链接必须可以直接访问且内容合规;前端弹窗必须在调用隐私接口前弹出,且用户点击同意后才能继续操作。建议在正式提交审核前,使用微信开发者工具的“真机调试”功能,在真实手机上测试一次完整的隐私授权流程,确保弹窗正常显示、接口调用无误。完成这些步骤后,你的小程序在隐私合规方面就具备了上线条件。