在接收消息之前,我们还需要验证与微信平台的签名,上一篇文章已经讲过了,这里不在详述。现在就来讲解一下接收微信平台的消息。在签名认证以后,我们就可以接收消息了。在index.js的app.post方法中添加以下功能。
签名认证;认证成功后,接收消息; 解析消息回复消息(文本,图片……)接收消息的代码如下:
var post_data=""; req.on("data",function(data){post_data=data;}); req.on("end",function(){ var xmlStr=post_data.toString('utf-8',0,post_data.length); //解析消息代码 //回发消息代码 });
上面代码中的xmlStr就是我们收到的微信平台发过来的消息。
在解析消息之前,我们需要在index.js中引入一个解析消息的模块node-xml,通过该模块来解析消息。
var xml=require('node-xml');
如果我们发送给微信平台的消息为文本消息,则收到的消息格式如下:
1348831860
1234567890123456
然后我们就通过node-xml模块来解析,解析的代码如下:
// 定义解析存储变量
var ToUserName="";
var FromUserName="";
var CreateTime="";
var MsgType="";
var Content="";
var tempName="";
//开始解析消息
var parse=new xml.SaxParser(function(cb){
cb.onStartElementNS(function(elem,attra,prefix,uri,namespaces){
tempName=elem;
});
cb.onCharacters(function(chars){
chars=chars.replace(/(^\s*)|(\s*$)/g, "");
if(tempName=="CreateTime"){
CreateTime=chars;
}
});
cb.onCdata(function(cdata){
if(tempName=="ToUserName"){
ToUserName=cdata;
}else if(tempName=="FromUserName"){
FromUserName=cdata;
}else if(tempName=="MsgType"){
MsgType=cdata;
}else if(tempName=="Content"){
Content=cdata;
}
console.log(tempName+":"+cdata);
});
cb.onEndElementNS(function(elem,prefix,uri){
tempName="";
});
cb.onEndDocument(function(){
//按收到的消息格式回复消息
});
});
parse.parseString(xmlStr);
通过以上代码的实现,这样收到的消息就解析完成了。 大家想了解更多收到数据的格式,请查看微信平台的官方文档 。
发送消息
根据前一节中我们解析出来的内容,然后对应组织我们的发送数据包,数据包格式如下:
12345678
关于更多被动回复数据格式请查看微信官方文档 。
回复文本消息的代码如下:
CreateTime=parseInt(new Date().getTime() / 1000);
var msg="";
if(MsgType=="text"){
msg="谢谢关注,你说的是:"+Content;
//组织返回的数据包
var sendMessage=' ' +
'' +
' ' +
' ' +
''+CreateTime+' ' +
' ' +
' ' +
' ';s.send(sendMessage);
}
好了,这样我们的服务端就完成了,点击【提交运行】。现在拿起手机,扫描二维码关注我们的微信公众号,发送消息,看一看结果吧。