有了微信公众号开发(一)之准备工作,下面我们来讲讲消息事件的监听和自动回复

举个例子,当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代码下载

EventController.rar