对于手机号的解密,官方给出的都是后端解密,但是公司需要用js解密,记录一下。
首先需要下载cryptojs包,下载地址https://codeload.github.com/gwjjeff/cryptojs/zip/master
在项目的utils目录下新建cryptojs目录,将下载的文件复制进去
在utils目录下新建RdWXBizDataCrypt.js文件,内容如下:
var Crypto = require('./cryptojs/cryptojs.js').Crypto;
function RdWXBizDataCrypt(appId, sessionKey) {
this.appId = appId
this.sessionKey = sessionKey
}
RdWXBizDataCrypt.prototype.decryptData = function(encryptedData, iv) {
// base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码
var encryptedData = Crypto.util.base64ToBytes(encryptedData)
// console.log(sessionKey)
var key = Crypto.util.base64ToBytes(this.sessionKey);
var iv = Crypto.util.base64ToBytes(iv);
// console.log(encryptedData,key,iv)
// 对称解密使用的算法为 AES-128-CBC,数据采用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
使用方法如下:
getPhoneNumber(e){
if (e.detail.errMsg == 'getPhoneNumber:ok'){
let sessionKey = wx.getStorageSync('session_key') // 从后端获取
let encryptedData = e.detail.encryptedData;
let iv = e.detail.iv;
let appId = app.appId;
const RdWXBizDataCrypt = require('../../utils/RdWXBizDataCrypt.js');
const pc = new RdWXBizDataCrypt(appId, sessionKey);
const data = pc.decryptData(encryptedData, iv);
console.log(data.phoneNumber); //当前手机号码
console.log(data)
}
}
思路也是网上得到了,忘记了得到思路的博客地址(⊙o⊙)…