讀古今文學網 > 微信公眾平台開發:從零基礎到ThinkPHP5高性能框架實踐 > 5.2.7 菜單事件推送 >

5.2.7 菜單事件推送

用戶點擊菜單之後,微信會將事件推送給接口程序,相應的參數及說明如表5-5所示。

表5-5 自定義菜單事件字段的參數說明

用戶點擊自定義菜單後,接口程序收到的XML數據包如下。


<xml>
    <ToUserName><![CDATA[gh_36dd0f0b3132]]></ToUserName>
    <FromUserName><![CDATA[oQW8FuN_DFnKZwBaUKQ1RJD2Tr9M]]></FromUserName>
    <CreateTime>1468050882</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[CLICK]]></Event>
    <EventKey><![CDATA[TEXT]]></EventKey>
</xml>
  

點擊按鈕類型為view的菜單後,上報的XML數據包如下。


<xml>
    <ToUserName><![CDATA[gh_36dd0f0b3132]]></ToUserName>
    <FromUserName><![CDATA[oQW8FuN_DFnKZwBaUKQ1RJD2Tr9M]]></FromUserName>
    <CreateTime>1468050934</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[VIEW]]></Event>
    <EventKey><![CDATA[http:// xw.qq.com/]]></EventKey>
    <MenuId>410418124</MenuId>
</xml>
  

點擊scancode_push類型的菜單時,接口程序收到的XML數據包如下。微信會直接運行解碼後的內容,比如直接進入關注界面。


<xml>
    <ToUserName><![CDATA[gh_36dd0f0b3132]]></ToUserName>
    <FromUserName><![CDATA[oQW8FuN_DFnKZwBaUKQ1RJD2Tr9M]]></FromUserName>
    <CreateTime>1468051082</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[scancode_push]]></Event>
    <EventKey><![CDATA[rselfmenu_2_2]]></EventKey>
    <ScanCodeInfo>
        <ScanType><![CDATA[qrcode]]></ScanType>
        <ScanResult><![CDATA[http:// weixin.qq.com/r/l0Ozq9-EbYISrZvI9xaF]]></ScanResult>
    </ScanCodeInfo>
</xml>
  

點擊scancode_waitmsg類型的菜單時,接口程序收到的XML數據包如下。


<xml>
    <ToUserName><![CDATA[gh_36dd0f0b3132]]></ToUserName>
    <FromUserName><![CDATA[oQW8FuN_DFnKZwBaUKQ1RJD2Tr9M]]></FromUserName>
    <CreateTime>1468051112</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[scancode_waitmsg]]></Event>
    <EventKey><![CDATA[rselfmenu_2_1]]></EventKey>
    <ScanCodeInfo>
        <ScanType><![CDATA[qrcode]]></ScanType>
        <ScanResult><![CDATA[http:// weixin.qq.com/r/l0Ozq9-EbYISrZvI9xaF]]></ScanResult>
    </ScanCodeInfo>
</xml>
  

點擊pic_sysphoto類型的菜單後,微信調用手機中的系統相機,照相後再發過來時,就收到了一個圖片消息。點擊該菜單時的XML數據包如下。


<xml>
    <ToUserName><![CDATA[gh_36dd0f0b3132]]></ToUserName>
    <FromUserName><![CDATA[oQW8FuNH_V1zk4x3zTN1IMoAZDW0]]></FromUserName>
    <CreateTime>1468051307</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[pic_sysphoto]]></Event>
    <EventKey><![CDATA[rselfmenu_2_3]]></EventKey>
    <SendPicsInfo>
        <Count>1</Count>
        <PicList>
            <item>
                <PicMd5Sum><![CDATA[4cc7f5ab2c499b01655e99a868ef3519]]></PicMd5Sum>
            </item>
        </PicList>
    </SendPicsInfo>
</xml>
  

點擊pic_photo_or_album類型的菜單後,先推送菜單事件給開發者,然後推送圖片消息。點擊該菜單時的XML數據包如下。


<xml>
    <ToUserName><![CDATA[gh_36dd0f0b3132]]></ToUserName>
    <FromUserName><![CDATA[oQW8FuNH_V1zk4x3zTN1IMoAZDW0]]></FromUserName>
    <CreateTime>1468051528</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[pic_photo_or_album]]></Event>
    <EventKey><![CDATA[rselfmenu_2_4]]></EventKey>
    <SendPicsInfo>
        <Count>2</Count>
        <PicList>
            <item>
                <PicMd5Sum><![CDATA[b5c23feac0987db7ddda1b0a3addba9d]]></PicMd5Sum>
            </item>
            <item>
                <PicMd5Sum><![CDATA[59c3eb7e2124a75986295b8842573951]]></PicMd5Sum>
            </item>
        </PicList>
    </SendPicsInfo>
</xml>
  

點擊pic_weixin類型的菜單後,微信客戶端將調用系統相機,用戶可以選擇已有相片或者進行拍照,微信會將照片發送給開發者。下面是一次選擇3張照片時的XML數據包。


<xml>
    <ToUserName><![CDATA[gh_36dd0f0b3132]]></ToUserName>
    <FromUserName><![CDATA[oQW8FuNH_V1zk4x3zTN1IMoAZDW0]]></FromUserName>
    <CreateTime>1468051592</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[pic_weixin]]></Event>
    <EventKey><![CDATA[rselfmenu_2_5]]></EventKey>
    <SendPicsInfo>
        <Count>3</Count>
        <PicList>
            <item>
                <PicMd5Sum><![CDATA[59c3eb7e2124a75986295b8842573951]]></PicMd5Sum>
            </item>
            <item>
                <PicMd5Sum><![CDATA[b5c23feac0987db7ddda1b0a3addba9d]]></PicMd5Sum>
            </item>
            <item>
                <PicMd5Sum><![CDATA[4cc7f5ab2c499b01655e99a868ef3519]]></PicMd5Sum>
            </item>
        </PicList>
    </SendPicsInfo>
</xml>
  

點擊location_select類型的菜單後,將會調用發送位置功能,在用戶發送位置後,會再推送一個地理位置消息給用戶。其XML數據包如下。


<xml>
    <ToUserName><![CDATA[gh_36dd0f0b3132]]></ToUserName>
    <FromUserName><![CDATA[oQW8FuNH_V1zk4x3zTN1IMoAZDW0]]></FromUserName>
    <CreateTime>1468051658</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[location_select]]></Event>
    <EventKey><![CDATA[SIGNIN]]></EventKey>
    <SendLocationInfo>
        <Location_X><![CDATA[22.53996467590332]]></Location_X>
        <Location_Y><![CDATA[113.93487548828125]]></Location_Y>
        <Scale><![CDATA[17]]></Scale>
        <Label><![CDATA[廣東省深圳市南山區深南大道10000號]]></Label>
        <Poiname><![CDATA[騰訊大廈]]></Poiname>
    </SendLocationInfo>
