349989153 10 X 10
Last updated: 2018-04-10
349989153:~ Desktop$ node NodeJS验证微信开发平台的token.js

> Post.tags
jsnode微信

> Post.prev
《js函数式编程》读书笔记

> Post.next
一道算法题(next smaller)
NodeJS验证微信开发平台的token

如果想在微信公众号上让用户体验更多的功能,而不仅仅是让公众号像机器人一样收发有限的信息,你就要成为微信平台开发者,自主开发web app。

成为微信平台开发者的第一步,是配置一台web服务器。
第二步,是配置相关的参数,通过微信的开发者验证,并且把你的服务器地址告知微信服务器。这里单讲第二步。

详细的配置步骤写在这里:微信公众平台开发者文档-接入指南

我个人提炼一下这个过程的话,就是微信服务器生成了一系列随机字符,放在url的query里,然后根据你写的服务器地址,发送request。而你的服务器在收到了request之后,分别取出query的各项参数,按照他的规则拼接啦,哈希变化,然后再返回(response)一个值给微信服务器。微信服务器收到之后,如果等于服务器本身设定的那个值,就通过验证。

后端语言有很多,php,python,node,还有windows平台的,我们这里用node。

下面是node源码,注意,该源码不是我原创,而是csdn博客-NoGrief的博客 的代码调试修改而来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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或者任何你喜欢的名字。

你也许会问,为啥监听的是8000端口而不是80端口?
因为ubuntu下使用80端口很麻烦而且有安全问题,所以我上网查了资料,把8000端口的监听也改在80端口,这样一来,8000端口的信息会自动转到80端口去。
这是资料:StackOverFlow-Best practices when running Node.js with port 80(Ubuntu/Lincode)

然后在微信开发者中心里点提交,就可以了。