当前位置:   article > 正文

uniapp微信小程序用户隐私保护_chooseavatar:fail api scope is not declared in the

chooseavatar:fail api scope is not declared in the privacy agreement

使用wx.requirePrivacyAuthorize实现微信小程序用户隐私保护。

一、前言

微信小程序官方公告《关于小程序隐私保护指引设置的公告》。不处理的话,会导致很多授权无法使用,比如头像昵称、获取手机号、位置、访问相册、上传图片视频、访问剪切板内容等等,具体详见《小程序用户隐私保护指引内容介绍》 。

二、隐私相关设置

1、在 微信公众平台【设置】- 【服务内容与声明】 ,设置用户隐私保护指引,添加项目需要的接口权限。

ps:【用户隐私保护指引】提交之后,官方会进行审核。审核通过之后,对应的接口权限才会生效。

比如:上传头像报错如下。

chooseAvatar:fail api scope is not declared in the privacy agreement。

2、打开uniapp 项目的 manifest.json ,选择【源码视图】, 添加配置如下配置

  1. "mp-weixin": {
  2. "__usePrivacyCheck__": true, //隐私政策
  3. },

3、设置微信开发者工具的调试基础库,最低2.33.0

 

三、解决方案

1)验证用户是否已经隐私授权

使用wx.requirePrivacyAuthorize() 接口,验证用户之前已经同意过隐私授权

  1. onReady() {
  2. var _this = this;
  3. // 隐私政策
  4. wx.getPrivacySetting({
  5. success: res => {
  6. // 返回结果为: res = { needAuthorization: true/false, privacyContractName: '《xxx隐私保护指引》' }
  7. console.log(res)
  8. if (res.needAuthorization) {
  9. // 需要弹出隐私协议
  10. _this.$refs.privacy.privacyShow = true;
  11. return;
  12. } else {
  13. // 用户已经同意过隐私协议,所以不需要再弹出隐私协议,也能调用隐私接口
  14. }
  15. },
  16. fail: () => {},
  17. complete:() => {}
  18. })
  19. },

 如果needAuthorization返回值为true,则需要用户进行隐私授权。

