微信小程序用户数据的签名校验和加解密 - 后端nodejs

版权声明:本文为 zzwwjjdj1(意外金喜) 原创文章,非商用自由转载-保持署名-注明出处,谢谢。 https://blog.csdn.net/zzwwjjdj1/article/details/79351973

在本文 微信小程序用户数据的签名校验和加解密 之前需要先看看

微信小程序-获取用户session_key,openid,unionid - 后端为nodejs

代码封装是在上文添加的。

小程序代码:

1、在utils下的wechat.js文件里添加代码

  /**
   * 获取微信加密的数据,传递给后端
   */
  static getCryptoData2() {
    let code = "";
    return this.login()
      .then(data => {
        code = data.code;
        console.log("login接口获取的code:", code);
        return this.getUserInfo();
      })
      .then(data => {
        console.log("getUserInfo接口", data);
        let { encryptedData, iv, rawData, signature } = data;
        let obj = {
          js_code: code,
          rawData,
          signature,
          encryptedData,
          iv
        };
        return Promise.resolve(obj);
      })
      .catch(e => {
        console.log(e);
        return Promise.reject(e);
      })
  };
  /**
   * 从后端获取解密后的数据
   * @param {object} params 
   */
  static getMyData(params) {
    let url = 'https://xx.xxxxxx.cn/api/cryptdata';
    return this.request(url, params, "POST", "application/x-www-form-urlencoded");
  };
2、app.js修改

let wechat = require('./utils/wechat.js');
App({
  onLaunch() {
    this.getUserInfo();
  },
  getUserInfo() {
    wechat.getCryptoData2()
      .then(d => {
        return wechat.getMyData(d);
      })
      .then(d => {
        console.log("从后端获取解密的数据", d.data);
      })
      .catch(e => {
        console.log(e);
      })
  }
})

后端 nodejs代码
解密实例代码在官网有:有python,nodejs,PHP,C++版本,下载地址

1、解压后把nodejs里的WXBizDataCrypt.js文件放到common文件夹下;

2、新增一个路由,router,需要用到sha1模块

router.post("/cryptdata", async (req, res) => {
  let WXBizDataCrypt = require('../common/WXBizDataCrypt')
  const sha1 = require("sha1");
  try {
    let appId = "wx70XXXXXXXed01b";
    let secret = "5ec6e1cXXXXXXXXXbf161a79dd4";
    let { encryptedData, iv, js_code, rawData, signature } = req.body;
    // 获取session_key
    let opts = {
      url: `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${secret}&js_code=${js_code}&grant_type=authorization_code`
    }
    let r1 = await Ut.promiseReq(opts);
    let { session_key } = JSON.parse(r1);
    if (!session_key) return res.json('');
    // 数据签名校验
    let signature2 = sha1(rawData + session_key);
    if (signature != signature2) return res.json("数据签名校验失败");
    // 解密
    let pc = new WXBizDataCrypt(appId, session_key)

    let data = pc.decryptData(encryptedData, iv)

    console.log('解密后 data: ', data)
    res.json(data);
  }
  catch (e) {
    console.log(e);
    res.json('');
  }
})
结果:


可以看出和上文很像,其实这2步一般都是一起做的,如果不需要数据校验,上文

就可以,需要数据校验就要用到本文的代码了。

参考地址:

https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html

意外金喜的博客:http://blog.csdn.net/zzwwjjdj1



没有更多推荐了,返回首页