
上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