微信小程序隐私合规不是在审核前临时加一段隐私协议。只要小程序会收集手机号、头像、位置、文件、设备信息或其他个人信息,就需要把收集目的、使用场景、授权时机、保存期限、删除方式和第三方共享边界设计进产品和接口。
本文以当前微信小程序隐私保护流程为基础,整理从数据盘点、后台声明、授权弹窗、服务端存储到上线验收的完整方法。上一篇微信小程序上线后怎么监控讨论发布后的错误和版本管理,微信小程序接口安全实战讨论登录态与权限,微信小程序开发流程实战讨论审核发布,本文专门解决“哪些数据可以收集、什么时候请求授权、拒绝后还能不能使用”的问题。
隐私合规的最低原则是:只收集完成当前功能所必需的数据,在需要使用时说明用途,让用户可以选择,并让服务端真正执行保存、访问、删除和撤回规则。
一、先列出数据清单,而不是先写协议
隐私协议不能脱离代码和业务流程单独编写。先建立一张数据清单,按“数据、来源、用途、保存位置、保存期限、访问角色、删除方式”逐项记录:
| 数据类别 | 可能来源 | 使用目的 | 需要确认的风险 |
|---|---|---|---|
| 小程序用户标识 | 微信登录服务端接口 | 绑定本站账号和会话 | 不能当成通用密码或客户端授权凭证 |
| 手机号 | 用户主动授权或手动填写 | 联系、配送或身份核验 | 不是登录成功后自动获得的数据 |
| 头像和昵称 | 用户主动提供 | 展示个人资料 | 不应为了“完善资料”强制收集 |
| 位置 | 定位接口或用户输入 | 地图、附近服务或配送 | 需要说明精度、用途和拒绝路径 |
| 图片与文件 | 选择器、相机或上传接口 | 头像、凭证、内容提交 | 大小、公开范围、删除和安全扫描 |
| 设备与运行信息 | 平台或日志 | 故障排查和兼容性分析 | 做必要采集并脱敏,避免无目的长期保存 |
| 业务记录 | 表单、订单、预约 | 完成用户请求和售后 | 权限、导出、纠错和留存期限 |
清单要覆盖客户端、服务端、日志、缓存、数据库、对象存储、第三方接口和备份。只在前端代码里搜索“手机号”不够,错误追踪、访问日志和数据导出也可能复制个人信息。
二、把“功能需要”写成明确目的
“改善体验”“用于运营”过于宽泛,不能帮助用户判断是否同意。每类数据应对应一个具体功能:
- 配送地址用于计算配送范围和完成配送;
- 手机号用于联系预约用户或发送必要的服务通知;
- 图片用于用户主动提交的资料或头像;
- 位置用于展示附近门店,拒绝后仍可手动选择城市;
- 设备和版本信息用于定位崩溃、兼容性和接口异常。
如果一项数据找不到明确的用户任务,就先不采集。不要因为“将来可能做推荐”而在首次启动时收集位置、通讯录或其他敏感数据。新的数据类型或用途上线前,需要重新检查隐私指引、页面说明、授权时机和服务端字段。
三、后台声明与产品文案必须一致
微信公众平台中的用户隐私保护指引、页面上的隐私协议和代码实际调用,应该描述同一套数据流程。常见问题包括:后台声明收集手机号,但功能已经删除;协议写了位置,却在代码中把位置用于无关分析;页面承诺不保存图片,服务端却把图片放进长期备份。
发布前逐项核对:
- 后台声明的数据类型和实际接口一致;
- 每种数据都有具体用途和必要性说明;
- 页面上的隐私协议名称、链接和后台配置一致;
- 第三方 SDK 的数据采集范围已经纳入清单;
- 拒绝授权时,产品提供了不依赖该数据的替代路径;
- 变更数据类型后,重新测试首次使用、再次使用和已同意用户的行为。
隐私协议不是营销文案,也不能用一段“同意即代表接受所有内容”替代逐项说明。用户需要知道数据用于什么、谁会访问、保存多久以及如何申请删除或更正。
四、用微信隐私授权接口控制时机
微信官方提供 wx.getPrivacySetting 作为辅助接口,用于查询当前用户是否需要进行隐私协议授权;返回的 needAuthorization 会受到后台声明和用户历史同意状态影响。它不是所有场景都必须调用的接口,是否使用要结合实际流程。
当某个功能确实需要隐私授权时,可以调用 wx.requirePrivacyAuthorize。如果用户此前已经同意,接口可以直接成功;如果尚未同意,则会触发隐私授权事件。使用前要按当前基础库和官方文档验证兼容性,不能只在开发者工具里判断完成。
一个简化的流程示例:
function useLocationFeature() {
wx.requirePrivacyAuthorize({
success() {
wx.getLocation({
type: "gcj02",
success(location) {
loadNearbyStores(location.latitude, location.longitude);
},
fail() {
showManualCitySelector();
},
});
},
fail() {
// 用户拒绝或授权流程失败,提供不依赖定位的路径。
showManualCitySelector();
},
});
}
示例中的手动城市选择只是产品替代路径,不代表所有业务都必须提供同样的功能。关键是:用户拒绝非必要数据时,主要功能不应被无关地锁死;如果数据确实是当前功能的必要条件,应清楚说明为什么需要,并允许用户离开或稍后重试。
五、用 wx.onNeedPrivacyAuthorization 处理授权弹窗
如果业务使用隐私相关接口或组件,可以监听 wx.onNeedPrivacyAuthorization。官方流程中,事件回调会提供一个 resolve 函数;开发者应先展示隐私协议和数据用途说明,用户同意或拒绝后再调用 resolve,让原始接口继续或终止。
下面是示意代码,弹窗文案、协议页面和按钮样式需要根据真实产品调整:
let privacyListenerBound = false;
function bindPrivacyAuthorization() {
if (privacyListenerBound) return;
privacyListenerBound = true;
wx.onNeedPrivacyAuthorization((resolve) => {
showPrivacyModal({
onAgree() {
resolve({ event: "agree", buttonId: "agree-btn" });
},
onReject() {
resolve({ event: "disagree" });
},
onOpenContract() {
wx.openPrivacyContract({
fail() {
showToast("隐私协议暂时无法打开");
},
});
},
});
});
}
这段代码的重点不是复制一个固定弹窗,而是确保授权前有可读说明,用户的选择会传给 resolve,协议页面可以打开,拒绝后不会偷偷继续调用敏感接口。wx.openPrivacyContract 的具体支持范围、参数和返回行为应以当前官方文档为准。
六、登录不等于同意收集个人信息
微信小程序登录通常只完成平台身份与本站账号的映射。服务端通过 code2Session 获取用户标识后,应该签发本站会话;这不等于用户自动同意手机号、头像、位置或其他数据采集。
服务端应把身份、会话和个人资料分开建模:
- 用户标识用于账号映射,不能由客户端自报并直接信任;
- 手机号、位置和文件只有在对应功能需要时才保存;
- 会话 Token 与个人资料字段分开管理,日志不记录完整 Token;
- 用户注销或撤回授权后,按业务规则停止继续采集并处理删除;
- 管理后台按角色限制查看和导出个人信息。
接口鉴权和资源权限不能用前端隐藏按钮替代,具体可以参考微信小程序接口安全实战。登录、手机号授权和隐私协议应分别设计失败、拒绝和重新授权路径。
七、服务端按最小范围保存数据
客户端同意授权不代表服务端可以无限期保存。数据库设计时要为每类数据补充用途、来源、创建时间、更新时间、删除标记和访问范围。对不需要长期保存的定位、临时文件和设备信息,可以只保存聚合结果或短期摘要。
访问控制
后台查看用户数据时,至少区分客服、运营、财务、开发和管理员角色。开发人员排查问题时优先使用脱敏数据和请求 ID,不要直接下载完整用户表。导出操作应记录操作者、范围、时间和用途,并设置过期链接或下载权限。
加密与密钥
手机号、地址、身份证明和文件等敏感数据,应根据风险采用传输加密、访问控制、必要的存储加密和密钥轮换。AppSecret、数据库密码、支付密钥和加密密钥只能放在服务端受控配置,不能进入小程序包、普通日志或截图。
删除与更正
删除不能只从当前页面隐藏。需要检查主表、关联表、对象存储、缓存、搜索索引、备份和第三方同步记录,定义哪些数据必须因业务或法律要求留存、哪些可以删除或匿名化。对用户请求要有受理、验证、执行和结果记录。
八、日志、埋点和第三方 SDK 的边界
上线监控需要日志,但监控不能成为隐私采集的借口。日志建议保留请求 ID、接口路径、状态码、耗时、版本和错误分类,避免记录:
- 登录
code、Token、AppSecret、支付签名和密钥; - 手机号、精确位置、身份证号和文件原文;
- 完整 Cookie、带敏感参数的 URL 和通知明文;
- 可以直接复现支付、删除或管理员操作的请求体。
埋点事件应先定义事件名称、触发条件、字段字典、保存期限和访问角色。不要因为“统计转化”就把完整搜索词、表单内容或聊天文本上传到第三方平台。第三方 SDK 的版本、采集字段、域名和退出方式应列入供应商清单,并在版本升级后重新检查。
隐私授权与监控要相互配合:错误事件可以使用匿名设备标识和请求 ID,业务分析优先使用聚合数据;如果某个指标需要个人信息,应说明必要性、用途和留存周期。站内微信小程序上线后怎么监控介绍了版本、错误和性能指标的组织方式,不能把其中的请求链路直接扩展成无限个人画像。
九、拒绝、撤回和异常路径要能用
隐私合规最容易被忽略的是拒绝后的产品体验。至少测试以下场景:
| 场景 | 应有结果 |
|---|---|
| 用户首次拒绝隐私授权 | 不调用对应敏感接口,给出替代路径或明确说明 |
| 用户同意后再次使用 | 不重复打扰,功能正常执行 |
| 用户新增数据类型后再次进入 | 按当前声明重新处理授权 |
| 用户关闭授权弹窗 | 返回页面,不伪造成功状态 |
| 用户拒绝定位 | 可手动选择城市或使用默认范围(如业务允许) |
| 用户拒绝手机号 | 不把手机号授权当成普通浏览的前置条件 |
| 用户请求删除资料 | 校验身份,执行删除或匿名化并返回结果 |
| 第三方 SDK 调用失败 | 不影响不依赖该 SDK 的核心功能 |
| 后台撤回某项数据用途 | 停止相关采集,检查旧数据和缓存处理 |
错误提示不要写成“不同意就无法使用全部功能”这种无差别阻断。对于确实需要手机号、位置或文件的功能,应具体说明哪一步需要该数据,以及用户可以怎样返回或改用其他功能。
十、隐私协议应与版本发布同步
隐私相关改动不能只提交前端代码。每次新增数据类型、第三方服务、用途或保存期限时,至少同步检查:
- 数据清单和服务端字段;
- 微信后台用户隐私保护指引;
- 页面协议、授权弹窗和拒绝文案;
- 代码调用、日志和埋点;
- 数据库权限、备份和删除任务;
- 测试账号、体验版和审核说明;
- 监控告警中是否出现新的个人信息。
版本发布记录应写明变更的数据类型、用途、影响页面、回滚方式和已验证设备。小程序版本存在新旧并行,服务端不能在旧版本仍运行时突然删除必要字段;需要通过兼容期、功能开关或分阶段迁移完成调整。
十一、上线前隐私验收清单
- [ ] 已列出客户端、服务端、日志、缓存、备份和第三方 SDK 的数据流。
- [ ] 每类个人信息都有明确功能目的、必要性和保存期限。
- [ ] 微信后台指引、页面隐私协议和代码实际调用一致。
- [ ] 首次使用、已同意、拒绝、关闭弹窗和新增数据类型都已测试。
- [ ]
wx.getPrivacySetting、wx.requirePrivacyAuthorize和事件监听按当前文档验证。 - [ ] 用户拒绝非必要授权后仍有可用的核心路径。
- [ ] 登录、手机号、位置、头像和文件没有被混成一次性“全部同意”。
- [ ] 服务端按角色限制查看、导出和删除,客户端不能覆盖权限。
- [ ] 日志和埋点已过滤 Token、登录凭证、支付信息和个人信息。
- [ ] 生产密钥、第三方账号和加密密钥不在客户端包、仓库或普通日志中。
- [ ] 已定义撤回、删除、更正、匿名化、备份和第三方同步的处理方式。
- [ ] 隐私改动有版本记录、体验版验证、审核说明和回滚方案。
微信小程序隐私合规不是一张提交审核前的表格,而是数据从采集、传输、存储、使用到删除的完整生命周期。把授权放在真实功能之前,把拒绝和撤回当成正常路径,让服务端按最小范围保存和访问数据,再用版本记录与测试证明改动没有越界,才能让隐私说明真正对应用户看到的产品行为。具体接口、基础库行为和平台规则会变化,发布前应以当前微信官方文档和公众平台配置为准。
评论 (0)
暂无评论,快来抢沙发吧!