微信小程序获取用户信息方法不再赘述,网上一抄一大把,只有符合自己的才是最好的 :)
微信官方给出了4中语言的解密算法,但是没有JS实现的方法。。百度了好多,但是没有一个比较完整的,并且对初学者友好的JS实现方法,于是就写下了这篇文章。
微信官方给出的加解密说明在这里,里面有说明具体使用的算法和实例代码。
可能对于大佬来说,看一下大概实现方法就好,但是对于我们这种小白来说,大佬一小步就是我们的鸿沟。。。
在此感谢这篇文章提供的思路。
准备工作
1、 由于要使用Crypto-JS进行具体解密操作,点击这里下载crypto-js包,完成后建议放在utils下,如图
2、 自行封装RdWxRunDataCrypt
类,用于调用Crypto-JS的接口,js文件也放在utils文件夹下即可。如图:
代码如下:
var Crypto = require('cryptojs/cryptojs.js').Crypto;
function RdWxRunDataCrypt(appId, sessionKey) {
this.appId = appId;
this.sessionKey = sessionKey;
}
RdWxRunDataCrypt.prototype.decryptData = function(encryptedData, iv) {
var encryptedData = Crypto.util.base64ToBytes(encryptedData);
var key = Crypto.util.base64ToBytes(this.sessionKey);
var iv = Crypto.util.base64ToBytes(iv);
var mode = new Crypto.mode.CBC(Crypto.pad.pkcs7);
try {
var bytes = Crypto.AES.decrypt(encryptedData, key, {
asBpytes:true,
iv:iv,
mode:mode
});
var decryptResult = JSON.parse(bytes);
} catch (err) {
console.log(err);
}
if (decryptResult.watermark.appid != this.appId) {
console.log(err);
}
return decryptResult;
}
module.exports = RdWxRunDataCrypt;
3、 实现app.js ,需要把appid
和secret
换成自己的APPID和SecretKey。
//app.js
var WxRunDataCrypt = require('utils/RdWxRunDataCrypt.js');
App({
onLaunch: function() {
var that = this;
wx.login({
success: function(res) {
var appid = "wx**************";
var secret = "****************";
if (res.code) {
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appid + '&secret=' + secret + '&js_code=' + res.code + '&grant_type=authorization_code',
header: {
'content-type': 'json'
},
success: function(res) {
var session_key = res.data.session_key;
that.getRunData(appid, session_key);
}
})
} else {
console.log();
}
fail: res=>{
console.log('login failed!');
}
}
})
},
getRunData: function(appid, session_key) {
wx.getWeRunData({
success: function(res) {
var encryptedData = res.encryptedData;
var iv = res.iv;
//调用封装好的类进行解密
var pc = new WxRunDataCrypt(appid, session_key);
var data = pc.decryptData(res.encryptedData , res.iv);
console.log('解密后 data: ', data);
},
fail: function(res) {
wx.showModal({
title: '提示',
content: '开发者未开通微信运动,请关注“微信运动”公众号后重试',
showCancel: false,
confirmText: '知道了'
})
}
})
}
})
到此,大功告成!解密出来的数据如下图所示,后续还需根据timestamp转换成具体的日期。
努力吧,少年!