微信公众号开发文章目录
1.微信公众号开发 - 环境搭建
2.微信公众号开发 - 配置表设计以及接入公众号接口开发
3.微信公众号开发 - token获取(保证同一时间段内只请求一次)
4.微信公众号开发 - 菜单按钮bean封装
5.微信公众号开发 - 创建菜单
6.微信公众号开发 - 事件处理和回复消息
7.微信公众号开发 - 发送Emoji表情
项目完整代码请访问github:https://github.com/liaozq0426/wx.git
上篇文章完成了微信公众号token的获取,接下来开始开发微信公众号自定义菜单,在开发自定义菜单前,先完成菜单和按钮bean的封装,因为在开发自定义菜单时需要用到
从微信官方文档可以看到,公众号菜单的数据结构如下
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"miniprogram",
"name":"wxa",
"url":"http://mp.weixin.qq.com",
"appid":"wx286b93c14bbf93aa",
"pagepath":"pages/lunar/index"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
可以看到,所有按钮都有一个共性就是都有name
属性,因此我们可以先定义一个Button类,它是所有按钮的父类,代码如下
/**
* @author gavin
* @title 微信按钮
*/
public class Button{
public static final String TYPE_VIEW = "view"; // view类型按钮
public static final String TYPE_CLICK = "click";// click类型按钮
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这里面定义了两个常量,TYPE_VIEW
和TYPE_CLICK
,分别代表 view 类型按钮和 click类型按钮,如果在实际开发中还用到了其他类型按钮,可以在里面添加。
我们平时开发中使用的最多的两种按钮是click
和view
,接下来就是对这两种类型按钮的设计。click按钮代码如下
/**
* @title 微信click类型按钮
* @author gavin
* @date 2019年11月28日
*/
public class ClickButton 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按钮代码如下
/**
* @title 微信view类型按钮
* @author gavin
* @date 2019年11月28日
*/
public class ViewButton extends Button{
private String type;
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
菜单中除了一级菜单(只有一个按钮),还有二级菜单,二级菜单其实是一个复合按钮,即按钮中又嵌套了一个按钮数组,复合按钮代码如下
/**
* @author gavin
* @title 微信复合按钮
*/
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;
}
}
最后是菜单的封装,代码如下
/**
* @author gavin
* @title 微信菜单
*/
public class Menu{
private Button[] button;
public Button[] getButton() {
return button;
}
public void setButton(Button[] button) {
this.button = button;
}
}
Menu就是整个公众号菜单的数据,我们最终在调用微信创建菜单api时,传一个Menu对象就行了。
使用
下面我们使用一下封装好的bean,看最后的数据结构是否符合要求
import com.gavin.pojo.Button;
import com.gavin.pojo.ClickButton;
import com.gavin.pojo.ComplexButton;
import com.gavin.pojo.Menu;
import com.gavin.pojo.ViewButton;
import com.google.gson.Gson;
public class MenuTest {
public static void main(String[] args) {
// 复合按钮
ComplexButton view1 = new ComplexButton();
view1.setName("学习资料");
ViewButton view11 = new ViewButton();
view11.setName("JAVA");
view11.setType(Button.TYPE_VIEW);
view11.setUrl("http://www.gavin.com/java.html");
ViewButton view12 = new ViewButton();
view12.setName("MySQL");
view12.setType(Button.TYPE_VIEW);
view12.setUrl("http://www.gavin.com/mysql.html");
view1.setSub_button(new Button[] {view11 , view12}); // 设置子按钮数组
// view按钮
ViewButton view2 = new ViewButton();
view2.setName("在线题库");
view2.setType(Button.TYPE_VIEW);
view2.setUrl("http://www.gavin.com/information.html");
// click按钮
ClickButton click = new ClickButton();
click.setName("关于");
click.setType(Button.TYPE_CLICK);
click.setKey("click_关于");
// menu
Menu menu = new Menu();
menu.setButton(new Button[] {view1 , view2 , click});
// 打印json字符串
Gson gson = new Gson();
String menuJsonStr = gson.toJson(menu);
System.out.println(menuJsonStr);
}
}
运行后输出结果为
{
"button": [
{
"sub_button": [
{
"type": "view",
"url": "http://www.gavin.com/java.html",
"name": "JAVA"
},
{
"type": "view",
"url": "http://www.gavin.com/mysql.html",
"name": "MySQL"
}
],
"name": "学习资料"
},
{
"type": "view",
"url": "http://www.gavin.com/information.html",
"name": "在线题库"
},
{
"type": "click",
"key": "click_关于",
"name": "关于"
}
]
}
可以看到结果符合我们的预期。