用nodejs怎样来实现对微信公众平台的开发呢?html
别的就很少说了,先来简单介绍微信公众平台的基本原理。node
微信服务器就至关于一个转发服务器,终端(手机、Pad等)发起请求至微信服务器,微信服务器,而后将请求转发给自定义服务(这里就是咱们的具体实现)。服务处理完毕,而后转发给微信服务器,微信服务器再将具体响应回复到终端;通讯协议为:HTTP;数据格式为:XML。 具体的流程以下图所示:express
其实,咱们须要作的事情,就是对HTTP请求,作出响应。具体的请求内容,咱们按照特定的XML格式去解析,处理完毕后,也要按照特定的XML格式返回。npm
要想完成对微信公众平台的开发,咱们须要注册一个微信公众平台账号。注册步骤以下: 打开微信公共平台的官网,https://mp.weixin.qq.com/,点击“当即注册”。数组
而后根据提示,填写基本信息,邮箱激活,选择类型,信息登记,公众号信息,完成注册。服务器
在注册完成之后,咱们要对公众号进行一些基本的设置。登陆公众号,找到【公众号设置】,而后设置头像以及其它信息。微信
咱们须要在公网上找一台服务器,以即可以启动咱们的nodejs的环境,启动环境后经过设置访问地址,咱们就能够接收微信服务器发送的消息了,而且咱们也能够向微信服务器发送消息了。app
在公网的服务器中安装完成nodejs之后,咱们还须要安装一些nodejs所用到的模块,如:express,node-xml,jssha等模块。能够经过npm命令进行安装。微信公众平台
咱们经过nodejs来实现向微信服务器消息的发送与接收,以及与微信服务器的签名认证。框架
在咱们右面的编辑环境中已经为同窗们安装了nodejs环境。咱们在接下来内容中就为同窗们来实现微信服务器的签名认证。
咱们在前面的课程中已经安装了express模块,而且在咱们右面的环境中已经建立了一个名为app.js的文件。如今咱们就在这个文件中完成express框架。以下代码:
var express = require("express"); var path=require('path'); var app = express(); server = require('http').Server(app); app.set('views',__dirname); // 设置视图 app.set('view engine', 'html'); app.engine( '.html', require( 'ejs' ).__express ); require('./index')(app); //路由配置文件 server.listen(80,function(){ console.log('App start,port 80.'); });
而后再添加一个名为test.html的文件。写入如下内容
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>汇智网</title> </head> <body> <div><%=issuccess%></div> </body> </html>
咱们还要添加一个名为index.js的文件,来实现咱们的路由。点击编辑环境中的添加文件按钮,添加文件,而后咱们写入如下代码,其中GET请求用来验证配置的URL合法性,POST请求用来处理微信消息。
module.exports = function(app){ app.get('/',function(req,res){ res.render('test',{issuccess:"success"}) }); app.get('/interface',function(req,res){}); app.post('/interface',function(req,res){}); }
这样咱们须要的express框架就完成了,固然咱们还能够添加public公共文件夹以及咱们要用到的中间件。保存文件,点击【提交运行】,而后点击【访问测试】,去试试吧。记下访问测试的地址,咱们将在下一节中会用到该地址。
咱们登陆微信公众平台,在开发者模式下面找到基本配置,而后修改服务器配置。如图所示:
首先URL要填写公网上咱们安装nodejs接收与发送数据的路径。咱们能够填写上节中【访问测试】的地址,而后加上对应的路由就能够了。
http://724515db515222a9efffd6b092aa955d.me.hubwiz.com/interface
上面代码是个人访问测试的地址,而后加上前面课程中的路由,同窗们要根据本身的访问测试地址与路由来填写。
Token要与咱们自定义服务器端的token一致。填写完成之后,就能够点击提交了,在提交之前,咱们启动app.js(点击【提交运行】)。这样根据咱们的路由匹配就能够验证签名是否有效了。
当配置完成之后,必定要启用配置。
公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,而且带上四个参数:
参数 描述 signature 微信加密签名 timestamp 时间戳 nonce 随机数 echostr 随机字符串
开发者经过检验signature对请求进行校验(下面有校验方式)。若确认这次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,不然接入失败。
signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
加密/校验流程:
首先咱们确认请求是来自微信服务器的get请求,那么就能够在index.js文件中进行添加代码了。而后在app.get('/interface',function(req,res){});的function中进行添加。
先来获取各个参数的值,以下代码:
var token="weixin"; var signature = req.query.signature; var timestamp = req.query.timestamp; var echostr = req.query.echostr; var nonce = req.query.nonce;
咱们在这里对token进行设置,让其与微信服务器中设置的token一致。
而后对其中的token、timestamp、nonce进行排序,以下代码:
var oriArray = new Array(); oriArray[0] = nonce; oriArray[1] = timestamp; oriArray[2] = token; oriArray.sort();
这样咱们就完成了排序。
在上节中咱们已经对参数进行了排序,而后咱们在这一节中要将参数组成一个字符串,进行SH-1加密。在加密之前要用到jssha模块,在咱们的文件中要引用该模块。
var jsSHA = require('jssha');
在上一节课中咱们已经对参数排序完成,并存放在数组中,咱们能够经过join方法来生成一个字符串,以下代码:
var original = oriArray.join('');
最后对该数据进行加密,以下代码:
var jsSHA = require('jssha'); var shaObj = new jsSHA(original, 'TEXT'); var scyptoString=shaObj.getHash('SHA-1', 'HEX');
好了这样就生成了咱们须要的签名字符串scyptoString。
咱们已经获得了咱们想要的签名字符串scyptoString,而后咱们就能够与来自微信服务器的签名进行对比了,对比经过,则咱们就能够接收与发送消息了。
if(signature == scyptoString){ //验证成功 } else { //验证失败 }
本参考了以下网站,更多内容也请访问: http://www.hubwiz.com/course/569dc7fdacf9a45a69b051cd/