微信小程序开发总结nodejs开发

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

2018-05-16  本文已影响296人  意外金喜

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

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

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

小程序代码:

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

1.  /** 
2.  * 获取微信加密的数据,传递给后端 
3.  */  
4.  static getCryptoData2() {  
5.  let code = "";  
6.  return this.login()  
7.  .then(data => {  
8.  code = data.code;  
9.  console.log("login接口获取的code:", code);  
10.  return this.getUserInfo();  
11.  })  
12.  .then(data => {  
13.  console.log("getUserInfo接口", data);  
14.  let { encryptedData, iv, rawData, signature } = data;  
15.  let obj = {  
16.  js_code: code,  
17.  rawData,  
18.  signature,  
19.  encryptedData,  
20.  iv  
21.  };  
22.  return Promise.resolve(obj);  
23.  })  
24.  .catch(e => {  
25.  console.log(e);  
26.  return Promise.reject(e);  
27.  })  
28.  };  
29.  /** 
30.  * 从后端获取解密后的数据 
31.  * @param {object} params  
32.  */  
33.  static getMyData(params) {  
34.  let url = 'https://xx.xxxxxx.cn/api/cryptdata';  
35.  return this.request(url, params, "POST", "application/x-www-form-urlencoded");  
36.  };  

2、app.js修改

1.  let wechat = require('./utils/wechat.js');  
2.  App({  
3.  onLaunch() {  
4.  this.getUserInfo();  
5.  },  
6.  getUserInfo() {  
7.  wechat.getCryptoData2()  
8.  .then(d => {  
9.  return wechat.getMyData(d);  
10.  })  
11.  .then(d => {  
12.  console.log("从后端获取解密的数据", d.data);  
13.  })  
14.  .catch(e => {  
15.  console.log(e);  
16.  })  
17.  }  
18.  })  

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

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

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

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

21.  let data = pc.decryptData(encryptedData, iv)  

23.  console.log('解密后 data: ', data)  
24.  res.json(data);  
25.  }  
26.  catch (e) {  
27.  console.log(e);  
28.  res.json('');  
29.  }  
30.  })  

结果:

image

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

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

参考地址:

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

上一篇下一篇

猜你喜欢

热点阅读