有了微信公众号开发(一)之准备工作,下面我们来讲讲消息事件的监听和自动回复
举个例子,当A用户关注公众号后,我们希望给用户自动发送一条“欢迎您,基友!”怎么实现呢?
这里就需要我们在验证接口中加入判断程序了,也就是微信开发文章一中写的那个接口(http://www.xxx.com/event/index)。
首先注意:微信第一次请求上面的接口时,会带一个echostr的参数过来,我们就可以认为这是验证微信公众平台中的设置。
以后的每次事件通知,微信方都不会再带这个参数了(除非再次修改配置的时候)。
关键代码:
public function index() { // 第一次请求(后台配置这个接口的时候)会传echostr // 以后的每一次都不会再传 if (!empty($_GET ['echostr']) && !empty($_GET ["signature"]) && !empty($_GET ["nonce"])) { $this->valid(); } else { // 监听消息事件 $this->listenEvent(); } }
这就算配置验证和监听事件的判断
下面我们再来加上关注事件的监听
/** * 监听消息事件,回复消息事件 */ private function listenEvent() { // 微信发送过来的数据,XML格式 //$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; $postStr = file_get_contents("php://input"); $disableLibxmlEntityLoader = libxml_disable_entity_loader(true); $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); if ('event' == strtolower($postObj->MsgType)) { if ('subscribe' == strtolower($postObj->Event)) { } } libxml_disable_entity_loader($disableLibxmlEntityLoader); }
微信方发过来的是XML格式的数据,我们需要用file_get_contents("php://input")来接收,
注意为了兼容性不要使用$GLOBALS["HTTP_RAW_POST_DATA"],有些服务器为了安全会把全局注册的配置关掉的。
发送过来的消息格式如下,参考https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454
<xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[FromUser] ]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType>< ![CDATA[event] ]></MsgType> <Event>< ![CDATA[subscribe] ]></Event> </xml>
我们就根据MsgType和Event来区别具体的事件
进入判断后,自动回复,直接输出XML。参考https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543
if ('event' == strtolower($postObj->MsgType)) { if ('subscribe' == strtolower($postObj->Event)) { $template = '<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>'; echo sprintf($template, $postObj->FromUserName, $postObj->ToUserName, time(), '欢迎您,基友!'); } }
DEMO代码下载
访客评论