App 2.0开发模式的行业看法
67
2025-02-14
// app.json 中声明所需权限 { "permission": { "scope.userLocation": { "desc": "用于为您提供附近的商家信息" }, "scope.writePhotosAlbum": { "desc": "用于保存生成的图片到相册" } } }
// 检查位置权限状态 wx.getSetting({ success(res) { if (!res.authSetting['scope.userLocation']) { wx.authorize({ scope: 'scope.userLocation', success() { console.log('授权成功') }, fail() { console.log('授权拒绝') } }) } } }) // 新版API调用示例(需处理异步逻辑) const checkPermission = async () => { try { const { authSetting } = await wx.getSetting(); if (!authSetting['scope.userLocation']) { const { confirm } = await wx.showModal({ title: '权限申请', content: '需要获取位置信息以提供服务' }); if (confirm) { await wx.openSetting(); } } } catch (err) { console.error('权限检查异常:', err); } };
使用<button open-type="openSetting">
触发授权弹窗
对敏感权限(如位置、通讯录)进行二次确认
提供「暂不授权」的友好引导路径
wx.request({ url: 'https://api.example.com/userinfo', method: 'POST', data: { encryptedData: wx.getStorageSync('session_key'), // 使用会话密钥加密 iv: '加密向量' }, success(res) { if (res.statusCode === 200) { console.log('加密数据传输成功'); } } });
// 使用AES加密算法处理敏感数据 const CryptoJS = require('crypto-js'); const encryptData = (data, key) => { const ciphertext = CryptoJS.AES.encrypt( JSON.stringify(data), CryptoJS.enc.Utf8.parse(key), { mode: CryptoJS.mode.ECB } ).toString(); return ciphertext; }; // 存储示例 const userInfo = { phone: '13800138000', idCard: '110101199003072XXX' }; const encrypted = encryptData(userInfo, 'your-secret-key-123'); wx.setStorageSync('encrypted_user', encrypted);
<view class="phone-number"> {{ phoneNumber ? phoneNumber.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2') : '未绑定' }} </view>
// app.js 启动逻辑 App({ onLaunch() { const agreed = wx.getStorageSync('privacy_agreed'); if (!agreed) { wx.showModal({ title: '隐私协议', content: '请阅读并同意《用户隐私政策》', confirmText: '同意', cancelText: '拒绝', success(res) { if (res.confirm) { wx.setStorageSync('privacy_agreed', true); } else { wx.exitMiniProgram(); } } }); } } });
<web-view src="{{privacyUrl}}"></web-view>
Page({ data: { privacyUrl: '' }, onLoad() { this.setData({ privacyUrl: 'https://static.example.com/privacy.html?v=' + Date.now() }); } });
// 过滤用户输入内容 const sanitizeHTML = (str) => { return str.replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, '''); }; // 渲染时使用text而非html <view>{{ sanitizedContent }}</view>
// 生成请求签名 const generateSign = (params, secret) => { const sortedParams = Object.keys(params).sort().map(key => `${key}=${params[key]}`).join('&'); return CryptoJS.HmacSHA256(sortedParams, secret).toString(CryptoJS.enc.Hex); }; // 请求示例 const requestWithSign = () => { const timestamp = Date.now(); const nonce = Math.random().toString(36).substr(2); const params = { userId: '123', timestamp, nonce }; params.sign = generateSign(params, 'your-api-secret'); wx.request({ url: 'https://api.example.com/data', data: params }); };
// 检查本地存储敏感字段 const checkStorage = () => { const storageKeys = wx.getStorageInfoSync().keys; const sensitiveKeys = ['password', 'token', 'id_card']; return storageKeys.some(key => sensitiveKeys.includes(key)); }; // 执行检测 if (checkStorage()) { console.error('检测到敏感数据明文存储!'); wx.removeStorageSync('password'); }
# GitHub Actions 示例 name: Privacy Check on: [push] jobs: security-audit: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Run Security Scan run: | npm install -g miniprogram-security-scanner mpscan --dir ./src --rules privacy,runtime
// 服务端删除接口(Node.js示例) app.delete('/user/:id', async (req, res) => { try { await User.destroy({ where: { id: req.params.id } }); await Logs.destroy({ where: { userId: req.params.id } }); res.json({ code: 200, message: '数据已删除' }); } catch (err) { res.status(500).json({ code: 500, message: '删除失败' }); } }); // 小程序端调用 wx.request({ url: 'https://api.example.com/user/123', method: 'DELETE', success() { wx.showToast({ title: '账号已注销' }); } });
// 设置带过期时间的缓存 const setExpiringStorage = (key, value, expireDays) => { wx.setStorageSync(key, { data: value, expire: Date.now() + expireDays * 86400000 }); }; // 读取时检查过期 const getExpiringStorage = (key) => { const item = wx.getStorageSync(key); if (item && Date.now() < item.expire) { return item.data; } wx.removeStorageSync(key); return null; };
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。