1. 程式人生 > >Java企業微信開發_04_自定義菜單

Java企業微信開發_04_自定義菜單

組裝 sys 測試 搜索 我們 測試類 ray 翻譯 請求

一、本節要點

1.菜單相關實體類的封裝

參考官方文檔中的請求包的內容,對菜單相關實體類進行封裝。

這裏需要格外註意的是,企業微信中請求包的數據是Json字符串格式的,而不是xml格式。關於json序列化的問題請參考上一節 Java企業微信開發_03_通訊錄同步

2.創建菜單的接口

    public static String create_menu_url = "https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN&agentid=AGENTID"; 

註意此處的 ACCESS_TOKEN 與通訊錄那裏的 ACCESS_TOKEN 不同,記住只有通訊錄 ACCESS_TOKEN 才會用到通訊錄密鑰。其他地方用的都是應用密鑰。

還有雖然企業微信和微信公眾號開發的接口不同,但是大體思路是相通的。

二、代碼實現

1.實體類

按照企業微信官方文檔中關於自定義菜單的請求包的說明,定義好實體類。

1.1 按鈕的基類——Button

技術分享
package com.ray.pojo.menu;  
  
/**
 * @desc  : 按鈕的基類 
 * 
 * @author: shirayner
 * @date  : 2017-8-20 下午9:29:43
 */
public class Button {  
    private String name;  
  
    
public String getName() { return name; } public void setName(String name) { this.name = name; } }
View Code

1.2 普通按鈕(子按鈕) ——CommonButton

技術分享
package com.ray.pojo.menu;  
  
/**
 * @desc  : 普通按鈕(子按鈕) 
 * 
 * @author: shirayner
 * @date  : 2017-8-20 下午9:29:58
 
*/ public class CommonButton extends Button { 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(String key) { this.key = key; } }
View Code

1.3 復雜按鈕(父按鈕) ——ComplexButton

技術分享
package com.ray.pojo.menu;  
  
/**
 * @desc  : 復雜按鈕(父按鈕) 
 * 
 * @author: shirayner
 * @date  : 2017-8-20 下午9:30:17
 */
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;  
    }  
}  
View Code

1.4 view類型的菜單 ——ViewButton

技術分享
package com.ray.pojo.menu;  
  
/**
 * @desc  : view類型的菜單 
 * 
 * @author: shirayner
 * @date  : 2017-8-20 下午9:30:44
 */
public class ViewButton extends Button {  
    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(String url) {  
        this.url = url;  
    }  
}  
View Code

1.5 菜單——Menu

技術分享
package com.ray.pojo.menu;  
  
/**
 * @desc  : 菜單 
 * 
 * @author: shirayner
 * @date  : 2017-8-20 下午9:30:31
 */
public class Menu {  
    private Button[] button;  
  
    public Button[] getButton() {  
        return button;  
    }  
  
    public void setButton(Button[] button) {  
        this.button = button;  
    }  
}  
View Code

2.業務類

業務類主要是java對象序列化,獲取accessToken以拼接請求ur,發送http請求調用接口。

2.1菜單業務類——MenuService

技術分享
package com.ray.service;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.Gson;
import com.ray.pojo.menu.Button;
import com.ray.pojo.menu.CommonButton;
import com.ray.pojo.menu.ComplexButton;
import com.ray.pojo.menu.Menu;
import com.ray.pojo.menu.ViewButton;
import com.ray.util.WeiXinUtil;

import net.sf.json.JSONObject;


public class MenuService {
    private static Logger log = LoggerFactory.getLogger(MenuService.class);  
    // 菜單創建(POST) 限100(次/天)  
    public static String create_menu_url = "https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN&agentid=AGENTID";  

