迹忆博客
当前位置: 主页 > 学无止境 > 网络 > 文章

微信公众号接收消息 普通消息处理

发布时间: 2016-10-14 作者: 迹忆 浏览次数:

在微信用户和公众号产生交互的过程中会分为两种情况:一种是微信用户向公众号发送普通消息;另一种是微信用户的某些操作使得微信服务器通过事件推送的形式通知到开发者填写的URL。本篇我们来介绍公众号接收普通消息的处理。

下面这段话是摘自微信官方开发文档:

1、关于重试的消息排重,推荐使用msgid排重。
2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。
3、为了保证更高的安全保障,开发者可以在公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息会被加密,公众号被动回复用户的消息也需要加密(但开发者通过客服接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“消息加解密说明”

普通消息又分为文本消息、图片消息、语音消息、视频消息、小视频消息、地理位置消息和链接消息等七种。

当微信用户向公众号发送消息的时候,微信服务器将会识别消息的类型,将相应消息的xml数据发送给开发者。以文本消息为例,其格式如下:

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

各个字段的含义如下

ToUserName 开发者微信号
FromUserName      发送方帐号(一个OpenID)
CreateTime    消息创建时间 (整型)
MsgType         消息类型
Content 文本消息内容
MsgId     消息id,64位整型

我们看,微信服务器将xml数据发送给开发者之后,开发者是根据MsgType字段来判断该消息是属于什么类型的。不同消息的MsgType的值如下:

文本消息         text
图片消息         image
语音消息         voice
视频消息         video
小视频消息     shortvideo
地理位置消息 location
链接消息         link

对于每个消息的xml数据格式,下面五个字段是每种消息都有的,其中MsgType的值是根据不同的消息类型而不同。

<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
 <CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text/image/voice/video/shortvideo/location/link]]></MsgType>
<MsgId>1234567890123456</MsgId>

下面我们看不同的字段

文本消息

<Content><![CDATA[Content]]></Content>   //文本消息内容

图片消息

<PicUrl><![CDATA[this is a url]]></PicUrl>    //图片链接
<MediaId><![CDATA[media_id]]></MediaId>  //图片消息媒体id,可以调用多媒体文件下载接口拉取数据。

语音消息

<MediaId><![CDATA[media_id]]></MediaId>  //语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
<Format><![CDATA[Format]]></Format>  //语音格式 如amr、speex等

语音消息除了上面两个字段以外,还有一个字段——语音识别——需要我们在公众号进行开启才能使用

<Recognition><![CDATA[]]></Recognition>   //关闭语音识别 内容为空
// 开启
<Recognition><![CDATA[腾讯微信团队]]></Recognition>  //开启语音识别,内容为识别的语音的内容

视频消息

<MediaId><![CDATA[media_id]]></MediaId>  //视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId> //视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

小视频消息

<MediaId><![CDATA[media_id]]></MediaId>  //视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId> //视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

地理位置消息

<Location_X>23.134521</Location_X>    //地理位置维度
<Location_Y>113.358803</Location_Y>  //地理位置经度
<Scale>20</Scale>     //地图缩放大小
<Label><![CDATA[位置信息]]></Label>   //地理位置信息

链接消息

<Title><![CDATA[迹忆博客]]></Title>   //消息标题
<Description><![CDATA[迹忆博客——一个专业的技术博客]]></Description> //消息内容
<Url><![CDATA[http://www.onmpw.com]]></Url>     //消息链接

各种消息的格式就是我们上面所展示的那些。

下面我们来看一下开发者如何接收这些消息

function responseMsg()
{
         //get post data, May be due to the different environments
         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
         file_put_contents("/tmp/wx.txt", $postStr);  //将消息内容写入文件,便于我们自己观察
    //extract post data
         if (!empty($postStr)){
        //这里写消息处理代码
                   libxml_disable_entity_loader(true);
        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        $fromUsername = $postObj->FromUserName;
        $toUsername = $postObj->ToUserName;
                  $msgType = $postObj->MsgType;
                   //根据不同的消息类型写不同的处理
                     
    }else {
       echo "";
       exit;
    }  
}
responseMsg()  //调用该函数,相当于开启这个接口供微信服务器调用从而推送消息

微信公众号的接收消息的处理其实很简单,我们这里说的是明文的信息的处理,同时还有安全模式和兼容模式。在以后我们会说到,这里我们先介绍这么多。

赞助
迹忆博客

除非注明转载,本站文章均为原创,欢迎转载,转载请以链接形式注明出处

本文地址: