评论

《小程序隐私保护指引》开发指南

微信要求 2023 年9 月 15 日前必须接入小程序隐私保护指引的授权弹窗。如果没有接入、或者用户不同意,则无法使用相关接口。

2024年4月26日 更新:

基础库 3.4.2 更新 API 有授权弹窗的隐私接口(例如 wx.getLocation),将不会再弹官方隐私弹窗,而是在授权弹窗上增加“隐私勾选”;无授权弹窗的隐私接口(如 wx.getClipboardData),将继续保留原来的官方隐私弹窗


2023年12月25日 更新:

未授权时,input type="nickname" 会自动降级为 input type="text"

且 input 无法拉起官方隐私授权弹窗,需要按开发步骤 4、5 自行处理


2023年10月19日 更新:

已经过了官方公告的 10 月 17 日了,线上依然未生效。除非在 app.json 中手动配置 "__usePrivacyCheck__": true 来开启。

目前的处理方式为,把报错信息转换为中文

if (message.match('privacy permission is not authorized'))

message = '授权失败,请同意《用户隐私保护指引》'


2023年9月14日 更新:

可以不开发,直接使用系统弹窗,见图 3 。生效日期延长到 10 月 17日了。

《墨问便签》目前已回退了版本。

https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html#六、官方隐私弹窗功能说明

官方公告里目前的机制,目前还没生效上线,但看起来有 2 个坑:

1. 必须 wx.onNeedPrivacyAuthorization 上报,才能弹自定义弹窗。

意味着方案 1,如果用户取消授权了,是没有上报的,只能选择执行退出小程序。

否则调用隐私接口时,系统弹窗会出现。

2. 用户取消授权后,间隔 10s,才能再次请求授权。

意味着 10s 内功能不可用,需要给用户一个提示语。而系统默认的报错不会 toast,以及报错信息是英语,用户也看不懂呀。

———————


总体思路:

目前有两个方案可供选择

1. 小程序启动时,弹出,拒绝后直接退出小程序(只用 wx.getPrivacySetting 即可)

2. 调用隐私接口前,弹出,同意后才调用隐私接口(不用 wx.getPrivacySetting,需要使用 wx.requirePrivacyAuthorize 和 wx.onNeedPrivacyAuthorization)

推荐方案 2,下面具体说说

事前准备:

1. 在文档中查看是否使用了相关隐私接口

https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/miniprogram-intro.html

2. 在「小程序管理后台」设置《小程序用户隐私保护指引》

见图 1,具体位置是:小程序后台 - 设置 - 基本设置 - 服务内容声明 - 用户隐私保护指引

3. 如果有用到隐私接口,则需要进行小程序开发。如果没有用到隐私接口,则无需开发

实际运行的流程为:

1. 发起授权 wx.requirePrivacyAuthorize


2. 触发授权事件 wx.onNeedPrivacyAuthorization


3. 弹窗,用户点击同意或拒绝

执行第 2 步的回调函数的 resolve 方法


4. 继续或终止流程

执行第 1 步的回调函数的 success 或者 fail 方法


5. 如果继续流程,调用隐私相关 api(录音、相册等等)或者 input (微信昵称)去聚焦


开发步骤:

开发前,先在小程序 app.json 配置中添加 "__usePrivacyCheck__": true


1. 开发弹窗,并且在需要的页面注册使用。“同意” 按钮需要符合规范

同意

不同意


如果需要查看隐私协议,可以使用 wx.openPrivacyContract({})



2. 使用 wxToPromise 方法,便于使用 await 处理相关接口

function wxToPromise (api, option) {
  // API 存在判断
  if (!api) {
    wx.showModal({
      title: '提示',
      content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
    })

    return Promise.reject()
  }

  return new Promise((resolve) => {
    api({
      ...option,
      success (res) {
        resolve([res, undefined])
      },
      fail (err) {
        resolve([undefined, err])
      },
    })
  })
}


3. app.ts 里在 onLaunch 方法里添加触发授权事件监听

// 导入弹窗的弹出方法
import { showModal } from './components/modal/showModal'

// 需要用户同意隐私授权时
if (wx.onNeedPrivacyAuthorization)
wx.onNeedPrivacyAuthorization(async (resolve) => {
  // 触发弹窗
  const [res] = await wxToPromise(showModal, {
    title: '个人信息保护提示',
  })

  // 点击同意
  if (res?.confirm) {
    resolve({
      buttonId: 'agree-btn',
      event: 'agree'
    })

  // 点击拒绝
  } else if (res?.cancel) {
    resolve({
      buttonId: 'disagree-btn',
      event: 'disagree'
    })
  }
})


