小程序前端集成AES解密微信运动数据

微信小程序获取用户信息方法不再赘述,网上一抄一大把,只有符合自己的才是最好的 :)

微信官方给出了4中语言的解密算法,但是没有JS实现的方法。。百度了好多,但是没有一个比较完整的,并且对初学者友好的JS实现方法,于是就写下了这篇文章。

微信官方给出的加解密说明在这里,里面有说明具体使用的算法和实例代码。

可能对于大佬来说,看一下大概实现方法就好,但是对于我们这种小白来说,大佬一小步就是我们的鸿沟。。。

在此感谢这篇文章提供的思路。

准备工作

1、 由于要使用Crypto-JS进行具体解密操作,点击这里下载crypto-js包,完成后建议放在utils下,如图
在这里插入图片描述
2、 自行封装RdWxRunDataCrypt类,用于调用Crypto-JS的接口,js文件也放在utils文件夹下即可。如图:
在这里插入图片描述

代码如下:

var Crypto = require('cryptojs/cryptojs.js').Crypto;

function RdWxRunDataCrypt(appId, sessionKey) {
  this.appId = appId;
  this.sessionKey = sessionKey;
}

RdWxRunDataCrypt.prototype.decryptData = function(encryptedData, iv) {
  var encryptedData = Crypto.util.base64ToBytes(encryptedData);
  var key = Crypto.util.base64ToBytes(this.sessionKey);
  var iv = Crypto.util.base64ToBytes(iv);

  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 = RdWxRunDataCrypt;

3、 实现app.js ,需要把appidsecret换成自己的APPID和SecretKey。

//app.js
var WxRunDataCrypt = require('utils/RdWxRunDataCrypt.js');

App({
  onLaunch: function() {
    var that = this;
    wx.login({
      success: function(res) {
        var appid = "wx**************";
        var secret = "****************";
        if (res.code) {
          wx.request({
            url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appid + '&secret=' + secret + '&js_code=' + res.code + '&grant_type=authorization_code',
            header: {
              'content-type': 'json'
            },
            success: function(res) {
              var session_key = res.data.session_key;
              that.getRunData(appid, session_key);
            }
          })
        } else {
          console.log();
        }
        fail: res=>{
          console.log('login failed!');
        }
      }
    })
  },
  getRunData: function(appid, session_key) {
    wx.getWeRunData({
      success: function(res) {
        var encryptedData = res.encryptedData;
        var iv = res.iv;

        //调用封装好的类进行解密
        var pc = new WxRunDataCrypt(appid, session_key);
        var data = pc.decryptData(res.encryptedData , res.iv);

        console.log('解密后 data: ', data);
      },
      fail: function(res) {
        wx.showModal({
          title: '提示',
          content: '开发者未开通微信运动,请关注“微信运动”公众号后重试',
          showCancel: false,
          confirmText: '知道了'
        })
      }
    })
  }
})

到此,大功告成!解密出来的数据如下图所示,后续还需根据timestamp转换成具体的日期。
在这里插入图片描述
努力吧,少年!

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值