赞
踩
写在前面的话:按照以下方法可以在模拟器和安卓手机上成功解密,但是在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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。