demo:https://github.com/wenrongyao/wechat-demo
摘要:微信公众号的自定义菜单,包括菜单的增删查,自定义菜单事件推送
资源贴:
获取accesstoken:https://blog.csdn.net/wrongyao/article/details/80276888
接收事件推送:https://blog.csdn.net/wrongyao/article/details/86496549
一般业务需求:将微信公众号的管理功能集成到自己的系统中,在自己的系统中管理菜单来代替登录微信后台;这个模块基本就是拼凑数据,调用微信接口。
1、 新增自定义菜单
官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013
1.1 接口说明
1.1.1 接口:http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
关于accessToken的获取和管理在资源贴中
1.1.2 请求数据,json格式
格式:
参数说明:
1.2 举例说明
在实际项目中开发的时候,如果前后端使用json格式做交互的话,可以直接使用前端的json数据作为请求数据,后台系统不用重新构建,如果需要后台构建,可以参考demo中基于gson的实体类封装
如果是前端生成json格式,那就很简单了,直接通过请求工具类,将json数据传到微信服务器即可
public String addMenus(String menuStr) {
String url = CREATE_MENU_URL.replace("{ACCESS_TOKEN}", Constant.ACCESS_TOKEN);
String jsonStr = HttpRequest.post(url, menuStr, null, Constant.ContentType.APPLICATION_JSON, false);
return jsonStr;
}
menuStr为前端构建好的json格式数据 如:
menuStr:{"button":[{"name":"今日歌曲","type":"click","key":"V1001_TODAY_MUSIC"},{"sub_button":[{"name":"搜索","type":"view","url":"https://www.baidu.com"},{"name":"NBA","type":"view","url":"https://www.hupu.com"}],"name":"菜单"}]}
这个数据也可以后台生成,demo中有所有的工具类,代码细节也可以看demo。
// 今日歌曲
BaseButton musicBtn = new BaseButton("今日歌曲", "click", "V1001_TODAY_MUSIC", null);
// 搜索
BaseButton searchBtn = new BaseButton("搜索", "view", null, "https://www.baidu.com");
// NBA
BaseButton nbaBtn = new BaseButton("NBA", "view", null, "https://www.hupu.com");
TwoMenu twoMenu = new TwoMenu("菜单");
twoMenu.getBaseButtons().add(searchBtn);
twoMenu.getBaseButtons().add(nbaBtn);
OneMenu menu = new OneMenu();
menu.getButton().add(musicBtn);
menu.getButton().add(twoMenu);
System.out.println(GsonUtil.toJson(menu));
1.3 结果
另外:菜单的删除和查询基本就是调接口,这边就不写了,具体在demo中也有,需要的可以查看。
2、自定义菜单事件推送
关于接收微信事件的推送基本都是一样的,根据msgType和event区分事件类型做相应处理。详见资源贴
通过event_key区分具体事件
对测试菜单中的今日歌曲点击事件响应,点击今日歌曲按钮,简单响应文本信息
else if (event.equals(Constant.Event.CLICK)) {
String eventKey = map.get("EventKey");
if (eventKey.equals("V1001_TODAY_MUSIC")) {
result = msgService.returnText(map, "今日歌曲如下:");
}
}
结果