</xml>
  

消息接口中,響應自定義菜單點擊事件的核心代碼如下。


// 接收事件消息
private function receiveEvent($object)
{
    $content = "";
    switch ($object->Event)
    {
        case "subscribe":
            $content = "歡迎關注方倍工作室 ";
            $content .= (!empty($object->EventKey))?("\n來自二維碼場景 ".str_replace
            ("qrscene_","",$object->EventKey)):"";
            break;
        case "unsubscribe":
            $content = "取消關注";
            break;
        case "CLICK":
            switch ($object->EventKey)
            {
                case "COMPANY":
                    $content = array;
                    $content = array("Title"=>"方倍工作室", "Description"=>"", "Pic
                    Url"=>"http:// discuz.comli.com/weixin/weather/icon/cartoon.jpg", 
                    "Url" =>"http:// m.cnblogs.com/?u=txw1958");
                    break;
                default:
                    $content = "點擊菜單:".$object->EventKey;
                    break;
            }
            break;
        case "VIEW":
            $content = "跳轉鏈接 ".$object->EventKey;
            break;
        case "SCAN":
            $content = "掃瞄場景 ".$object->EventKey;
            break;
        case "LOCATION":
            $content = "上傳位置:緯度 ".$object->Latitude.";經度 ".$object->Longitude;
            break;
        case "scancode_waitmsg":
            $content = "掃碼帶提示:類型 ".$object->ScanCodeInfo->ScanType." 結果:".
            $object->ScanCodeInfo->ScanResult;
            break;
        case "scancode_push":
            $content = "掃碼推事件";
            break;
        case "pic_sysphoto":
            $content = "系統拍照";
            break;
        case "pic_weixin":
            $content = "相冊發圖:數量 ".$object->SendPicsInfo->Count;
            break;
        case "pic_photo_or_album":
            $content = "拍照或者相冊:數量 ".$object->SendPicsInfo->Count;
            break;
        case "location_select":
            $content = "發送位置:標籤 ".$object->SendLocationInfo->Label;
            break;
        default:
            $content = "receive a new event: ".$object->Event." \n技術支持 方倍工作室";
            break;
    }

    if(is_array($content)){
        if (isset($content[0]['PicUrl'])){
            $result = $this->transmitNews($object, $content);
        }else if (isset($content['MusicUrl'])){
            $result = $this->transmitMusic($object, $content);
        }
    }else{
        $result = $this->transmitText($object, $content);
    }
    return $result;
}