写在前面的话:按照以下方法可以在模拟器和安卓手机上成功解密,但是在iphone的真机上会报错.所以建议还是由后台来进行解密更好.
业务场景 : 微信小程序获取用户手机号码;
说明:微信小程序获取手机号码只能通过button触发,且不可通过获取用户设置authSetting来提前获取用户的授权,获取到的是加密后的手机号码!
业务逻辑js代码
let WXBizDataCrypt = require('../../../utils/common/WXBizDataCrypt.js');
getPhoneNumber(e) {
if (e.detail.errMsg =="getPhoneNumber:ok"){
//这里获取到的只是加密电话,还需要解密成电话号码
let appId = appDatas.appId;
let sessionKey = appDatas.sessionKey;
let encryptedData = e.detail.encryptedData;
let iv = e.detail.iv;
let pc = new WXBizDataCrypt(appId, sessionKey);
let phoneRes = pc.decryptData(encryptedData, iv);
getApp().globalData.userPhone = phoneRes.phoneNumber;
} else if (e.detail.errMsg == "getPhoneNumber:fail user deny"){
getApp().globalData.phoneAuthor = false;
}
//通知父组件手机号授权已经处理完毕,进行下一步
this.triggerEvent('myevent', { type: false, phoneNext: true }, { bubbles: false });
},
WXBizDataCrypt.js
var Crypto = require('../cryptojs-master/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()进行 base64解码
var encryptedData = Crypto.util.base64ToBytes(encryptedData)
var key = Crypto.util.base64ToBytes(this.sessionKey);
var iv = Crypto.util.base64ToBytes(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
仿node模块的cryptojs.js