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

简介: 一、本节要点 1.菜单相关实体类的封装 参考官方文档中的请求包的内容,对菜单相关实体类进行封装。 这里需要格外注意的是,企业微信中请求包的数据是Json字符串格式的,而不是xml格式。关于json序列化的问题请参考上一节   Java企业微信开发_03_通讯录同步   2.

一、本节要点

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

 

目录
相关文章
|
9天前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
46 5
|
1天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的旅游景区管理系统源码+运行
该项目是基于Java+Springboot+Vue开发的旅游景区管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的旅游景区管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习
24 4
基于Java+Springboot+Vue开发的旅游景区管理系统源码+运行
|
2天前
|
人工智能 Java 定位技术
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
本文详细讲解了Java开发者如何基于Spring AI Alibaba框架玩转MCP(Model Context Protocol),涵盖基础概念、快速体验、服务发布与调用等内容。重点包括将Spring应用发布为MCP Server(支持stdio与SSE模式)、开发MCP Client调用服务,以及在Spring AI Alibaba的OpenManus中使用MCP增强工具能力。通过实际示例,如天气查询与百度地图路线规划,展示了MCP在AI应用中的强大作用。最后总结了MCP对AI开发的意义及其在Spring AI中的实现价值。
|
21天前
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
1月前
|
机器学习/深度学习 人工智能 NoSQL
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
随着大模型的越来越盛行,现在很多企业开始接入大模型的接口,今天我从java开发角度来写一个demo的示例,用于接入DeepSeek大模型,国内的大模型有很多的接入渠道,今天主要介绍下阿里云的百炼模型,因为这个模型是免费的,只要注册一个账户,就会免费送百万的token进行学习,今天就从一个简单的可以执行的示例开始进行介绍,希望可以分享给各位正在学习的同学们。
234 3
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
|
21天前
|
小程序 关系型数据库 Java
weixin168“返家乡”高校暑期社会实践微信小程序设计与开发ssm(文档+源码)_kaic
本文探讨高校暑期社会实践微信小程序的开发与应用,旨在通过信息化手段提升活动管理效率。借助微信小程序技术、SSM框架及MySQL数据库,实现信息共享、流程规范和操作便捷。系统涵盖需求分析、可行性研究、设计实现等环节,确保技术可行、操作简便且经济合理。最终,该小程序可优化活动发布、学生信息管理和心得交流等功能,降低管理成本并提高工作效率。
|
25天前
|
人工智能 Java 物联网
没有好的学历,Java开发未来的路应该怎么走?
在数字化时代,Java开发者即使没有高学历,也能通过拥抱新兴技术(如大模型应用与鸿蒙系统开发)、积累实战经验、持续学习新技能等途径实现职业突破。从参与开源项目到关注行业动态,再到规划技术专家或管理路线,建立人脉网络并利用教育平台提升能力,开发者可拓宽技术边界,适应日新月异的技术需求,在未来发展中占据一席之地。
|
3天前
|
人工智能 Java 定位技术
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
本文以原理与示例结合的形式讲解 Java 开发者如何基于 Spring AI Alibaba 框架玩转 MCP。
|
1月前
|
小程序 JavaScript 前端开发
微信小程序开发全流程:从注册到上线的完整指南
这篇文章详细记录了微信小程序的完整开发到最终上线的每一个步骤。适合对小程序开发感兴趣的个人开发者或希望了解完整流程的学习者,涵盖了云开发、事件绑定、生命周期管理、组件使用等关键内容。
251 11
|
1月前
|
搜索推荐 Java Android开发
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程

热门文章

最新文章

下一篇
oss创建bucket