小程序前端解密crypto
调用
//发起网络请求
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session', //这个接口是官方提供的
data: {
appid: 'wx3eea97a0fc27942b', // 你的appid,同上
secret: 'd4bd837c1f86690fe9ef8fb1a9f0c40c', // 你的appsecret,同上
js_code:code, //wx.login返回的code
grant_type: 'authorization_code', //这里是固定写法
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
method: 'GET',
success: function (res) {
let pc = new WXBizDataCrypt('wx3eea97a0fc27942b', res.data.session_key) //这里是引用解密,传入appid,和session_key,其中session会有过期的情况,可以参照官方API的 wx.checkSession可以校验 session_key 是否有效,从而避免小程序反复执行登录流程。
let data = pc.decryptData(userInfo.encryptedData, userInfo.iv) //使用iv解密encryptedData,详细过程查看官方API
console.log('解密后 data: ', data)
},
fail: function (res) {
},
complete: function (res) {
}
});
js文件
let Crypto = require('cryptojs-master/cryptojs.js').Crypto //这里就是我们修改的引用地址
let app = getApp();
function RdWXBizDataCrypt(appId, sessionKey) {
this.appId = appId
this.sessionKey = sessionKey
}
RdWXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {
// base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码
encryptedData = Crypto.util.base64ToBytes(encryptedData)
let key = Crypto.util.base64ToBytes(this.sessionKey);
iv = Crypto.util.base64ToBytes(iv);
// 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
let mode = new Crypto.mode.CBC(Crypto.pad.pkcs7);
// try {
// // 解密
// let bytes = Crypto.AES.decrypt(encryptedData, key, {
// asBpytes: true,
// iv: iv,
// mode: mode
// });
// let decryptResult = JSON.parse(bytes);
// } catch (err) {
// console.log(err)
// }
// 解密
let bytes = Crypto.AES.decrypt(encryptedData, key, {
asBpytes: true,
iv: iv,
mode: mode
});
let decryptResult = JSON.parse(bytes);
if (decryptResult.watermark.appid !== this.appId) {
console.log(err)
}
return decryptResult
}
module.exports = RdWXBizDataCrypt