使用cryptojs解密encryptedData,获取微信步数

文章介绍了前端新手如何在微信小程序中获取并解密微信步数。由于安全原因,不能在前端代码中使用appsecret,作者找到了使用cryptojs在前端直接解密encryptedData的方法,通过创建RdWXBizDataCrypt.js文件实现解密,然后在页面js中调用getRunData函数获取步数。
摘要由CSDN通过智能技术生成

使用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

以下是一个使用CryptoJS解密的Java脚本示例: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class CryptoJSExample { public static void main(String[] args) throws Exception { String key = "my secret key"; String encryptedData = "U2FsdGVkX19Lm0oH2z2DvHfNqYQwI/1wi5q/1z0/5cU="; // Decode base64 encoded key byte[] decodedKey = Base64.decodeBase64(key.getBytes("UTF-8")); // Create AES key from decoded key SecretKeySpec secretKeySpec = new SecretKeySpec(decodedKey, "AES"); // Create AES cipher instance and initialize with key Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); // Decode base64 encoded encrypted data byte[] decodedData = Base64.decodeBase64(encryptedData.getBytes("UTF-8")); // Decrypt data byte[] decryptedData = cipher.doFinal(decodedData); // Print decrypted data System.out.println(new String(decryptedData, "UTF-8")); } } ``` 在此示例中,我们使用CryptoJS解密Base64编码的AES加密数据。我们首先将密钥解码为字节数组,然后使用该密钥创建一个SecretKeySpec对象。接下来,我们使用该密钥初始化Cipher实例,然后将Base64编码的数据解码为字节数组。最后,我们使用Cipher实例解密数据并将其打印出来。 请注意,此示例仅适用于使用相同密钥和加密算法(在此示例中为AES)加密的数据。如果您需要解密不同密钥或不同加密算法的数据,请相应地更改代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值