![微信公众平台应用开发实践](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=1739262240-dyw8RTyvdfvdidMA0nnPVtokN7l1Ty7I-0-98ef5eb791d14c918aaf727a80ddcea2)
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=1739262240-wYsjiefCmT4uLg0SPthsnIAK8v92r8Ff-0-b8bf70f7f01931eab6b9a52fd8b969d5)
图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=1739262240-HJisMVNJOCZOYUCqxfe0vCR1ccn9QGbz-0-dcbfe2fd57fa1333cf1aa8d622d25676)
/** *判断是否是未关注用户扫描二维码事件 * @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=1739262240-cUr4l0GLGRr3jQsEb5IE8v9OtRWN0hvm-0-f65baa5828c0ee80299ff068a442f236)
图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=1739262240-50x3I4WFbHN2ZBhYD9eaYlY7ir4VjzS9-0-5e143a9113870ca608b1c05cd4d9be8a)
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=1739262240-Z3u9QZsyHkWR4P9nQo5gH4X5PGTVAQEf-0-abc252354478f27eec326ce5677281cd)
图4-14
![](https://epubservercos.yuewen.com/8F6849/10771285703465906/epubprivate/OEBPS/Images/image-0258.jpg?sign=1739262240-KU7CTZuKkImxJTwoiv8ySSDKpL3nznos-0-23137d0e24c1fbf9bb2cd769ea925923)
图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=1739262240-jP2qxXhmWE7GuezzedRBBHBkQMFZbsJs-0-7633355fad5c13f5052cb81a847cfbfd)
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=1739262240-VqkOEcUtPjp2qwRCHSbvxLw5yo7l2Y3W-0-3877a7cf72e818945354dba3940248d3)
图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=1739262240-TJ5Gwnd7oCAIk8cFGgAyEHQvlWMyIuE5-0-e8fab53bf4765e927b7e1012051e4d58)
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=1739262240-9e77g73IjaELNJsurJWaS3UW8EJWqBEd-0-b2bf9ee2fbcd80d1d888fc151ca3a1e2)
图4-17