##自定義菜單
###簡介
自定義菜單的開發,會讓公眾號更像是一個輕量級的應用。可以更好的提升公眾號的交互屬性。
###自定義菜單創建
* * * * *
######**提示**:
######1.自定義菜單最多包括3個一級菜單,每個一級菜單最多5個二級菜單。
######2.一級菜單最多4個漢字,二級菜單最多7個漢字,多出來的部分會以“...”代替。
######3.創建自定義菜單后,菜單的刷新策略是,在用戶進入公眾號會話頁或公眾號profile頁時,如果發現上一次拉取菜單的請求在5分鐘以前,就會拉取一下菜單,如果菜單有更新,就會刷新客戶端的菜單。測試時可以嘗試取消關注公眾賬號后再次關注,則可以看到創建后的效果。
* * * * *
* 自定義菜單接口有很多種類型(詳細可參看開發者文檔),這里只選擇兩個常用的接口進行說明(click和view)
1.click : 點擊推事件
用戶點擊 click類型按鈕后,微信服務器會通過消息接口推送消息類型為event的結構給開發者(微信消息接口后續會介紹)并且帶上按鈕中開發者填寫的key值,開發者可以通過自定義的key值與用戶進行交互;
2.view:跳轉URL
用戶點擊view類型按鈕后,微信客戶端將會打開開發者在按鈕中填寫的網頁URL,可與網頁授權獲取用戶基本信息接口結合,獲得用戶基本信息。
**接口調用方式和請求示例“開發者文檔”中有詳細說明,這里仔細說下封裝方法**
###封裝菜單結構
通過官方API給出的 JSON格式,我們大概將菜單分為三類:click類型、view類型和混合型。每個菜單對象都有一個共同的 name屬性(即菜單名稱),因此需要定義一個菜單對象的基類,所有菜單對象都需要繼承該類。代碼如下
~~~
/*
* 菜單的基類
*/
public class Button {
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
~~~
* click類型有type、name、key 3個屬性,對應代碼如下
~~~
public class ClickButton extends Buttuon {
private String type;
private String key;
public String getType(){
return type;
}
public void settype(String type){
this.type = type;
}
public String getKey(){
return key;
}
public void setKey(){
this.key = key;
}
}
~~~
* view 類型有type、name、url 3個屬性
~~~
public class ViewButton extends Buttuon {
private String type;
private String url;
public String getType(){
return type;
}
public void settype(String type){
this.type = type;
}
public String getUrl(){
return url;
}
public void setUrl(){
this.url = url;
}
}
~~~
* 混合型的菜單按鈕指的是含有自按鈕的Button,也就是含有子菜單的一級菜單
~~~
public class ComplexButton extends Button {
private Button[] sub_button;
public Buttuon[] getSub_button(){
return sub_button;
}
public void setSub_button(Button[] sub_button){
this.sub_button = sub_button;
}
}
~~~
* 最后是整個帶單對象的封裝,代碼如下
~~~
/**
* 菜單封裝
*/
public class Meun {
private Button[] button;
public Button[] getButton(){
return button;
}
public void setButton(Button[] button){
this.button = button;
}
}
~~~
### 創建菜單
我們通過以上封裝類定義菜單的結構,得到JSON格式的菜單數據,代碼如下
~~~
public static void main(String[] args){
ClickButton btn1 = new ClickButton();
btn1.setName("第一個菜單");
btn1.setType("click");
btn1.setKey("m_1");
ViewButton btn2 = new ViewButton();
btn2.setName("第二個菜單");
btn2.setType("view");
btn2.setUrl("http://www.baidu.com");
ClickButton btn31 = new ClickButton();
btn31.setName("復合菜單1");
btn31.setType("click");
btn31.setKey("m_3_1");
ClickButton btn32 = new ClickButton();
btn32.setName("復合菜單2");
btn32.setType("click");
btn32.setKey("m_3_2");
//復合菜單包含兩個click類型的菜單
ComplexButton btn3 = new ComplexButton();
btn3.setName("第三個菜單");
btn3.setSub_button(new Button[] {btn31,btn32});
//創建菜單對象
Menu menu = new Menu();
menu.setButton(new Button[] {btn1,btn2,btn3});
//將菜單對象轉換成 JSON字符串
String jsonMenu = JSONObject.fromObject(menu).toString();
system.out.println(jsonMenu);
}
~~~
在得到JSON格式的菜單結構之后,我們需要發起HTTPS POST請求將菜單結構提交到https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN 來創建菜單。代碼如下
~~~
// 菜單創建接口
String menuCreateUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
//建立連接
URL url = new URL(menuCreateUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection;
//使用自定義的信任管理器
TrustManager[] tm = {new MyX509TTrustManager()};
SSLContext sslContext = SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null,tm,new java.security.SecureRandom());
SSLSocketFactory ssf = sslContext.getSocketFactory();
conn.setSSLSocketFactory(ssf);
httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
//設置請求方式
httpUrlConn.setRequestMethod("POST");
//向輸出流寫菜單結構
OutputStream outputStream = httpUrlConn.getOutputStream();
outputStream.write(jsonMenu.getBytes("UTF-8"));
outputStream.close();
//取得輸入流
InputStream inputStream = httpUrlConn.getInputStream();
inputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//讀取相應內容
StringBuffer buffer = new StringBuffer();
String str = null
while ((str = bufferedReader.readLine()) != null){
buffer.append(str);
}
//關閉、釋放資源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
httpUrlConn.disconnect();
//輸出菜單創建結果
System.out.println(buffer);
~~~
自定義菜單創建完成后,由于微信客戶端的緩存問題,菜單不會馬上顯示,測試的時候,可以通過取消關后再次關注的方式來查看最新的菜單效果。
* * * * *
######**提示**:如果要修改公眾賬號的菜單,那么不需刪除原有菜單,再次創建菜單會自動覆蓋原有菜單。
* * * * *
###菜單刪除和查詢
* 查詢接口
~~~
https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN
~~~
查詢接口返回的是json數組,注意點只有一個,menu為默認菜單,conditionalmenu為個性化菜單(詳細demo可查看開發文檔)
* 刪除接口
~~~
https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN
~~~
**上述兩個接口的調用方式和獲取憑證接口一樣,都是發送HTTPS GET請求調用,這里就不重復說明了**
###click菜單點擊事件
菜單創建完成后,view類型的菜單會根據URL自動使用微信瀏覽器進行訪問,而click類型菜單則需要我們自己開發響應事件。當點擊click類型菜單時,微信服務器會向后臺推送一條消息類型為event,事件類型為click的事件消息。而我們要做的就是接受該事件消息并作出響應,代碼如下
~~~
//判斷消息類型
if(msgType.equals("event")){
//事件類型
String eventType = requestMap.get("Event");
//自定義菜單點擊事件
if(eventType.equals("CLICK")){//特別注意,這里click要大寫!
//事件Key值,與創建菜單時的key值對應
String eventKey = requesMap.get("EventKey");
//根據key值判斷用戶點擊的按鈕
if(eventKey.equals("m_1")){
respContent = "點擊了第一個菜單";
}esle if(eventKey.equals("m_3_1")){
respContent = "點擊了復合菜單1";
}esle if(eventKey.equals("m_3_2")){
respContent = "點擊了復合菜單2";
}
}
}
~~~
**詳細處理方法,會在消息管理內說明**