在開發微信公眾號時,有自定義菜單模塊的開發。
通過官方微信公眾號開發文檔:https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html
我們可以了解到定義菜單接口有多種類型按鈕,如下:
1、click:點擊推事件用戶點擊click類型按鈕后,微信服務器會通過消息接口推送消息類型為event的結構給開發者(參考消息接口指南),並且帶上按鈕中開發者填寫的key值,開發者可以通過自定義的key值與用戶進行交互;
2、view:跳轉URL用戶點擊view類型按鈕后,微信客戶端將會打開開發者在按鈕中填寫的網頁URL,可與網頁授權獲取用戶基本信息接口結合,獲得用戶基本信息。
3、scancode_push:掃碼推事件用戶點擊按鈕后,微信客戶端將調起掃一掃工具,完成掃碼操作后顯示掃描結果(如果是URL,將進入URL),且會將掃碼的結果傳給開發者,開發者可以下發消息。
4、scancode_waitmsg:掃碼推事件且彈出“消息接收中”提示框用戶點擊按鈕后,微信客戶端將調起掃一掃工具,完成掃碼操作后,將掃碼的結果傳給開發者,同時收起掃一掃工具,然后彈出“消息接收中”提示框,隨后可能會收到開發者下發的消息。
5、pic_sysphoto:彈出系統拍照發圖用戶點擊按鈕后,微信客戶端將調起系統相機,完成拍照操作后,會將拍攝的相片發送給開發者,並推送事件給開發者,同時收起系統相機,隨后可能會收到開發者下發的消息。
6、pic_photo_or_album:彈出拍照或者相冊發圖用戶點擊按鈕后,微信客戶端將彈出選擇器供用戶選擇“拍照”或者“從手機相冊選擇”。用戶選擇后即走其他兩種流程。
7、pic_weixin:彈出微信相冊發圖器用戶點擊按鈕后,微信客戶端將調起微信相冊,完成選擇操作后,將選擇的相片發送給開發者的服務器,並推送事件給開發者,同時收起相冊,隨后可能會收到開發者下發的消息。
8、location_select:彈出地理位置選擇器用戶點擊按鈕后,微信客戶端將調起地理位置選擇工具,完成選擇操作后,將選擇的地理位置發送給開發者的服務器,同時收起位置選擇工具,隨后可能會收到開發者下發的消息。
9、media_id:下發消息(除文本消息)用戶點擊media_id類型按鈕后,微信服務器會將開發者填寫的永久素材id對應的素材下發給用戶,永久素材類型可以是圖片、音頻、視頻、圖文消息。請注意:永久素材id必須是在“素材管理/新增永久素材”接口上傳后獲得的合法id。
10、view_limited:跳轉圖文消息URL用戶點擊view_limited類型按鈕后,微信客戶端將打開開發者在按鈕中填寫的永久素材id對應的圖文消息URL,永久素材類型只支持圖文消息。請注意:永久素材id必須是在“素材管理/新增永久素材”接口上傳后獲得的合法id。
11、miniprogram:跳轉到小程序頁面。
在開發文檔中有相關的前端創建菜單請示實例,但是缺少這些自定義菜單響應事件的例子,在百度上搜索到一段不錯的代碼,有利於我們理解和開發自定義菜單響應事件。可以結合自己公眾號的消息回復進行理解去開發。這個例子主要對click類型進行說明。
/** * 相關回復 */ public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//返回回復數據 if (!empty($postStr)) { $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName;//發送消息方ID $toUsername = $postObj->ToUserName;//接收消息方ID $keyword = trim($postObj->Content);//用戶發送的消息 $times = time();//發送時間 $MsgType = $postObj->MsgType;//消息類型 $msgType = "text"; if($MsgType=='event') { $MsgEvent = $postObj->Event;//獲取事件類型 if ($MsgEvent=='subscribe') { //訂閱事件 } elseif ($MsgEvent=='CLICK') { //點擊事件 $EventKey = $postObj->EventKey;//菜單的自定義的key值,可以根據此值判斷用戶點擊了什么內容,從而推送不同信息 switch($EventKey) { case "V1001_TODAY_MUSIC" : //要返回相關內容 break; case "V1001_TODAY_SINGER" : //要返回相關內容 break; case "V1001_HELLO_WORLD" : //要返回相關內容 break; case "V1001_GOOD" : //要返回相關內容 break; } } } $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $times, "text", "這里是要說的內容"); } else { echo '沒有任何消息傳遞'; } }