接口如果涉及敏感數(shù)據(jù)(如wx.getUserInfo當(dāng)中的 openId 和unionId ),接口的明文內(nèi)容將不包含這些敏感數(shù)據(jù)。開發(fā)者如需要獲取敏感數(shù)據(jù),需要對接口返回的加密數(shù)據(jù)( encryptedData )進(jìn)行對稱解密。 解密算法如下:
微信官方提供了多種編程語言的示例代碼(點(diǎn)擊下載)。每種語言類型的接口名字均一致。調(diào)用方式可以參照示例。
另外,為了應(yīng)用能校驗(yàn)數(shù)據(jù)的有效性,我們會(huì)在敏感數(shù)據(jù)加上數(shù)據(jù)水印( watermark )
注:此前提供的加密數(shù)據(jù)(encryptData)以及對應(yīng)的加密算法將被棄用,請開發(fā)者不要再依賴舊邏輯。
下載后發(fā)現(xiàn),這里邊居然沒有純 js 的 demo,好歹你自己家的小程序是只能用 js 哇。

找了網(wǎng)上好多文章,基本都是 Java 版本的解密,所以決定自己弄個(gè)純js的。

/**
* Created by rd on 2017/5/4.
*/
// 引入CryptoJS
var Crypto = require('cryptojs/cryptojs.js').Crypto;
var app = getApp();
function RdWXBizDataCrypt(appId, sessionKey) {
this.appId = appId
this.sessionKey = sessionKey
}
RdWXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {
// base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()進(jìn)行 base64解碼
var encryptedData = Crypto.util.base64ToBytes(encryptedData)
var key = Crypto.util.base64ToBytes(this.sessionKey);
var iv = Crypto.util.base64ToBytes(iv);
// 對稱解密使用的算法為 AES-128-CBC,數(shù)據(jù)采用PKCS#7填充
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 = RdWXBizDataCrypt
|
var WXBizDataCrypt = require('utils/RdWXBizDataCrypt.js');
var AppId = 'wx**************'
var AppSecret = '8f***************************'
App({
onLaunch: function () {
},
getUserInfo:function(cb){
var that = this
if(this.globalData.userInfo){
typeof cb == "function" && cb(this.globalData.userInfo)
}else{
//調(diào)用登錄接口,獲取 code
wx.login({
success: function (res) {
//發(fā)起網(wǎng)絡(luò)請求
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session',
data:{
appid:AppId,
secret:AppSecret,
js_code:res.code,
grant_type:'authorization_code'
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
method: 'GET',
success: function(res){
var pc = new WXBizDataCrypt(AppId, res.data.session_key)
wx.getUserInfo({
success: function (res) {
var data = pc.decryptData(res.encryptedData , res.iv)
console.log('解密后 data: ', data)
}
})
},
fail: function(res) {},
complete: function(res) {}
});
}
})
}
}
})
|

