- 官方的解釋

前端代碼
- 使用的是uni
- 一定要盡量保證uni.login和獲取用戶信息wx.getWeRunData api一起請求,盡量避免在后台儲存session_key
uni.getProvider({
service: 'oauth',
success: function(res) {
console.log(res.provider)
if (~res.provider.indexOf('weixin')) {
uni.login({
success(res) {
if (res.code) {
code = res.code;
// #ifdef MP-WEIXIN
wx.getWeRunData({
async success(res) {
res.code = code;
const step = await getStep(res);//調用后台接口進行解密
}
})
// #endif
} else {
console.log('登錄失敗!' + res.errMsg)
}
}
})
}
}
});
后台代碼
var crypto = require('crypto')//需要安裝插件
function WXBizDataCrypt(appId, sessionKey) {
this.appId = appId
this.sessionKey = sessionKey
}
WXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {
// base64 decode
var sessionKey = new Buffer(this.sessionKey, 'base64')
encryptedData = new Buffer(encryptedData, 'base64')
iv = new Buffer(iv, 'base64')
try {
// 解密
var decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv)
// 設置自動 padding 為 true,刪除填充補位
decipher.setAutoPadding(true)
var decoded = decipher.update(encryptedData, 'binary', 'utf8')
decoded += decipher.final('utf8')
decoded = JSON.parse(decoded)
} catch (err) {
throw new Error('Illegal Buffer')
}
if (decoded.watermark.appid !== this.appId) {
throw new Error('Illegal Buffer')
}
return decoded
}
module.exports = WXBizDataCrypt