NodeJS驗證微信開發平臺的token

若是想在微信公衆號上讓用戶體驗更多的功能,而不單單是讓公衆號像機器人同樣收發有限的信息,你就要成爲微信平臺開發者,自主開發web app。php

成爲微信平臺開發者的第一步,是配置一臺web服務器。
第二步,是配置相關的參數,經過微信的開發者驗證,而且把你的服務器地址告知微信服務器。這裏單講第二步。html

詳細的配置步驟寫在這裏:微信公衆平臺開發者文檔-接入指南node

我我的提煉一下這個過程的話,就是微信服務器生成了一系列隨機字符,放在url的query裏,而後根據你寫的服務器地址,發送request。而你的服務器在收到了request以後,分別取出query的各項參數,按照他的規則拼接啦,哈希變化,而後再返回(response)一個值給微信服務器。微信服務器收到以後,若是等於服務器自己設定的那個值,就經過驗證。python

後端語言有不少,php,python,node,還有windows平臺的,咱們這裏用node。web

下面是node源碼,注意,該源碼不是我原創,而是csdn博客-NoGrief的博客 的代碼調試修改而來。ubuntu

var http = require("http");
var url = require("url");
var crypto = require("crypto");

function sha1(str){
  var md5sum = crypto.createHash("sha1");
  md5sum.update(str);
  str = md5sum.digest("hex");
  return str;
}

function validateToken(req,res){
  var query = url.parse(req.url,true).query;
  //console.log("*** URL:" + req.url);
  //console.log(query);
  var signature = query.signature;
  var echostr = query.echostr;
  var timestamp = query['timestamp'];
  var nonce = query.nonce;
  var oriArray = new Array();
  oriArray[0] = nonce;
  oriArray[1] = timestamp;
  oriArray[2] = "*********";//這裏是你在微信開發者中心頁面裏填的token,而不是****
  oriArray.sort();
  var original = oriArray.join('');
  console.log("Original str : " + original);
  console.log("Signature : " + signature );
  var scyptoString = sha1(original);
  if(signature == scyptoString){
    res.end(echostr);
    console.log("Confirm and send echo back");
  }else {
    res.end("false");
    console.log("Failed!");
  }
}


var webSvr = http.createServer(validateToken);
webSvr.listen(8000,function(){
  console.log("Start validate");
});

上面代碼保存爲tokenValidate.js或者任何你喜歡的名字。windows

你也許會問,爲啥監聽的是8000端口而不是80端口?
由於ubuntu下使用80端口很麻煩並且有安全問題,因此我上網查了資料,把8000端口的監聽也改在80端口,這樣一來,8000端口的信息會自動轉到80端口去。
這是資料:StackOverFlow-Best practices when running Node.js with port 80(Ubuntu/Lincode)後端

而後在微信開發者中內心點提交,就能夠了。安全

相關文章
相關標籤/搜索