App 2.0开发模式的行业看法
116
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小时内删除侵权内容。