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; 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] = "*********"; 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)
然后在微信开发者中心里点提交,就可以了。