步骤1:获取用户加密数据和签名:
用户点击授权按钮后,通过 wx.getUserInfo 获取到加密数据和签名。
wx.getUserInfo({
success: function(res) {
const encryptedData = res.encryptedData;
const iv = res.iv;
const signature = res.signature;
// 其他处理...
},
fail: function(err) {
console.error('获取用户信息失败:', err);
}
});
步骤2:发起网络请求向微信开放平台校验数据:
将获取到的加密数据、IV(初始向量)和签名发送到微信开放平台的服务器进行校验。
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session',
method: 'GET',
data: {
appid: '你的小程序AppID',
secret: '你的小程序AppSecret',
js_code: '用户登录获取的code',
grant_type: 'authorization_code'
},
success: function (res) {
const sessionKey = res.data.session_key;
// 将获取到的 sessionKey、加密数据和 IV 发送到后台服务器
// 后台服务器通过 sessionKey 解密加密数据
// 具体的解密算法可参考微信小程序官方文档
},
fail: function (err) {
console.error('校验数据失败:', err);
}
});
步骤3:后台服务器进行解密:
在后台服务器中,通过微信提供的解密算法,使用获取到的 session_key、加密数据和 IV 来解密用户的敏感数据。
具体的解密算法可参考微信小程序官方文档提供的[解密算法](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html)。
const crypto = require('crypto');
function decryptData(encryptedData, sessionKey, iv) {
const sessionKeyBuffer = Buffer.from(sessionKey, 'base64');
const encryptedDataBuffer = Buffer.from(encryptedData, 'base64');
const ivBuffer = Buffer.from(iv, 'base64');
try {
const decipher = crypto.createDecipheriv('aes-128-cbc', sessionKeyBuffer, ivBuffer);
let decoded = decipher.update(encryptedDataBuffer, 'binary', 'utf8');
decoded += decipher.final('utf8');
return JSON.parse(decoded);
} catch (err) {
console.error('解密失败:', err);
return null;
}
}
// 使用方法
const decryptedData = decryptData(encryptedData, sessionKey, iv);
console.log('解密后的数据:', decryptedData);
注意事项:
1. 开放数据校验需要在后台服务器进行:
- 敏感数据的解密需要在安全的后台服务器进行,不应该在小程序端进行。
2. 保护 session_key 的安全性:
- 开发者需要注意保护 session_key 的安全性,不应该在小程序端暴露 session_key。
3. 及时更新 session_key:
- session_key 有时效性,建议在用户每次登录时,都重新获取一次 session_key。
以上是一般的开放数据校验和解密的流程。实际上,微信提供了一些辅助函数来进行开放数据校验和解密,开发者可以根据实际情况选择使用。详细的使用方法和参数说明可以参考微信小程序官方文档。
转载请注明出处:http://www.zyzy.cn/article/detail/665/微信小程序