    /** 
     * 1.創建菜單 
     *  
     * @param menu 菜單實例 
     * @param accessToken 有效的access_token 
     * @return 0表示成功,其他值表示失敗 
     */  
    public void createMenu(String accessToken,Menu menu,int agentId) {  

        //1.獲取json字符串:將Menu對象轉換為json字符串
        Gson gson = new Gson(); 
        String jsonMenu =gson.toJson(menu);      //使用gson.toJson(user)即可將user對象順序轉成json
        System.out.println("jsonMenu:"+jsonMenu);


        //2.獲取請求的url  
        create_menu_url = create_menu_url.replace("ACCESS_TOKEN", accessToken)
                .replace("AGENTID", String.valueOf(agentId));  

        //3.調用接口,發送請求,創建菜單  
        JSONObject jsonObject = WeiXinUtil.httpRequest(create_menu_url, "POST", jsonMenu);  
        System.out.println("jsonObject:"+jsonObject.toString());

        //4.錯誤消息處理
        if (null != jsonObject) {  
            if (0 != jsonObject.getInt("errcode")) {  
                log.error("創建菜單失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));  
            }  
        }  
 
    }  

    /** 
     * 2.組裝菜單數據 
     *  
     * @return 
     */  
    public  Menu getMenu() {  
        ViewButton btn11 = new ViewButton();  
        btn11.setName("JSSDK測試");  
        btn11.setType("view");  
        btn11.setUrl("http://5hcn2d.natappfree.cc/WeiXin_SanFenBaiXue/index.jsp");  

        CommonButton btn12 = new CommonButton();  
        btn12.setName("使用幫助");  
        btn12.setType("click");  
        btn12.setKey("12");  

        CommonButton btn13 = new CommonButton();  
        btn13.setName("翻譯功能");  
        btn13.setType("click");  
        btn13.setKey("13");  

        ViewButton btn14 = new ViewButton();  
        btn14.setName("上傳圖片");  
        btn14.setType("view");  
        btn14.setUrl("http://5hcn2d.natappfree.cc/WeiXin_SanFenBaiXue/uploadimg.jsp");  



        ViewButton btn15 = new ViewButton();  
        btn15.setName("上傳圖片2");  
        btn15.setType("view");  
        btn15.setUrl("http://5hcn2d.natappfree.cc/WeiXin_SanFenBaiXue/index2.jsp");  

        CommonButton btn21 = new CommonButton();  
        btn21.setName("歌曲點播");  
        btn21.setType("click");  
        btn21.setKey("21");  

        CommonButton btn22 = new CommonButton();  
        btn22.setName("經典遊戲");  
        btn22.setType("click");  
        btn22.setKey("22");  

        CommonButton btn23 = new CommonButton();  
        btn23.setName("美女電臺");  
        btn23.setType("click");  
        btn23.setKey("23");  

        CommonButton btn24 = new CommonButton();  
        btn24.setName("人臉識別");  
        btn24.setType("click");  
        btn24.setKey("24");  

        CommonButton btn25 = new CommonButton();  
        btn25.setName("聊天嘮嗑");  
        btn25.setType("click");  
        btn25.setKey("25");  

        CommonButton btn31 = new CommonButton();  
        btn31.setName("Q友圈");  
        btn31.setType("click");  
        btn31.setKey("31");  

        CommonButton btn33 = new CommonButton();  
        btn33.setName("幽默笑話");  
        btn33.setType("click");  
        btn33.setKey("33");  

        CommonButton btn34 = new CommonButton();  
        btn34.setName("用戶反饋");  
        btn34.setType("click");  
        btn34.setKey("34");  

        CommonButton btn35 = new CommonButton();  
        btn35.setName("關於我們");  
        btn35.setType("click");  
        btn35.setKey("35");  

        ViewButton btn32 = new ViewButton();  
        btn32.setName("周邊搜索");  
        btn32.setType("view");  
        btn32.setUrl("http://liufeng.gotoip2.com/xiaoqrobot/help.jsp");  

        ComplexButton mainBtn1 = new ComplexButton();  
        mainBtn1.setName("生活助手");  
        mainBtn1.setSub_button(new Button[] { btn11, btn12, btn13, btn14, btn15 });  

        ComplexButton mainBtn2 = new ComplexButton();  
        mainBtn2.setName("休閑驛站");  
        mainBtn2.setSub_button(new Button[] { btn21, btn22, btn23, btn24, btn25 });  

        ComplexButton mainBtn3 = new ComplexButton();  
        mainBtn3.setName("更多");  
        mainBtn3.setSub_button(new Button[] { btn31, btn33, btn34, btn35, btn32 });  

        /** 
         * 這是企業號目前的菜單結構,每個一級菜單都有二級菜單項<br> 
         *  
         * 在某個一級菜單下沒有二級菜單的情況,menu該如何定義呢?<br> 
         * 比如,第三個一級菜單項不是“更多體驗”,而直接是“幽默笑話”,那麽menu應該這樣定義:<br> 
         * menu.setButton(new Button[] { mainBtn1, mainBtn2, btn33 }); 
         */  
        Menu menu = new Menu();  
        menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });  

        return menu;  
    }  

}
View Code

3.測試類

調用業務類,創建菜單

3.1菜單測試類——MenuTest

技術分享
package com.ray.test;

import org.junit.Test;

import com.ray.pojo.menu.Menu;
import com.ray.service.MenuService;
import com.ray.util.WeiXinParamesUtil;
import com.ray.util.WeiXinUtil;

public class MenuTest {
    
  @Test    
  public void testCreateMenu(){
      //1.組裝菜單
      MenuService ms=new MenuService();
      Menu menu=ms.getMenu();
      
      //2.獲取access_token:根據企業id和應用密鑰獲取access_token
      String accessToken=WeiXinUtil.getAccessToken(WeiXinParamesUtil.corpId, WeiXinParamesUtil.agentSecret).getToken();
      System.out.println("accessToken:"+accessToken);
      
      //3.創建菜單
      ms.createMenu( accessToken, menu, WeiXinParamesUtil.agentId);
      
     
    
  }
  
  
  
  
}
View Code

三、菜單事件的響應

菜單的事件響應,可歸為 消息推送之被動回復消息 的一種(個人理解,望指正)。會在後續博客中補充。

四、參考資料

1.企業微信官方文檔:https://work.weixin.qq.com/api/doc#10786

2.柳峰:[038] 微信公眾帳號開發教程第14篇-自定義菜單的創建及菜單事件響應

Java企業微信開發_04_自定義菜單