4. 封装请求隐私授权方法

import { wxToPromise } from './wxToPromise'

/**
 * 请求隐私授权
 * @return 是否已授权
 */
export const requirePrivacyAuthorize = async () => {
  if (typeof wx.requirePrivacyAuthorize === 'function') {
    const [res] = await wxToPromise(wx.requirePrivacyAuthorize)
    if (res) return true

  // < 2.33.2 基础库,无 api 默认已授权
  } else {
    return true
  }

  return false
}


5. 业务页面触发隐私授权,并且在回调里调用隐私接口

例如处理微信昵称时

// wxml

  用户昵称
  


// js

/**
* 请求隐私授权
* 未授权时,input type="nickname" 会自动降级为 input type="text"
*/
async requirePrivacyAuthorize () {
  if (wx.requirePrivacyAuthorize) {
    [res, err] = await wxToPromise(wx.requirePrivacyAuthorize)
    if (res) // 成功 - 继续调用隐私接口
    if (err) // 失败 - 终止流程,或者走兜底方案
  }

  // PC 端 api 不存在,可以继续调用隐私接口
  // 成功后去聚焦,失败后降级为普通文本框,依然去聚焦
  this.setData({nickNameInputFocus: true})
}


如果只需要成功后,才执行后续逻辑。失败时不执行。

可以这样写:

async requirePrivacyAuthorize () {
  // 请求隐私授权
  if (!await requirePrivacyAuthorize()) return
  this.setData({nickNameInputFocus: true})
}


例外情况,无需主动调用 requirePrivacyAuthorize,也能正常触发 wx.onNeedPrivacyAuthorization:

1. 写入剪贴板:wx.setClipboardData

2. 读取剪贴板:wx.getClipboardData

3. 获取微信头像:


常见问题:

1. 已经同意过隐私协议,如何清除掉状态?

答:把最近使用中的小程序删除


2. 如果不同意隐私协议,下次调用隐私接口时,还能触发 onNeedPrivacyAuthorization 吗?

答:可以


3. onNeedPrivacyAuthorization 多次注册,会重复监听吗?

答:会的,所以只在 app.js 里启动小程序时注册一次


4. 如果不使用 requirePrivacyAuthorize 主动触发,隐私协议和权限弹窗,哪个会先弹?

答:权限弹窗会先弹。如果拒绝权限后,不会弹隐私协议(onNeedPrivacyAuthorization 无法触发)


5. 隐私协议需要每个权限都弹一次吗?

答:如果用户同意了,则只弹一次,后续不再弹出,除非移除了小程序。如果用户一直拒绝,则需要每次调用权限之前弹出。


6. 以前我记得写入相册是系统弹窗,现在要改成自己写弹窗吗,还是说两个都要弹?

答:如果没有同意过隐私协议,并且没有授权过权限,两个都弹。


7. 如果版本是2.32.3 以下(不含)是否可以使用button的agreePrivacyAuthorization进行上报?

答:从基础库 2.32.3 开始,需要做适配的。这个基础库以下的版本,没有新增的几个 API,也就不需要做隐私协议的开发适配。只需要使用 if 判断下有没有方法就行。


例如:typeof wx.getPrivacySetting === 'function'

在 2.32.3 以下(不含),会返回 false,就直接跳过相关的隐私协议逻辑,不处理


8. 可以直接调用隐私接口吗?

答:可以但不建议。原因是有个 [bug] wx.onNeedPrivacyAuthorization 在原有授权弹窗之后触发的

https://developers.weixin.qq.com/community/develop/doc/000042e44347a0a201308a5de61800


9. PC 端如何处理?

答:PC 基础库虽然达到 2.32.3 了但目前没有 wx.getPrivacySetting 等新增的方法,因此目前无需处理


10. 企业微信环境里的小程序需要调整吗?

答:企业微信小程序,基础库比较落后,现在不需要。等基础库自动升级后,未来是需要的


11. 关于小程序隐私保护指引设置的公告,是否包括小程序里嵌入的h5页面?

A:暂不包括



相关资料地址:


官方 FAQ:

https://developers.weixin.qq.com/community/develop/article/doc/000c648556cb40603e406c0ac6b013


关于小程序隐私保护指引设置的公告

https://developers.weixin.qq.com/community/develop/doc/00042e3ef54940ce8520e38db61801


小程序隐私协议开发指南

https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html


最后一次编辑于  04-26  
点赞 7
收藏
评论

11 个评论

  • 夏味
    夏味
    2023-08-28

    欢迎来《墨问便签》小程序关注我

    

    2023-08-28
    赞同
    回复 2

正在加载...

登录 后发表内容