uni - 微信小程序 自定义隐私协议弹窗

2023年9月15日后,微信小程序隐私协议更新,获取用户隐私信息或访问相册需授权。父组件使用特定组件会自动查询权限,无权限则调出授权弹框,首次调用getPrivacySetting会返回结果,父组件还可手动打开授权弹框。

  2023年9月15日之后 微信小程序 隐私协议更新,需要主动查询隐私授权同步状态以及展示隐私协议

获取用户隐私信息,或者访问相册都需要授权后才能通过

在父组件页面用此组件后会自动查询有没有权限,如果没权限会自动调出授权弹框

在第一次调用的时候getPrivacySetting 都会调用 exit 返回给父组件。true为同意,false 为解决

在父组件可以使用 this.$refs.privacy.openShow() 手动打开授权弹框 住:需要在组件上写 ref=privacy

<template>
  <u-popup v-model="showPrivacy" mode="center" border-radius="16" width="650rpx" :mask-close-able="false">
    <div class="box">
      <div class="title"> xxxx 隐私保护指引</div>
      <div class="des">
        在使用当前小程序服务之前,请仔细阅读<text class="link" @tap="openPrivacyContract">{{ privacyContractName }}</text>。如你同意{{ privacyContractName }},请点击“同意”开始使用。
      </div>
      <view class="btns">
        <button class="item reject" @tap="exitMiniProgram">拒绝</button>
        <button id="agree-btn" class="item agree" open-type="agreePrivacyAuthorization" @agreeprivacyauthorization="handleAgreePrivacyAuthorization">同意</button>
      </view>
    </div>
  </u-popup>
</template>

<script>
// exit 事件返回 是否同意授权 true同意 false解决
// this.$refs.privacy.openShow() 父组件调用 ref=privacy
export default {
  props: {},
  data() {
    return {
      privacyContractName: '',
      showPrivacy: false
    }
  },
  created() {
    this.init()
  },
  methods: {
    init() {
      const _ = this
      wx.getPrivacySetting({ // 获取用户有没有授权过
        success(res) {
          console.log(res)
          if (res.errMsg === 'getPrivacySetting:ok') {
            _.privacyContractName = res.privacyContractName // 协议名称
            _.showPrivacy = res.needAuthorization
            if (res.needAuthorization) {
              _.$emit('exit', false)
            } else {
              _.$emit('exit', true)
            }
          }
        }
      })
    },
    openPrivacyContract() {
      const _ = this
      wx.openPrivacyContract({ // 跳转到隐私协议页面
        fail: () => {
          wx.showToast({
            title: '遇到错误',
            icon: 'error'
          })
        }
      })
    },
    // 拒绝隐私协议
    exitMiniProgram() {
      // 直接退出小程序
      // wx.exitMiniProgram()
      this.showPrivacy = false
      this.$emit('exit', false)
    },
    openShow() {
      this.showPrivacy = true
    },
    // 同意协议
    handleAgreePrivacyAuthorization() {
      this.showPrivacy = false
      this.$emit('exit', true)
    }
  }
}
</script>

<style scoped lang="scss">
.box{
  padding: 45rpx;
  .title{
    text-align: center;
    font-weight: 700;
    font-size: 30rpx;
  }
  .des {
    font-size: 26rpx;
    color: #666;
    margin-top: 40rpx;
    text-align: justify;
    line-height: 1.6;
    .link {
      color: #013369;
      text-decoration: underline;
    }
  }
  .btns {
    margin-top: 48rpx;
    display: flex;
    .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;
    }
    .reject {
      background: #f4f4f5;
      color: #909399;
    }
    .agree {
      background: #013369;
      color: #fff;
    }
  }

  button{
    &::after{
      border: none;
    }
  }
}
</style>

<think> 首先,用户的问题是:“我想查找微信小程序先展示隐私协议再获取电话号码的相关方法或实现方案 请问微信小程序先展示隐私协议后获取电话号码的实现方法”。这涉及到微信小程序隐私协议和获取电话号码的功能。 从引用中,我有几个相关引用: - 引用[1]:微信小程序隐私协议开发指南,提到需要在小程序后台配置隐私保护指引,并提交审核。然后,在开发端需要调用隐私协议的API。 - 引用[2]:微信小程序新版隐私协议弹窗实现,提到使用`uni.openPrivacyContract()`来打开隐私协议详情页面。 - 引用[3]:uniapp开发微信小程序新版隐私协议,提到使用button组件的`open-type="agreePrivacyAuthorization"`来记录用户同意。 - 引用[4]:微信小程序隐私授权实践,提到对于input组件,需要手动调用`wx.requirePrivacyAuthorization`来显示弹窗。 用户的具体需求是先展示隐私协议,然后获取电话号码。在微信小程序中,获取电话号码通常通过button组件的`open-type="getPhoneNumber"`来实现,但这需要用户同意隐私协议。 关键点是:微信要求在小程序使用某些敏感API(如获取电话号码)之前,必须获得用户的隐私授权。 实现步骤应该包括: 1. 配置隐私协议:在小程序后台设置隐私保护指引并提交审核(如引用[1]所述)。 2. 在用户需要获取电话号码时,先检查隐私授权状态。如果未授权,则展示隐私协议弹窗。 3. 用户同意隐私协议后,再调用获取电话号码的功能。 从引用中,获取电话号码通常使用button的`open-type="getPhoneNumber"`,但这可能直接触发获取,而不涉及隐私协议。因此,需要结合隐私授权机制。 引用[4]提到对于input组件,手动调用`wx.requirePrivacyAuthorization`来显示默认弹窗。类似地,对于获取电话号码,我们需要确保隐私协议已同意。 具体实现方法: - 使用`wx.requirePrivacyAuthorization`方法来显示隐私授权弹窗(在用户未同意时)。 - 在用户同意后,再执行获取电话号码的逻辑。 但`wx.requirePrivacyAuthorization`是用于显示默认的隐私授权弹窗的,它会要求用户同意隐私协议。 然后,对于获取电话号码,我们可以使用button组件的`open-type="getPhoneNumber"`,但我们需要确保在用户同意隐私协议后才启用这个button。 所以,一个可能的流程: 1. 当用户进入页面时,检查隐私授权状态。可以使用`wx.getPrivacySetting`来获取状态(尽管这个API可能被废弃或更改,具体看微信官方文档)。 2. 如果用户没有同意隐私协议,显示一个button或弹窗来引导用户同意。 3. 用户点击同意按钮时,调用`wx.requirePrivacyAuthorization`来显示授权弹窗。 4. 在用户同意后,启用获取电话号码的button。 5. 用户点击获取电话号码button时,触发`getPhoneNumber`事件。 在代码中,使用uniapp(因为引用[2]和[3]提到uni),但原理相同。 步骤: - 在页面的onLoad或类似生命周期中,检查隐私授权状态。 - 使用`uni.getPrivacySetting`(在uni-app中)或`wx.getPrivacySetting`来获取状态。 - 如果`needAuthorization`为true,表示需要授权。 - 然后,可以显示一个自定义弹窗或直接调用`uni.requirePrivacyAuthorization`(在uni-app中)或`wx.requirePrivacyAuthorization`来显示弹窗- 用户同意后,在success回调中,启用获取电话号码的功能。 - 对于获取电话号码,使用button组件:`<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">获取手机号</button>`,但初始时可能需要禁用,直到同意隐私协议。 在微信小程序中,button的`open-type="getPhoneNumber"`会自动检查隐私授权,但根据微信的规则,如果未授权,它可能会触发隐私授权弹窗。但用户要求先展示隐私协议再获取,所以可能需要手动控制。 引用[3]提到,对于隐私授权,可以使用button的`open-type="agreePrivacyAuthorization"`来记录同意。但`agreePrivacyAuthorization`是用于同意隐私协议的,而`getPhoneNumber`是用于获取电话号码的。 所以,一个方法是: - 先让用户同意隐私协议,使用一个button:`<button open-type="agreePrivacyAuthorization" @agreeprivacyauthorization="onAgree">同意隐私协议</button>`。 - 在`onAgree`事件中,记录用户已同意。 - 然后,显示获取电话号码的button。 在获取电话号码button上,`open-type="getPhoneNumber"`,它应该在用户同意隐私协议后才显示。 代码示例(基于uni-app): ```html <template> <view> <!-- 如果未同意隐私协议,显示同意按钮 --> <button v-if="!agreed" open-type="agreePrivacyAuthorization" @agreeprivacyauthorization="handleAgree">同意隐私协议</button> <!-- 如果已同意,显示获取电话号码按钮 --> <button v-if="agreed" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">获取手机号</button> </view> </template> <script> export default { data() { return { agreed: false // 初始未同意 }; }, methods: { handleAgree(e) { // 用户点击同意隐私协议按钮 this.agreed = true; // 设置已同意 }, getPhoneNumber(e) { // 处理获取电话号码事件 console.log(e.detail); // 这里可以调用后端接口解密手机号等 } } }; </script> ``` 但需要注意,`open-type="agreePrivacyAuthorization"`是微信小程序提供的用于同意隐私授权的button类型。当用户点击时,微信会自动记录同意状态。 在handleAgree中,我们可以设置一个状态来控制UI。 另外,引用[2]提到可以使用`uni.openPrivacyContract()`来打开隐私协议详情页面,但这不是授权,而是查看详情。 对于授权,`agreePrivacyAuthorization`是用于同意的。 此外,引用[4]提到对于input组件手动调用`wx.requirePrivacyAuthorization`,但这里我们使用button。 在获取电话号码时,如果隐私协议未同意,`getPhoneNumber`事件可能不会触发,或者会先弹出授权弹窗。但为了确保“先展示隐私协议”,我们主动控制流程。 在页面加载时,检查隐私授权状态: ```js onLoad() { uni.getPrivacySetting({ success: (res) => { if (res.needAuthorization) { // 需要授权,但这里不自动弹窗,而是显示同意按钮 this.agreed = false; } else { this.agreed = true; } } }); } ``` 然后,在同意按钮点击后,用户同意,我们在回调中设置agreed=true。 这样,获取电话号码的button只在同意后显示。 如果用户没有点击同意按钮,但直接点击获取电话号码按钮,可能会触发授权弹窗,但通过控制button的显示,我们确保只有同意隐私协议后才能看到获取电话号码的button。 在handleAgree中,我们不需要做太多,因为button的open-type会自动处理同意记录。 现在,回答用户的问题: 结构要清晰: 1. 先解释需要在小程序后台配置隐私协议(参考引用[1])。 2. 然后在开发中实现先展示隐私协议再获取电话号码。 3. 提供代码示例。 4. 确保使用中文。 5. 生成相关问题(根据系统指令)。 6. 在引用段落末尾添加引用标识。 引用相关部分: - 关于后台配置:引用[1] - 关于隐私协议弹窗:引用[2]和[3] - 关于手动调用授权:引用[4] 实现方案: - 步骤1:在小程序后台设置隐私保护指引并提交审核(必须步骤)。 - 步骤2:在小程序前端代码中,使用button组件的`open-type="agreePrivacyAuthorization"`来让用户同意隐私协议- 步骤3:只有在用户同意后,显示获取电话号码的button(`open-type="getPhoneNumber"`)。 代码示例使用uni-app,因为引用中提到uni,但如果是原生微信小程序,替换uni为wx。 在回答中,提供原生微信小程序的代码,因为用户问题没有指定框架。 原生微信小程序代码: ```html <view> <button wx:if="{{!agreed}}" open-type="agreePrivacyAuthorization" bindagreeprivacyauthorization="handleAgree">同意隐私协议</button> <button wx:if="{{agreed}}" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button> </view> ``` ```js Page({ data: { agreed: false }, onLoad() { // 检查隐私授权状态 wx.getPrivacySetting({ success: (res) => { if (res.needAuthorization) { this.setData({ agreed: false }); } else { this.setData({ agreed: true }); } } }); }, handleAgree(e) { // 用户同意隐私协议后 this.setData({ agreed: true }); }, getPhoneNumber(e) { // 处理获取电话号码事件 console.log(e.detail); } }); ``` 在handleAgree中,当用户点击同意按钮,微信会弹出授权弹窗,用户同意后,触发这个事件。在事件中,我们设置agreed为true,然后显示获取电话号码按钮。 如果用户之前已经同意过,agreed直接为true。 这样,用户必须先点击同意隐私协议按钮,同意后,才能看到获取电话号码按钮。 确保隐私协议内容已配置。 最后,生成相关问题。 相关问题示例: 1. 如何在小程序后台配置隐私保护指引? 2. 如何处理获取电话号码后的解密过程? 3. 隐私协议授权失败时如何处理? </think>### 微信小程序先展示隐私协议后获取电话号码的实现方法 在微信小程序中,实现先展示隐私协议再获取电话号码的功能,需要结合微信的隐私协议授权机制和获取电话号码的API。以下是详细步骤和实现方案,基于微信官方文档和开发实践[^1][^2][^3][^4]。 --- ### 一、前置条件:配置隐私协议 在开发前,必须在小程序后台完成隐私协议配置: 1. 登录[微信小程序管理后台](https://mp.weixin.qq.com/) 2. 进入**设置 > 服务内容声明 > 用户隐私保护指引** 3. 填写隐私协议内容并提交审核(审核通过后才能生效)[^1] 4. 在代码中声明使用的隐私相关接口(如`getPhoneNumber`) --- ### 二、实现步骤与代码示例 核心逻辑:先通过隐私授权按钮让用户同意协议,再显示获取电话号码功能。以下是原生微信小程序实现方案: #### 1. 页面布局(WXML) ```html <view> <!-- 步骤1: 展示隐私协议 --> <view wx:if="{{!hasAgreed}}"> <text>请先阅读并同意隐私协议</text> <button open-type="agreePrivacyAuthorization" bindagreeprivacyauthorization="handleAgree" > 同意隐私协议 </button> <button bindtap="openPrivacyDetail">查看协议详情</button> </view> <!-- 步骤2: 同意后显示获取电话号码按钮 --> <view wx:if="{{hasAgreed}}"> <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber" > 获取手机号 </button> </view> </view> ``` #### 2. 逻辑处理(JS) ```javascript Page({ data: { hasAgreed: false // 初始状态:未同意协议 }, onLoad() { // 检查用户是否已同意过隐私协议 wx.getPrivacySetting({ success: (res) => { if (!res.needAuthorization) { this.setData({ hasAgreed: true }); // 已同意则直接启用功能 } } }); }, // 用户点击同意隐私协议 handleAgree(e) { this.setData({ hasAgreed: true }); // 更新状态 }, // 打开隐私协议详情页 openPrivacyDetail() { wx.openPrivacyContract(); // 调用微信内置协议弹窗[^2] }, // 获取电话号码回调 getPhoneNumber(e) { if (e.detail.errMsg === 'getPhoneNumber:ok') { const { code } = e.detail; // 获取临时code wx.request({ url: '你的后端接口地址', data: { code }, success: (res) => { console.log('解密后的手机号:', res.data.phoneNumber); } }); } else { console.error('获取失败:', e.detail); } } }); ``` --- ### 三、关键点说明 1. **隐私授权机制**: - 使用`open-type="agreePrivacyAuthorization"`的按钮记录用户同意(微信自动处理授权状态)[^3]。 - 通过`wx.getPrivacySetting()`检查历史授权状态,避免重复弹窗。 2. **获取电话号码**: - 仅在`hasAgreed=true`时显示获取按钮。 - 需后端配合解密`code`(微信不直接返回手机号)[^4]。 3. **兼容性**: - 在`app.json`中声明`"requiredPrivateInfos": ["getPhoneNumber"]`。 - 基础库要求:≥ 2.32.0 版本。 --- ### 四、注意事项 1. **审核要求**:未提交隐私协议审核的小程序无法使用敏感接口[^1]。 2. **错误处理**: - 监听`getPhoneNumber`的`fail`事件,处理用户拒绝授权场景。 - 使用`wx.requirePrivacyAuthorization()`可手动触发默认弹窗(适用于非按钮场景,如表单输入)[^4]。 3. **性能优化**:首次加载时检查授权状态,避免不必要的UI闪烁。 通过此方案,用户必须先明确同意隐私协议,才能触发获取电话号码操作,符合微信的合规要求[^1][^2][^3]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值