- 一个组件解决隐私授权:小程序用户隐私保护授权弹窗组件
项目链接:https://github.com/94xy/miniprogram-privacy 效果预览: [图片] 使用方法: 1、复制项目 [代码]component[代码] 文件夹中的 [代码]privacy[代码] 文件夹到小程序项目中的组件目录; 2 、在 page.json 中引入组件 { "usingComponents": { "Privacy": "/component/privacy/privacy" } } 3 、在 page.wxml 中使用组件,需要授权显示弹窗,不需要不显示 <Privacy /> 4 、可以在所有使用了隐私接口的页面都加上该组件,授权一次之后使用所有隐私接口不再需要授权 跳过阅读: 可以不阅读就点击“同意”按钮 <Privacy skipRead="{{true}}" /> 流程: 页面显示时使用 wx.getPrivacySetting 接口查询是否需要授权,需要授权则显示组件;用户点击“拒绝”直接退出小程序,用户点击“同意”关闭弹窗并同步给微信,之后可以正常使用所有隐私接口。 注意事项: 2023 年 9 月 15 号之前,默认不会启用隐私相关功能,所以检测不到需要弹窗的情况,可以在 app.json 中配置 "__usePrivacyCheck__": true 之后,接口才可以检测到是否需要弹窗。个人实际情况:我在开发者工具中配置了 "__usePrivacyCheck__": true ,needAuthorization 无论如何返回的都是 false,但在真机模拟的情况下可以返回 true自动打开隐私保护指引界面需在「小程序管理后台」配置《小程序用户隐私保护指引》,官方用户隐私保护指引填写说明。 取消授权: 微信中「微信下拉-最近-最近使用的小程序」中删除小程序可取消授权。 开发者工具中「清除模拟器缓存-清除授权数据」可取消授权。
2023-08-28 - 同一页面存在多个video时,video无法正常播放一直在加载转圈
不建议同个页面使用多个video组件,建议不超过3个video,如果要实现video列表功能,请进行优化(image列表,选中时将image替换成video)
2019-08-29 - 小程序意外退出, 请稍候重试
- 当前 Bug 的表现(可附上截图) 通过识别二维码进入图片展示列表页面时, 下拉几屏后会提示"小程序意外退出, 请稍候重试". 但我在手头的华为手机上是一切正常的, 另外一台iphone6s也正常, 难道是iphone6配置太低了? [图片] 已经通过微信内的我->设置->帮助与反馈右上角上报日志的入口把日志上报了. 希望能帮忙查清. 微信号:mingguo 时间点:2019-06-12 12:00左右. - 预期表现 - 复现路径 扫描二维码->展览详情->下拉几屏图片列表->小程序意外退出 可通过以下小程序码进入故障页面 [图片] - 提供一个最简复现 Demo
2019-06-12 - 我的小程序 有的iPhone 进去会闪退,提示“小程序意外退出,请稍后重试,”
iPhone进入小程序的页面之后闪退, 提示“小程序意外退出,请稍后重试,” [图片] 在请求数据的时候就闪退 [图片] [图片]
2018-02-25 - ios上小程序意外退出,请稍后重试,Android没事,如何看到崩溃前的日志
ios上小程序意外退出,请稍后重试,Android没事,如何看到崩溃前的日志,tabbar里面的一个页面使用的逻辑与一个详情页使用的逻辑很相似,都是用swipter左右滑动,并且做了分页,滑动到最后一页的时候自动请求数据,但是在ios的tabbar的首页滑动到第二页最后一条数据的时候就会崩溃,在ios的详情页没事,在安卓上都没事,请问有遇到过的吗,或者如果得到小程序崩溃前的日志
2017-05-19 - 小程序意外退出 请稍后再试 怎么排查原因?
小程序意外退出 请稍后再试 怎么排查原因 是数据量太大 还是dom渲染的问题 告警群也没消息
2022-12-05 - 关于2.21.2 getPhoneNumber安全升级后的完美兼容措施
背景:从基础库 2.21.2 开始,对获取手机号的接口进行了安全升级。 问题: 1、如果直接采用code换手机号,在没有更新基础库的设备上肯定是undefined。 2、PC端上不支持cloudID云函数解密。 3、其他不可告人的原因。 话不多说,直接上代码: index.wxml <button open-type="getPhoneNumber" bindgetphonenumber="onPhoneNumberGet">{{phone ? phone : "请输入手机号码"}}</button> index.js onPhoneNumberGet: function (e) { utils.getPhoneNumber(e, mobile => { console.debug('mobile', mobile) //do something }) } 云函数openapi const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) exports.main = async (event, context) => { switch (event.action) { case 'code2PhoneNumber': {//云函数code换取手机号码 return code2PhoneNumber(event) } default: {//cloudID解密 return event } } } async function code2PhoneNumber(event) {//记得在config.json permissions.openapi 下添加 phonenumber.getPhoneNumber授权 const res = await cloud.openapi.phonenumber.getPhoneNumber({ code: event.code }) return res } utils.js部分 ... const getPhoneNumber = function (e, callback) { if (!e || !e.detail || e.detail.errMsg != 'getPhoneNumber:ok') { toast('请允许我们获取你的手机号') return } if (e.detail.hasOwnProperty('code') && e.detail.code) {//基础库>2.21.2 wx.cloud.callFunction({ name: 'openapi', data: { action: 'code2PhoneNumber', code: e.detail.code } }).then(res => { console.debug('[code2PhoneNumber] 调用成功:', res) if (!res || !res.result || !res.result.phoneInfo) { toast('获取手机号失败') } else if (res.result.hasOwnProperty('errCode') && res.result.errCode != 0) { toast(res.result.errMsg) } else if (callback && typeof callback === 'function') { callback(res.result.phoneInfo.phoneNumber) } }).catch(err => { console.debug('[code2PhoneNumber] 调用失败:', err) }) } else if (e.detail.hasOwnProperty('cloudID') && e.detail.cloudID) {//开通云开发且基础库>2.8.0 PC版不支持 wx.cloud.callFunction({ name: 'openapi', data: { action: 'getPhomeNumber', userInfo: wx.cloud.CloudID(e.detail.cloudID) } }).then(res => { console.debug('[getphonenumber] 调用成功:', res) if (!res || !res.result || !res.result.userInfo) { toast('获取手机号失败') } else if (res.result.userInfo.hasOwnProperty('errCode')) { toast(res.result.userInfo.errMsg) } else if (callback && typeof callback === 'function') { callback(res.result.userInfo.data.phoneNumber) } }).catch(err => { console.debug('[getphonenumber] 调用失败:', err) }) } else if (e.detail.hasOwnProperty('encryptedData') && e.detail.encryptedData) {//非上述条件可自行解密 post('/profile/decrypted', { data: { encryptedData: e.detail.encryptedData, iv: e.detail.iv }, success: res => { if (callback && typeof callback === 'function') { callback(res.phoneNumber) } } }) } else { toast('当前版本不支持该功能') } } ... 接下来就是后端php自行解密接口 /** * 微信小程序加密数据解密/profile/decrypted API * @param string $encryptedData * @param string $iv */ public function decrypted() { //$this->user["session_key"] 在用code2session登录的时候已经跟当前用户建立了对应关系 客户端做好checkSession有效验证即可 $encryptedData = $this->input->post("encryptedData"); $iv = $this->input->post("iv"); if (!$encryptedData) ajax_error("源数据错误"); if (!isset($this->user["session_key"]) || strlen($this->user["session_key"]) != 24) ajax_error("session_key 已过期"); if (strlen($iv) != 24) ajax_error("iv参数错误"); try { $aesKey = base64_decode($this->user["session_key"]); $aesIV = base64_decode($iv); $aesCipher = base64_decode($encryptedData); $result = openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV); $data = json_decode($result, true); if (!$data || $data["watermark"]["appid"] != config_item("appid")) ajax_error("数据解密失败"); ajax($data); } catch (Exception $e) { ajax_error("base64解密失败"); } }
2022-03-07 - 微信消息提醒我审核通过了 显示还是审核中 强制刷新过了
[图片] 微信消息提醒我审核通过了 显示还是审核中 强制刷新过了 [图片]
2022-07-14