最近一個禮拜搞了一個微信自訂選單的開發,總的來說蠻鬱悶的。
先給幾個介面做下分析:
1:查詢介面;查詢介面分為兩個,一個是開發模式下的普通查詢接口,他只會查詢出你通過加入介面創造出來的選單和個人化的選單(讓公眾號的不同使用者群體看到不一樣的自訂選單),而不能取得到你透過微信管理平台新增的選單。還有一個是可以查詢全部菜單的接口,這個接口有點蛋疼,如果你先在平台上添加一個菜單,然後後台調用這個接口就可以獲取到這個菜單,但調用這個接口的返回的json跟添加時的格式是不一樣的(就是說你把它發回給你的json原模原樣傳給微信去創建菜單是創建不了的),而且微信平台上添加的菜單有很多種,每一種返回的json格式都是不一樣的,如果要解析的話是很麻煩的一件事,所以個人覺得既然選擇了開發者模式那麼還是使用普通的那個查詢介面比較好。
2:創建接口;這個接口的作用,顧名思義就是創建接口,但是這個接口不是在原來的基礎上創建,而是把全部的菜單全部重新創建,每次調用都是把你需要留下來的菜單加工成固定格式的json然後去傳給微信,所以如果你想單個刪除,那你就把想要刪除的那個菜單去掉,把剩下的重新變成一個json,修改也一樣,把你需要改的資料替換掉,然後把全部選單變成一個json傳給微信。
3:刪除介面;這個介面是用來刪除全部選單時候用的,不過不會立即生效,呼叫以後,貌似要到第二天才能看到效果,而且這段時間內你還是能夠查詢到你之前創建了的選單。
我的任務是把選單的增刪改查整合到後台管理中去,這裡只說下自己的後台的出來方式,請求微信的接口返回的是一個json字符串,我的做法是把這個字串解析出來,依照一定的規則寫成一個物件然後加入list中,增刪改的時候都去操作這個list,然後在把list轉換回微信要求的格式的json,呼叫微信的介面去建立選單(增刪改都呼叫建立介面)。物件部分我的屬性分別是id(把list的下標設定為id方便操作),name(選單名稱),type(選單類型,微信自訂選單的種類有10種貌似),parent(父級選單名稱),SecendLvMenu(二級選單個數),url(連結型選單需要),key(呼叫推送功能),mediaid(
呼叫素材時都要設定madia_id),sort(排序號)。
以下為json轉list的程式碼,此處的json套件是阿里的fastjson包,相當好用:
public static List
List
obj=obj.getJSONObject("menu");
JSONObject a=new JSON();
1#int num=0;
if(obj!=null){
#//取得button的json陣列
JSONArray array=obj.getJSONArray(" button");
if(array!=null){
for(int i=0;i a= array.getJSONObject(i); //沒有類型說明是帶有二級選單類型的一級選單 if(a.get("type")==null){ weixinMenu menu=new weixinMenu(); menu.setId(num); menu.setSort(num); num++; #menu.setName(a.getString("name"));//設定下標設定排序號碼存入list //取得該一級選單下的二級選單 JSONArray sub=a.getJSONArray("sub_button"); //二級選單的個數,由於二級選單上限為5個,加一個個數字加時容易判斷 #menu.setSecendLvMenuNum(sub.size()); menulist.add(menu); JSONObject b=new JSONObject(); for(int j =0;j weixinMenu menu2=new weixinMenu(); b=sub.getJSONObject(j); #menu2 .setId(num); menu2.setSort(num); num++; menu2.setName(b.getString("name")); menu2.setParent(a.getString("name"));//父級選單就是剛才的一級選單名稱 menu2.setType(b.getString("type")); menu2.setUrl(b.getString("url")); menu2.setKey(b.getString("key")); menu2.setMediaId(b .getString("media_id")); menulist.add(menu2); } }else{//否則為無二級選單的一級選單,點選直接跳轉或觸發對應事件 weixinMenu menu=new weixinMenu(); menu.setId(num); menu.setSort(num); num++; menu.setName(a.getString("name")); menu.setKey(a.getString("key")); menu.setMediaId(a.getString("media_id")); menulist.add(menu); } } } ##weixinMenu menu=new weixinMenu(); int size=list.size(); for(int i=0;i menu=list.get(i); //無二級選單,無父級選單,則為無二級類型一級選單 if(menu.getSecendLvMenuNum( )==0&&menu.getParent()==null){ Map map.put("name" , menu.getName()); map.put("type", menu.getType()); if(menu.getUrl()!=null){ map.put("url", menu.getUrl()); } if(menu.getKey()!=null){ #map .put("key", menu.getKey()); } #if(menu.getMediaId()!=null){ map.put(" media_id", menu.getMediaId()); } #array.add(map); }else if(menu.getParent()==null){無父級選單則為帶二級一級選單 JSONObject obj=new JSONObject(); JSONArray sub=new JSONArray(); #obj.put( "name",menu.getName()); weixinMenu submenu=new weixinMenu(); //循環遍歷整個list用name匹配查找該一級菜單下的二級菜單 for(int j=0;j submenu=list.get(j); Map if((menu.getName()).equals(submenu.getParent())){ map=new HashMap map.put("name", submenu.getName()); map.put("type", submenu.getType()); if(submenu.getUrl() !=null){ map.put("url", submenu.getUrl()); } if(submenu.getKey()!=null) { map.put("key", submenu.getKey()); #} if(submenu.getMediaId()!=null){ map.put("media_id", submenu.getMediaId()); #} sub.add(map); 以上是詳解微信個人化選單開發模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!