1. 程式人生 > >微信測試號開發之五 自定義選單

微信測試號開發之五 自定義選單

注意:

1、自定義選單最多包括3個一級選單,每個一級選單最多包含5個二級選單。

2、一級選單最多4個漢字,二級選單最多7個漢字,多出來的部分將會以“...”代替。

3、測試時可以嘗試取消關注公眾賬號後再次關注,則可以看到建立後的效果。

按鈕型別:

1、click:點選推事件使用者點選click型別按鈕後,微信伺服器會通過訊息介面推送訊息型別為event的結構給開發者(參考訊息介面指南),並且帶上按鈕中開發者填寫的key值,開發者可以通過自定義的key值與使用者進行互動;
2、view:跳轉URL使用者點選view型別按鈕後,微信客戶端將會開啟開發者在按鈕中填寫的網頁URL,可與網頁授權獲取使用者基本資訊介面結合,獲得使用者基本資訊。

瞭解更多請檢視微信開發文件  https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013

建立選單介面:

http請求方式:POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

click和view型別按鈕的請求資料格式如下:

{
     "button":[
     {
          "type":"click",
          "name":"今日歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"選單",
           "sub_button":[
           {
               "type":"view",
               "name":"搜尋",
               "url":"http://www.soso.com/"
            },
            {
                 "type":"miniprogram",
                 "name":"wxa",
                 "url":"http://mp.weixin.qq.com",
                 "appid":"wx286b93c14bbf93aa",
                 "pagepath":"pages/lunar/index"
             },
            {
               "type":"click",
               "name":"贊一下我們",
               "key":"V1001_GOOD"
            }]
       }]
 }

進行開發:

(一):封裝按鈕物件

一:基類

public class Button {

  private String name;//所有一級選單、二級選單都共有一個相同的屬性,那就是name


   public String getName() {
       return name;
   }


   public void setName(String name) {
       this.name = name;
   }


}

二:子選單類

/**
* 描述: 子選單項 :沒有子選單的選單項,有可能是二級選單項,也有可能是不含二級選單的一級選單。
 */
public class CommonButton extends Button {
    
    private String type;
    private String key;
    private String url;


    public String getType() {
        return type;
    }


    public void setType(String type) {
        this.type = type;
    }


    public String getKey() {
        return key;
    }


    public void setKey(String key) {
        this.key = key;
    }


public String getUrl() {
return url;
}


public void setUrl(String url) {
this.url = url;
}
    
    
}

三:父選單類

/**
* 描述: 父選單項 :包含有二級選單項的一級選單。這類選單項包含有二個屬性:name和sub_button,而sub_button以是一個子選單項陣列 
 */
public class ComplexButton extends Button {
    private Button[] sub_button;


    public Button[] getSub_button() {
        return sub_button;
    }


    public void setSub_button(Button[] sub_button) {
        this.sub_button = sub_button;
    }
}

四:選單物件的封裝類

/**
* 描述: 整個選單物件的封裝
 */
public class Menu {
    private Button[] button;

    public Button[] getButton() {
        return button;
    }

    public void setButton(Button[] button) {
        this.button = button;
    }
}

(二):封裝生成選單的方法

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mote.weixin.entry.Menu;


public class MenuUtils {

    private static ObjectMapper MAPPER = new ObjectMapper();
    
    
    public static int createMenu(Menu menu, String accessToken) throws Exception {
        int result = 0;
        // 拼裝建立選單的url
        String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+accessToken+"";
        // 將選單物件轉換成json字串
        String jsonMenu = MAPPER.writeValueAsString(menu);
        // 呼叫介面建立選單,CommonUtils是上一篇中介紹的內容
        String resq = CommonUtils.Post_Json(url, jsonMenu);
        
        JsonNode tree = MAPPER.readTree(resq);
        if(tree.get("errcode").toString().equals("0")){
        System.out.println("選單建立成功!");
        }else{
        System.out.println("選單建立失敗!");
        }

        return result;
    }
}

(三):組裝資料,生成選單

import org.springframework.stereotype.Controller;


import com.mote.weixin.entry.Button;
import com.mote.weixin.entry.CommonButton;
import com.mote.weixin.entry.ComplexButton;
import com.mote.weixin.entry.Menu;
import com.mote.weixin.utils.CommonUtils;
import com.mote.weixin.utils.MenuUtils;


@Controller
public class MenuController {

public static void main(String[] args) {


try {
// 呼叫介面獲取access_token,CommonUtils是上一篇中的內容
String accessToken = CommonUtils.getAccessToken();
// 呼叫介面建立選單
MenuUtils.createMenu(getMenu(), accessToken);
} catch (Exception e) {
System.out.println("選單建立失敗");
e.printStackTrace();
}


}


/**
* 組裝選單資料
* 
* @return
*/
private static Menu getMenu() {


CommonButton btn11 = new CommonButton();
btn11.setName("校園導航");
btn11.setType("view");
btn11.setUrl("http://02d73f21.ngrok.io/wx_coges/navi.jsp");


CommonButton btn21 = new CommonButton();
btn21.setName("學校風采");
btn21.setType("view");
btn21.setKey("21");
btn21.setUrl("https://www.baidu.com/");


CommonButton btn31 = new CommonButton();
btn31.setName("健身服務");
btn31.setType("click");
btn31.setKey("31");


CommonButton btn32 = new CommonButton();
btn32.setName("愛情諮詢");
btn32.setType("click");
btn32.setKey("32");


/**
* 微信: mainBtn2,mainBtn3底部的三個一級選單
*/


ComplexButton mainBtn3 = new ComplexButton();
mainBtn3.setName("更多服務");
mainBtn3.setSub_button(new CommonButton[] { btn31, btn32});


/**
* 封裝整個選單
*/
Menu menu = new Menu();
menu.setButton(new Button[] { btn11, btn21, mainBtn3 });


return menu;
}


}

ok了,直接執行main方法就可以生成選單了,試試吧