微信公众平台应用开发实践
上QQ阅读APP看书,第一时间看更新

4.4 接收事件消息

事件消息是订阅用户对公众号执行某种操作触发的消息。微信公众平台支持6种事件:关注/取消关注事件、扫描带参数二维码事件、上报地理位置事件、自定义菜单事件、点击菜单拉取消息事件、点击菜单跳转链接事件。下面详细介绍各个事件。

4.4.1 关注/取消关注事件

当用户关注和取消关注公众号时,微信会把这个事件推送到开发者填写的URL,方便开发者给用户发送欢迎消息或做账号的解绑。消息格式如下:

     <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[FromUser]]></FromUserName>
     <CreateTime>123456789</CreateTime>
     <MsgType><![CDATA[event]]></MsgType>
     <Event><![CDATA[subscribe]]></Event>
     </xml>

参数说明如表4-10所示。

表4-10 参数说明

     const EVENT_TYPE_SUBSCRIBE='subscribe';
     const EVENT_TYPE_UNSUBSCRIBE='unsubscribe';
     /**
          *判断是否是订阅事件
          * @return boolean
          */
         public function isSubscribeEvent()
         {
             return $this->_postData->Event == self::EVENT_TYPE_SUBSCRIBE &&
                 $this->_postData->EventKey == "";
     }
     /**
          *判断是否是退订事件
          * @return boolean
          */
         public function isUnsubscribeEvent()
         {
             return $this->_postData->Event == self::EVENT_TYPE_UNSUBSCRIBE;
         }
     $this->text("订阅事件,订阅用户是:".$data->FromUserName);

运行结果如图4-12所示。

图4-12

4.4.2 扫描二维码事件

微信提供了生成二维码的功能,赋予公众号更多的含义和想象空间。当微信用户扫描二维码时,微信公众平台可能会推送以下两种事件:

  • 如果用户还未关注公众号,那么可以先关注公众号,关注后,微信会将带场景值的关注事件推送给开发者。如果用户不关注,自然就不会推送事件。
  • 如果用户已经关注了公众号,微信就会将带场景值扫描事件推送给开发者。
1.用户未关注时,进行关注后的事件推送
     <xml><ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[FromUser]]></FromUserName>
     <CreateTime>123456789</CreateTime>
     <MsgType><![CDATA[event]]></MsgType>
     <Event><![CDATA[subscribe]]></Event>
     <EventKey><![CDATA[qrscene_123123]]></EventKey>
     <Ticket><![CDATA[TICKET]]></Ticket>
     </xml>

参数说明如表4-11所示。

表4-11 参数说明

     /**
          *判断是否是未关注用户扫描二维码事件
          * @return boolean
          */
         public function isSubscribeScanEvent()
         {
              return $this->_postData->Event == self::EVENT_TYPE_SUBSCRIBE &&
                     $this->_postData->EventKey != "";
         }
     $this->text("未订阅用户扫描二维码事件,Key值是:".$data->EventKey."\nTicket值是:".$data->Ticket);

运行结果如图4-13所示。

图4-13

2.用户已关注时的事件推送

推送XML数据包示例:

     <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[FromUser]]></FromUserName>
     <CreateTime>123456789</CreateTime>
     <MsgType><![CDATA[event]]></MsgType>
     <Event><![CDATA[SCAN]]></Event>
     <EventKey><![CDATA[SCENE_VALUE]]></EventKey>
     <Ticket><![CDATA[TICKET]]></Ticket>
     </xml>

参数说明如表4-12所示。

表4-12 参数说明

    const EVENT_TYPE_SCAN='SCAN';
    /**
         *判断是否是扫描二维码事件
         * @return boolean
         */
        public function isScanEvent()
        {
            return $this->_postData->Event == self::EVENT_TYPE_SCAN;
    }
    $this->text("已订阅用户扫描二维码事件,Key值是:".$data->EventKey."\nTicket值
是:".$data->Ticket."\nCreateTime是:".$data->CreateTime);

运行结果如图4-14所示。

4.4.3 上报地理位置事件

用户同意上报地理位置后,每次进入公众号会话时都会上报地理位置,或者在进入会话后每5秒上报一次地理位置,公众号可以在公众平台网站上修改这些设置。上报地理位置时,微信将上报地理位置事件推送到开发者填写的URL,如图4-15所示。

图4-14

图4-15

     xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[fromUser]]></FromUserName>
     <CreateTime>123456789</CreateTime>
     <MsgType><![CDATA[event]]></MsgType>
     <Event><![CDATA[LOCATION]]></Event>
     <Latitude>23.137466</Latitude>
     <Longitude>113.352425</Longitude>
     <Precision>119.385040</Precision>
     </xml>

参数说明如表4-13所示。

表4-13 参数说明

    const EVENT_TYPE_LOCATION='LOCATION';
    /**
         *判断是否是上传地理位置事件
         * @return boolean
         */
        public function isLocaitonEvent()
        {
            return $this->_postData->Event == self::EVENT_TYPE_LOCATION;
    }
    $this->text("上传地理位置事件,纬度是:".$data->Latitude."\n经度是:".$data->Longitude."\n精度
是:".$data->Precision);

运行结果如图4-16所示。

图4-16

4.4.4 自定义菜单事件

用户点击自定义菜单后,如果菜单按钮是Click类型,微信就会把点击事件推送给开发者,如果菜单按钮是View类型(跳转到URL)或点击菜单弹出子菜单,就不会产生上报。

     <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[FromUser]]></FromUserName>
     <CreateTime>123456789</CreateTime>
     <MsgType><![CDATA[event]]></MsgType>
     <Event><![CDATA[CLICK]]></Event>
     <EventKey><![CDATA[EVENTKEY]]></EventKey>
     </xml>

参数说明如表4-14所示。

表4-14 参数说明

     const EVENT_TYPE_CLICK='CLICK';
     /**
          *判断是否是点击菜单拉取消息事件
          * @return boolean
          */
         public function isClickEvent()
         {
             return $this->_postData->Event == self::EVENT_TYPE_CLICK;
     }
     $this->text("点击菜单拉取消息事件,Key值是:".$data->EventKey);

运行结果如图4-17所示。

图4-17