使用cryptojs解密encryptedData,获取微信步数
这个方法在新的微信开发者工具不能用了,因为为了安全,不能把appsecrect写在前端代码里面。后面使用了云函数获取微信步数,很方便。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
本人是前端新手,想做一个运动类微信小程序,想把微信步数放到自己的小程序里面。查阅微信官方文档,给出的解决方法是先调用wx.login(), 再调用wx.getWeRunData(). 得到encryptedData,拿去后端解密。我这不是在做前端吗,怎么还要写个后端专门解密?
后端解密就后端解呗,难道我一个新手村的,还能改变游戏规则?
官方解密代码偏偏没有java的,在网上搜索解密方法,找了一个星期,给我找到一个使用cryptojs解密encryptedData,直接写在微信开发者工具,前端就可以解密了。
首先下载cryptojs文件,放在utils下
下载
安装
$ npm install crypto-js
在utils下创建RdWXBizDataCrypt.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()进行 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
在你要放置解密信息的页面的js页面,写如下代码
// pages/step-counting/strp-counting.js
const app = getApp()
var WXBizDataCrypt = require('../../utils/RdWXBizDataCrypt.js');
var AppId = '你的appid'
var AppSecret = '你的appsecrect'
Page({
data: {
userInfo: {},
hasUserInfo: false,
canIUse: wx.canIUse('button.open-type.getUserInfo'),
canIUseGetUserProfile: false,
canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName'),// 如需尝试获取用户信息可改为false
stepInfoList:[]
},
globalData: {
userInfo: null
},
//获取步数
getRunData:function(cb){
var that = this
if(this.globalData.userInfo){
typeof cb == "function" && cb(this.globalData.userInfo)
}else{
//调用登录接口,获取 code
wx.login({
success: function (res) {
//发起网络请求
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.getWeRunData({
success: function (res) {
var data = pc.decryptData(res.encryptedData , res.iv)
console.log('解密后 data: ', data)
that.setData({
stepInfoList:data.stepInfoList
})
}
})
},
fail: function(res) {},
complete: function(res) {}
});
}
})
}
},
bindViewTap() {
wx.navigateTo({
url: '../logs/logs'
})
},
onLoad() {
if (wx.getUserProfile) {
this.setData({
canIUseGetUserProfile: true
})
}
this.getRunData()
}
})
我只需要微信步数,放在了stepInfoList里面。如果想要其他数据,可以改wx.getWeRunData