nodejs死亡笔记之实战篇---微信公众号的开发(2)

原创 2016年08月31日 11:38:52

本篇文章继续讲解微信公众号的开发(不使用第三方微信开发模块)

接收消息

  
  在接收消息之前,我们还需要验证与微信平台的签名,上一篇文章已经讲过了,这里不在详述。现在就来讲解一下接收微信平台的消息。在签名认证以后,我们就可以接收消息了。在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');

如果我们发送给微信平台的消息为文本消息,则收到的消息格式如下:

 <xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName> 
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[this is a test]]></Content>
 <MsgId>1234567890123456</MsgId>
 </xml>

这里写图片描述

然后我们就通过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);

通过以上代码的实现,这样收到的消息就解析完成了。 大家想了解更多收到数据的格式,请查看微信平台的官方文档

发送消息

根据前一节中我们解析出来的内容,然后对应组织我们的发送数据包,数据包格式如下:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>

 关于更多被动回复数据格式请查看微信官方文档

回复文本消息的代码如下:

CreateTime=parseInt(new Date().getTime() / 1000);
var msg="";
if(MsgType=="text"){
   msg="谢谢关注,你说的是:"+Content;
   //组织返回的数据包
    var sendMessage=' ' +
                '<xml>' +
                '<ToUserName><![CDATA['+FromUserName+']]></ToUserName>' +
                '<FromUserName><![CDATA['+ToUserName+']]></FromUserName>' +
                '<CreateTime>'+CreateTime+'</CreateTime>' +
                '<MsgType><![CDATA[text]]></MsgType>' +
                '<Content><![CDATA['+msg+']]></Content>' +
                '</xml>';s.send(sendMessage);
}

好了,这样我们的服务端就完成了,点击【提交运行】。现在拿起手机,扫描二维码关注我们的微信公众号,发送消息,看一看结果吧。


  关于其它消息的回复,按照微信官方说明组织数据包进行回复就可以了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

nodejs死亡笔记之cookie和session(宇宙级框架express)

首先,我必须义正言辞的吐槽一下这个宇宙级框架!express3.x和expss4.x差别怎么就那么大呢?找了好多资料来学习,但总是莫名其妙的报错,一开始我以为是因为我长得不好看,后来发现。。。我用的是...

图解微信公众号后台服务开发(nodejs版)

关于微信公众号开发的文章到处都是,基于nodejs的代码也不少,但是微信公众号给出的开发者文档接口虽然全却不细致,难免需要花费一些时间去测试确认,这里总结下最近基于nodejs的微信公众号后台服务开发...

nodejs死亡笔记之cookie和session(宇宙级框架express)

首先,我必须义正言辞的吐槽一下这个宇宙级框架!express3.x和expss4.x差别怎么就那么大呢?找了好多资料来学习,但总是莫名其妙的报错,一开始我以为是因为我长得不好看,后来发现。。。我用的是...

火星人学node(基础篇)---nodejs的模块系统(实例分析exprots和module.exprots)

前言:工欲善其事,必先利其器。模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统。在文章最后实例分析一下exprots和module.exprots...

nodejs死亡笔记之实战篇---微信公众号的开发(1)

本篇文章将利用express框架进行微信公众号的开发。

nodejs开发微信公众号第二天代码

  • 2016年12月12日 17:54
  • 2.11MB
  • 下载

nodejs中微信公众号开发-接口配置和签名验证

nodejs中微信公众号开发-接口配置和签名验证

nodejs中微信公众号开发-access_token获取与保存

nodejs中微信公众号开发-access_token获取与保存

nodejs微信公众号开发第一步(接入指南)--wechat模块

nodejs微信公众号开发第一步(接入指南)--wechat模块
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:nodejs死亡笔记之实战篇---微信公众号的开发(2)
举报原因:
原因补充:

(最多只允许输入30个字)