Java企业微信开发_04_自定义菜单

来源:互联网 发布:黄山手绘工厂 知乎 编辑:程序博客网 时间:2024/06/06 02:58

一、本节要点

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篇-自定义菜单的创建及菜单事件响应

 

原创粉丝点击