碰到这个问题,而且是偶发的,同样一个人有几率会碰到这种情况:
Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
at Decipheriv.final (crypto.js:157:26)
at WXBizDataCrypt.decryptData (/home/leanengine/app/utils/WXBizDataCrypt.js:26:29)
at getUserinfoWXApp (/home/leanengine/app/controller/WXController.js:17:15)
at Object.exports.getUserinfoWXApp (/home/leanengine/app/controller/WXController.js:268:12)
at /home/leanengine/app/cloud.js:166:35
at process._tickDomainCallback (internal/process/next_tick.js:129:7)
出问题的 WXBizDataCrypt.js:26:29 对应这一行:
decoded += decipher.final('utf8');
能帮忙看一下么?
所有代码如下:
'use strict';
// 小程序,获取 code, encryptedData, iv
function Login(that) {
var code = '';
var encryptedData = '';
var iv = '';
return new AV.Promise((resolve, reject) => {
wx.login({
success: function(loginRes) {
if (loginRes) {
resolve(loginRes);
} else {
reject('微信登录失败!');
}
},
error: function(err) {
reject(err);
}
});
}).then(function(loginRes) {
code = loginRes.code;
return new AV.Promise((resolve, reject) => {
wx.getUserInfo({
success: function(userInfoRes) {
if (userInfoRes) {
resolve(userInfoRes);
} else {
reject('获取微信资料失败!');
}
},
error: function(err) {
reject(err);
}
});
});
}).then(function(userInfoRes) {
that.globalData.userInfo = userInfoRes.userInfo;
encryptedData = userInfoRes.encryptedData;
iv = userInfoRes.iv;
var paramsJson = {
code: code,
encryptedData: encryptedData,
iv: iv
};
return AV.Cloud.run('linkOrCreateUserWithWXApp', paramsJson);
}).then(function() {
if (!AV.User.current()) {
return AV.User.loginWithWeapp().then(function(user) {
if (user && !(user.get('nickname'))) {
user.set('nickname', that.globalData.userInfo.nickName);
user.save();
}
return AV.Promise.resolve(that.globalData.userInfo);
}).catch(function(err) {
console.error(err.stack);
return AV.Promise.reject(err);
});
} else {
return AV.Promise.resolve(that.globalData.userInfo);
}
});
}
// 服务端
AV.Cloud.define('linkOrCreateUserWithWXAppTest', function(req, res) {
var code = req.params.code;
var encryptedData = req.params.encryptedData;
var iv = req.params.iv;
var wxUserData = {};
if (!code || !encryptedData || !iv) {
console.error('参数为空!');
return res.error('参数为空!');
}
var promise = new Promise(function(resolve, reject) {
var requestUrl = 'https://api.weixin.qq.com/sns/jscode2session?appid=' +
appid +
'&secret=' +
secret +
'&js_code=' +
code +
'&grant_type=authorization_code';
_request(requestUrl, function(err, response, body) {
if (err) {
return reject(err);
}
try {
body = JSON.parse(body);
} catch (err) {
return reject(body);
}
if (body.errcode) {
return reject(body);
}
return resolve(body);
});
});
promise.then(function(wxData) {
var sessionKey = new Buffer(wxData.session_key, '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);
if (decoded.watermark.appid !== this.appId) {
res.error('Illegal Buffer');
}
wxUserData = decoded;
} catch (err) {
res.error('Illegal Buffer');
}
res.success(wxUserData);
}).catch(function(err) {
return res.error(err);
});
});