标签:
写在前面的话:上一篇介绍了如何将自己的服务器与微信公众平台进行连接,连接成功之后就可以与微信进行交互了,这一篇介绍最简单的情形,接收用户文本消息,并自动回复文本消息,如果能够实现这个功能,那么我们就能够轻松的实现接收不同的用户消息,并根据业务需要回复用户不同类型的消息,更复杂的在下一篇中讲解。
=====正文开始=====
当微信用户向公众号发送消息时,微信服务器会将该消息发送至我们填写的URL中,我们在后台就能够写代码实现接收消息---处理消息----回复消息的操作。
这里有几点需要注意:
1、微信服务器是通过POST方式给我们填写的URL发送消息。
2、发送消息的格式是XML格式。(以后会注意到,其他的一些功能,有时发送的消息的格式并不是XML格式,有可能是json格式,大概是微信团队中不同人各有偏好吧,你喜欢XML,我却喜欢json),文本消息的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>
各个参数的含义如下:
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | text |
Content | 文本消息内容 |
MsgId | 消息id,64位整型 |
可见,当用户给公众号发送消息时,微信将该消息以XML格式推送至我们填写的URL之中,我们可以从接受的消息中得到:
(1)开发者微信号:即我们自己的微信公共号,这里是toUserName,是站在用户的角度,当我们回复用户消息的时候,我们的自己微信公众号就应该是FromUserName了。
(2)发送方账号:这里获取的是一个OpenID,对于每一个用户来说,他相对于一个特定的公众号,都有一个唯一识别码,这个就是OpenID,有了这个OpenID,我们的公众号就能够识别不同的用户了。对于以后的用户授权、微商城用户信息的记录等等,都是通过OpenID来唯一标示一个用户的。需要注意的是,同一个用户对于不同的微信公众号,OpenID是不同的。
(3)消息创建时间:没啥需要解释的。
(4)消息类型MsgType:我们获取的是文本消息,所以这里是text,在下一篇文章中,我们会看到不同的消息类型,通过这个参数我们就能区分用户发送的不同的消息了,进行做出相应的处理。
(5)消息内容:这里接收的就是用户发送的具体信息的内容了。
(6)消息id:这个是用来标识这个条消息的,可以用来排重用。因为微信服务器向我们的服务器URL推送消息后,如果没有在5秒之内收到回应,会重新发起请求,我们就可以通过这个消息id对重试的消息进行排重了。
3、回复用户消息:当我们服务器URL接收到用户消息,处理完成后,需要给微信服务器进行回复,即发送被动响应消息,同样是回复XML格式的数据,数据的基本组成与前面接收到的XML格式类似,其中FromUserName和ToUserName内容需要进行交换,毕竟所站的角度不同,另外没有了Msgid项。
好了,前面把需要理解的东西给讲完了,下面看看代码怎么写,与前一篇一样,我们把代码写在wechat.php文件之中。
1、接收用户发送的消息。
$postData = $GLOBALS["HTTP_RAW_POST_DATA"];
2、将接收的xml格式消息转化为对象格式,方便操作。
$postObj=json_decode(json_encode(simplexml_load_string($postData, ‘SimpleXMLElement‘, LIBXML_NOCDATA)));
这里需要注意:对接收到的消息需要先json_encode,再json_decode,如果直接json_decode的话,获取的对象会有些小问题的。
3、获取XML消息具体内容。
$fromUserName = $postObj->FromUserName; $toUserName = $postObj->ToUserName; $createTime=$postObj->CreateTime; $msgType=$postObj->MsgType; $content=$postObj->Content; $msgID=$postObj->MsgId;
4、回复用户消息。
$textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; $time = time(); $content="$fromUserName 发给 $toUserName 的消息类型为: $msgType ,消息id为: $msgID ,消息具体内容为: $content ,发送时间为: $createTime "; $resultStr = sprintf($textTpl, $fromUserName, $toUserName, $time, $msgType, $content); echo $resultStr;
这里需要注意:通过直接echo $resultStr即可对微信服务器的POST请求进行响应,并且在$resultStr中,注意fromusername和tousername的对应关系。
大家可以自己试着在自己的公众号里面尝试一下,当然也可以关注一下我的个人公众号:guangleiwu,进行体验,二维码如下:
在下一篇,我将写一写如何接收其他类型消息,这篇如果理解的话,后面就更容易了。
最后,将接收文本消息并回复文本消息的全部源码粘贴如下:wechat.php
<?php $postData = $GLOBALS["HTTP_RAW_POST_DATA"]; $postObj=json_decode(json_encode(simplexml_load_string($postData, ‘SimpleXMLElement‘, LIBXML_NOCDATA))); $fromUserName = $postObj->FromUserName; $toUserName = $postObj->ToUserName; $createTime=$postObj->CreateTime; $msgType=$postObj->MsgType; $content=$postObj->Content; $msgID=$postObj->MsgId; $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; $time = time(); $content="$fromUserName 发给 $toUserName 的消息类型为: $msgType ,消息id为: $msgID ,消息具体内容为: $content ,发送时间为: $createTime "; $resultStr = sprintf($textTpl, $fromUserName, $toUserName, $time, $msgType, $content); echo $resultStr; ?>
(完)
标签:
原文地址:http://www.cnblogs.com/wuguanglei/p/4395822.html