2)index引入组件

  1. <template>
  2. <view>
  3. <!-- 用户隐私保护指引弹窗租金 -->
  4. <UserPrivacy ref="privacy"></UserPrivacy>
  5. </view>
  6. </template>
  7. <script>
  8. import UserPrivacy from "@/components/user/userPrivacy.vue";
  9. export default {
  10. components: {
  11. UserPrivacy
  12. },
  13. data() {
  14. return {
  15. // 隐私设置弹窗开关
  16. privacyShow: false,
  17. }
  18. },
  19. onReady() {
  20. var _this = this;
  21. // #ifdef MP-WEIXIN
  22. // 隐私政策
  23. wx.getPrivacySetting({
  24. success: res => {
  25. // 返回结果为: res = { needAuthorization: true/false, privacyContractName: '《xxx隐私保护指引》' }
  26. console.log(res)
  27. if (res.needAuthorization) {
  28. // 显示用户隐私组件弹窗
  29. _this.$refs.privacy.privacyShow = true;
  30. return;
  31. } else {
  32. // 用户已经同意过隐私协议,所以不需要再弹出隐私协议,也能调用隐私接口
  33. // 调用授权位置接口
  34. _this.getLocation();
  35. }
  36. },
  37. fail: () => {},
  38. complete:() => {}
  39. })
  40. // #endif,
  41. methods: {
  42. // 获取当前位置
  43. getLocation() {
  44. let _this = this;
  45. var mapkey = uni.getStorageSync('webConfig').web_config_str.mapkey;
  46. uni.getFuzzyLocation({
  47. type: 'gcj02', //国测局坐标gcj02
  48. geocode: true, //是否解析地址信息,仅App平台支持
  49. isHighAccuracy: true, //开启高精度定位
  50. success(res) {
  51. console.log('==获取当前位置的经纬度-成功==');
  52. console.log(res);
  53. _this.longitude = res.longitude;
  54. _this.latitude = res.latitude;
  55. // 设置经纬度缓存
  56. uni.setStorageSync('longitude', res.longitude);
  57. uni.setStorageSync('latitude', res.latitude);
  58. // 引入腾讯地图SDK核心类
  59. var QQMapWX = require('@/util/qqmap-wx-jssdk.min.js');
  60. var qqmapsdk = new QQMapWX({
  61. key: mapkey,
  62. });
  63. // 根据经纬度获取所在位置
  64. qqmapsdk.reverseGeocoder({
  65. location: {
  66. longitude: res.longitude,
  67. latitude: res.latitude,
  68. },
  69. success: function(res) {
  70. console.log("==根据经纬度获取所在位置==");
  71. console.log(res);
  72. _this.city = res.result.ad_info.city;
  73. // 设置城市缓存
  74. uni.setStorageSync('province', res.result.ad_info.province);
  75. uni.setStorageSync('city', res.result.ad_info.city);
  76. uni.setStorageSync('district', res.result.ad_info.district);
  77. uni.setStorageSync('address', res.result.address);
  78. }
  79. });
  80. },
  81. fail(err) {
  82. console.log('获取当前位置的经纬度-失败');
  83. // 设置默认城市、经纬度
  84. }
  85. });
  86. },
  87. }
  88. }
  89. </script>

3)  弹窗组件代码

  1. <template>
  2. <view>
  3. <!-- 隐私保护指引弹窗 -->
  4. <u-popup v-model="privacyShow" mode="center" width="600rpx" border-radius="20" :mask-close-able="false">
  5. <view class="privacyBox">
  6. <view class="privacyTit">用户隐私保护提示</view>
  7. <view class="privacyDesc">
  8. 感谢您的使用,在使用本小程序前,应当阅读并同意<text
  9. @click="openClick">《用户隐私保护指引》</text>。当您点击同意并开始使用程序服务时,即表示您已理解并同意该条款内容,该条款将对您产生法律约束力。如您拒绝,将无法进入小程序。
  10. </view>
  11. <view class="privacyPost">
  12. <view class="refuseBtn">
  13. <navigator target="miniProgram" open-type="exit">不同意并退出</navigator>
  14. </view>
  15. <button class="agreeBtn" open-type="agreePrivacyAuthorization"
  16. @agreeprivacyauthorization="agreeClick">同意并继续</button>
  17. </view>
  18. </view>
  19. </u-popup>
  20. </view>
  21. </template>
  22. <script>
  23. export default {
  24. data() {
  25. return {
  26. // 隐私设置弹窗开关
  27. privacyShow: false,
  28. }
  29. },
  30. onReady() {
  31. },
  32. methods: {
  33. // 打开隐私协议
  34. openClick() {
  35. wx.openPrivacyContract({
  36. success: () => {}, // 打开成功
  37. fail: () => {}, // 打开失败
  38. complete: () => {}
  39. })
  40. },
  41. // 同意
  42. agreeClick() {
  43. // 用户点击了同意,之后所有已声明过的隐私接口和组件都可以调用了
  44. this.privacyShow = false;
  45. // 重新授权定位,调取父组件方法
  46. this.$parent.getLocation();
  47. },
  48. }
  49. }
  50. </script>
  51. <style scoped lang="scss">
  52. .privacyBox {
  53. width: 600rpx;
  54. padding: 60rpx;
  55. box-sizing: border-box;
  56. }
  57. .privacyTit {
  58. font-size: 32rpx;
  59. font-weight: bold;
  60. color: $uni-text-main;
  61. text-align: center;
  62. overflow: hidden;
  63. }
  64. .privacyDesc {
  65. font-size: 28rpx;
  66. color: $uni-text-sub;
  67. overflow: hidden;
  68. margin-top: 30rpx;
  69. }
  70. .privacyDesc text {
  71. color: $uni-primary;
  72. }
  73. .privacyPost {
  74. overflow: hidden;
  75. margin-top: 60rpx;
  76. display: flex;
  77. justify-content: center;
  78. align-items: center;
  79. }
  80. .privacyPost .refuseBtn {
  81. flex: 1;
  82. height: 80rpx;
  83. line-height: 80rpx;
  84. text-align: center;
  85. font-size: 28rpx;
  86. font-weight: bold;
  87. color: #fff;
  88. background: $uni-info-dark;
  89. border-radius: 40rpx;
  90. box-sizing: border-box;
  91. overflow: hidden;
  92. }
  93. .privacyPost .agreeBtn {
  94. flex: 1;
  95. height: 80rpx;
  96. line-height: 80rpx;
  97. text-align: center;
  98. font-size: 28rpx;
  99. font-weight: bold;
  100. color: #fff;
  101. background: $uni-primary;
  102. border-radius: 40rpx;
  103. box-sizing: border-box;
  104. overflow: hidden;
  105. margin-left: 20rpx;
  106. }
  107. </style>

 ps:弹窗组件框架,demo用的uView1版本。底层遮罩样式,可自行用view代替。

4)弹窗效果图

参考示例:悦玩悦乐自助棋牌室、快洗坊自助洗车。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/292281
推荐阅读
相关标签
  

闽ICP备14008679号