教程跳票已經好久,5.0出來之後不少朋友在後臺諮詢如何用開發模式作自定義菜單,因爲ZTalk是訂閱號沒有辦法申請接口,幸虧WeMedia聯盟的公衆帳號已經轉爲服務號,就拿它來作教程了。php
源碼請在公衆號裏輸入 「微信代碼」
查看下載鏈接,而後將下載連接本身想辦法搞到PC上而後再下載……建議先下載安裝了再看文章,如下是注意事項:數據庫
一、make_menu.php是一個簡易版的自定義菜單生成器,須要修改的是Appid和AppSecret,文件與原來和微信通信接口文件無關,只要下載後放到SAE上就能夠執行,也不須要數據庫。json
二、interface.php裏主要是自定義菜單在用戶點擊後能夠回覆的一些東西,供你們參考。segmentfault
三、自定義菜單編輯模式的操做我這裏不寫了,你們能夠看《微信公衆平臺入門到精通》Vol.4。數組
話說微信的接口指南一直作得不咋地,這邊鼓勵你們都轉服務號,這邊給的說明文檔除了碼農真沒幾個能看明白的,一點也不考慮大量的小白運營者,乾脆叫指北算了。瀏覽器
牢騷完畢先說下開發自定義菜單第一步要作的就是獲取憑證,即access_token,這步很是重要,微信接下來會開放更多的開發接口,開發者要操做接口都要經過這個access_token,而這個憑證是須要經過接口來生成的,而且是有失效時間的。緩存
生成憑證須要兩個第三方的固定ID和祕鑰,進入開發模式的頁面,已經獲取到自定義菜單接口權限的朋友會看到下圖:
微信
除了原來接口通信url和本身設置的token多了兩個新字段即Appid和AppSecret,也就是第三方的固定ID和祕鑰,有了這個就能經過接口程序獲取到臨時的憑證。將這兩個id放到代碼以下圖位置:
微信公衆平臺
這段代碼主要是初始化了memcache和curl類,分別是緩存和抓取用的,同時將ID和祕鑰也賦值了。接下來就是經過接口獲取token,代碼以下圖:
less
這是一個獲取接口的函數,函數運行時首先是監測緩存中是否已經有token,若是有則直接從緩存中取,要知道官方限制天天只能獲取100次token,因此作個緩存頗有必要。
若是緩存中沒有token或者緩存時間過時,那麼就使用curl這個類發送Appid和AppSecret到接口獲取token,curl_setopt是定義抓取屬性的,curl_exec是運行抓取,想了解相關的能夠百度一下。
獲取的到是一個json格式數據,使用json_decode轉化爲數組,而後判斷是否獲取到,若是沒有則輸出錯誤信息,獲取成功則將該token保存到緩存中,同時函數返回token退出。這樣咱們就很方便的拿到了憑證。
拿到access_token之後咱們就能夠開始進行自定義菜單操做了,首先是建立自定義菜單,官方說明很簡單「經過POST一個特定結構體,實如今微信客戶端建立自定義菜單。」而後有一個特定結構體的示例,以下圖:
還有一些關於這個特定結構體字段的說明:
參數 | 是否必須 | 說明 |
---|---|---|
button | 是 | 按鈕數組,按鈕個數應爲2~3個 |
sub_button | 否 | 子按鈕數組,按鈕個數應爲2~5個 |
type | 是 | 按鈕類型,目前有click類型 |
name | 是 | 按鈕描述,既按鈕名字,不超過16個字節,子菜單不超過40個字節 |
key | 類型爲click必須 | 按鈕KEY值,用於消息接口(event類型)推送,不超過128字節 |
我估計有很多朋友會看的頭暈,一是這個特定結構體傳輸過去時應該賦值給那個變量?二是這個結構體如何生成?首先傳輸過去不須要任何變量參數,其次這就是一個json格式數據,咱們能夠用數組來轉換生成。
建立菜單的函數很是簡單,以下圖:
在這裏curl抓取頁面的方式不是get而是post,因此屬性會有所不一樣,可是主要是接口地址和發送的特定結構體,這裏的特定結構體是外面傳遞進來的值,變量名爲$menu。
主要來看下我作的簡易版的菜單生成器,直接在瀏覽器裏打開make_menu.php就能夠看到以下圖(注意修改下代碼裏的Appid和AppSecret):
原本想作些JS效果的,可是這個菜單結構原本就很簡單,就很少事了,上圖三個區塊分別對應三個底欄的主菜單,每一個區塊都有主菜單名、關鍵字和子菜單。
在說上面的菜單前先講下自定義菜單的規則,不管是主菜單仍是子菜單目前都是由最多三個屬性組成的,即名稱、關鍵字、類型(目前只有click,進行點擊操做時會將關鍵字發送給微信後臺),其中主菜單若是有子菜單的話,屬性就兩個,即名稱、子菜單(點擊操做時顯示子菜單)。
如上所述我設計的這個簡易版生成器忽略了類型選擇,若是主菜單有子菜單時主菜單關鍵字實際上是不記錄的,子菜單沒什麼可變化的就兩個屬性名稱和關鍵字,類型默認爲click。
固然將來會有新的菜單類型出來,好比地理位置,在這個基礎改動下也很是方便就能使用。下面詳細說下這個菜單的輸入框要填寫什麼。
主菜單名稱:底欄顯示的名字,建議4-5箇中文字或者8-10個英文字符,不然會名稱顯示會出現省略號;
主菜單關鍵字:主菜單向後臺發送的關鍵字,若是該菜單有子菜單則關鍵字失效。
子菜單:子菜單我使用了textarea,每一個子菜單格式爲「菜單名,關鍵字」,用換行來區分多個子菜單項。
表單提交後程序將進行處理,如圖:
進行三次循環,每次都會讀取一個區塊的菜單,若是該區塊主菜單名稱不爲空,則判斷是否有子菜單,沒有子菜單則直接生成主菜單,不然讀取子菜單,同時判斷子菜單是否超過5個。
這裏使用urlencode是由於中文在數組轉json時會被編碼爲unicode,微信接口沒法識別,因此得在json_encode前先來個編碼,等轉換後再用urldecode轉回來,這樣傳輸給接口的就是正常的中文了。
另外特定結構體的數組結構實際上是[button]-》[main_menu]-》[sub_menu]
,因此三個主菜單最後是賦值給button這個數組的一個元素。
當特定結構體生成後分別執行新建make_menu類,刪除舊菜單,建立新菜單,即:
$mk_menu=new make_menu(); $mk_menu->del_menu(); $mk_menu->create_new_menu($menu);
查詢、刪除菜單的代碼很是簡單你們能夠本身看,分別是get_menu()和del_menu()兩個函數。
自定義菜單生成後最重要的仍是要和用戶互動,那麼如何進行互動呢?首先要理解自定義菜單究竟是個什麼玩意,其實點擊菜單跟向微信公衆平臺發送一個文字是同樣的,也就是用戶輸入文字公衆平臺自動回覆能夠作的事情理論上自定義菜單均可以完成!
可是有一點不一樣的是,用戶輸入文字時咱們接收的消息類型是文字消息,可是自定義菜單的消息是事件推送,也就是它的類型是event,若是有看過我以前教程的朋友應該知道,能夠經過這個類型的兩個事件subscribe和unsubscribe來統計關注和取消關注的人數,菜單點擊則是第三個類型「CLICK」。
也就是當後臺捕捉到「CLICK」這個操做時就表示這是用戶點擊了自定義菜單,而後能夠獲取到EventKey(事件關鍵字),就是在建立菜單時設置的菜單關鍵字,後面的就不用我再詳細說了吧。
如下是一些代碼截圖,可供參考:
先獲取消息類型爲事件推送,而後監測到事件類型是自定義菜單點擊,而後獲取該菜單關鍵字。
回覆文字消息
回覆音樂消息
回覆圖文消息
一些效果截圖,想要測試效果的請微信搜索「wemedia」關注,點擊這裏也可下載本期教程源碼包。