- 微信公眾平臺應用開發實踐
- 閆小坤 周濤
- 1020字
- 2019-01-04 05:28:05
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