![微信公众平台应用开发实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/719/929719/b_929719.jpg)
上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 参数说明
![](https://epubservercos.yuewen.com/8F6849/10771285703465906/epubprivate/OEBPS/Images/image-0340.jpg?sign=1739421865-lIxEIA7oqWEyIgQ92HpesxCc07OBlD5s-0-864ea0a3d583731def0df2f654b9ffac)
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所示。
![](https://epubservercos.yuewen.com/8F6849/10771285703465906/epubprivate/OEBPS/Images/image-0255.jpg?sign=1739421865-aa2UVxUTTpjE7yzULTgcWqV82w3GIIO7-0-9207a9e77f2516268407ccf493f054f5)
图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 参数说明
![](https://epubservercos.yuewen.com/8F6849/10771285703465906/epubprivate/OEBPS/Images/image-0341.jpg?sign=1739421865-iIAdfinJSLgZPvQdUDRUOYiI8Q54uEow-0-b753c58ee53aaa47d40390bc06549e9b)
/** *判断是否是未关注用户扫描二维码事件 * @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所示。
![](https://epubservercos.yuewen.com/8F6849/10771285703465906/epubprivate/OEBPS/Images/image-0256.jpg?sign=1739421865-3r1PVVGL59bQpy0qezN8hdITyazXISek-0-a4f961d798bdb92a7010560d6e62fe69)
图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 参数说明
![](https://epubservercos.yuewen.com/8F6849/10771285703465906/epubprivate/OEBPS/Images/image-0342.jpg?sign=1739421865-lQDGYhLusWzC8CLw23gv2LUTchk8ZW6C-0-8ad7d435cd3acfbaf2dd04fc18aae885)
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所示。
![](https://epubservercos.yuewen.com/8F6849/10771285703465906/epubprivate/OEBPS/Images/image-0257.jpg?sign=1739421865-tiGaLLyZAeScSQeG421SIx7RYUtwWn0Z-0-23a6c369f54b4efc6327f942f71da870)
图4-14
![](https://epubservercos.yuewen.com/8F6849/10771285703465906/epubprivate/OEBPS/Images/image-0258.jpg?sign=1739421865-jNtSezy3Qf1Na7Ee596nKCho6QEJg4jw-0-deae6ae43298e7ed6e11e0cedb154a20)
图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 参数说明
![](https://epubservercos.yuewen.com/8F6849/10771285703465906/epubprivate/OEBPS/Images/image-0343.jpg?sign=1739421865-vaeiuiZNQz9s20sZmGS1iDiSCJ5pTU4L-0-c74d8b6500dad973317c2c00ba0a1857)
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所示。
![](https://epubservercos.yuewen.com/8F6849/10771285703465906/epubprivate/OEBPS/Images/image-0259.jpg?sign=1739421865-WewfauHxOQ7qaAP2Vba6TW90YFiSIXS5-0-7739e527339828e49eba704a00dc48bd)
图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 参数说明
![](https://epubservercos.yuewen.com/8F6849/10771285703465906/epubprivate/OEBPS/Images/image-0344.jpg?sign=1739421865-sHS5xJMvmmTmbdbTWOUgMV8EYOxu9AR2-0-a4a1186b9538aa6650cc2fde046ba0a6)
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所示。
![](https://epubservercos.yuewen.com/8F6849/10771285703465906/epubprivate/OEBPS/Images/image-0260.jpg?sign=1739421865-q1HND1aWdIJG7Sr26D29Qa5apRZ8hFi6-0-4c8128b2084a38a5c766fd878c0596ac)
图4-17