自定义菜单
第一步:新建包com.wtz.menu,新建类Button.java
package com.wtz.menu; /**
* @author wangtianze QQ:864620012
* @date 2017年4月23日 下午11:01:02
* <p>version:1.0</p>
* <p>description:按钮的基类</p>
*/
public class Button {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
第二步:找到包com.wtz.menu,新建类ClickButton.java
package com.wtz.menu; /**
* @author wangtianze QQ:864620012
* @date 2017年4月23日 下午11:05:10
* <p>version:1.0</p>
* <p>description:click类型的按钮</p>
*/
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;
}
}
第三步:找到包com.wtz.menu,新建类ViewButton.java
package com.wtz.menu; /**
* @author wangtianze QQ:864620012
* @date 2017年4月23日 下午11:09:43
* <p>version:1.0</p>
* <p>description:View类型的Button</p>
*/
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;
}
}
第四步:找到包com.wtz.menu,新建类ComplexButton.java
package com.wtz.menu; /**
* @author wangtianze QQ:864620012
* @date 2017年4月23日 下午11:13:25
* <p>version:1.0</p>
* <p>description:复合类型的按钮</p>
* <p>就是代表任意的一级及其子菜单(一个)</p>
*/
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;
}
}
第五步:找到包com.wtz.menu,新建类Menu.java
package com.wtz.menu; /**
* @author wangtianze QQ:864620012
* @date 2017年4月23日 下午11:07:26
* <p>version:1.0</p>
* <p>description:菜单类</p>
*/
public class Menu {
private Button[] button; public Button[] getButton() {
return button;
} public void setButton(Button[] button) {
this.button = button;
}
}
第六步:找到包com.wtz.util,新建类MenuUtil.java
package com.wtz.util; import net.sf.json.JSONObject; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.wtz.menu.Menu; /**
* @author wangtianze QQ:864620012
* @date 2017年4月23日 下午11:18:12
* <p>version:1.0</p>
* <p>description:自定义菜单工具类</p>
*/
public class MenuUtil {
private static Logger log = LoggerFactory.getLogger(MenuUtil.class); //菜单创建(POST)
public final static String menu_create_url ="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
//菜单查询(GET)
public final static String menu_get_url = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN";
//菜单删除(GET)
public final static String menu_delete_url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN"; /**
* 创建菜单
*
* @param menu 菜单实例
* @param accessToken 凭证
* @return true 成功 false 失败
*/
public static boolean createMenu(Menu menu,String accessToken){
boolean result = false;
String url = menu_create_url.replace("ACCESS_TOKEN",accessToken); //将菜单对象转换成json字符串
String jsonMenu = JSONObject.fromObject(menu).toString(); //发起POST请求创建菜单
JSONObject jsonObject = WeixinUtil.httpsRequest(url,"POST",jsonMenu); if(null != jsonObject){
int errorCode = jsonObject.getInt("errcode");
String errorMsg = jsonObject.getString("errmsg");
if(0 == errorCode){
result = true;
}else{
result = false;
log.error("创建菜单失败errorCode:{} errorMsg:{}",errorCode,errorMsg);
}
} return result;
} /**
* 查询菜单
*
* @param accessToken 凭证
* @return
*/
public static String getMenu(String accessToken){
String result = null;
String requestUrl = menu_get_url.replace("ACCESS_TOKEN",accessToken); //发送GET请求查询菜单
JSONObject jsonObject = WeixinUtil.httpsRequest(requestUrl, "GET", null); if(null != jsonObject){
result = jsonObject.toString();
} return result;
} /**
* 删除菜单
*
* @param accessToken 凭证
* @return true 成功 false 失败
*/
public static boolean deleteMenu(String accessToken){
boolean result = false;
String requestUrl = menu_delete_url.replace("ACCESS_TOKEN",accessToken); //发送GET请求删除菜单
JSONObject jsonObject = WeixinUtil.httpsRequest(requestUrl, "GET", null); if(null != jsonObject){
int errorCode = jsonObject.getInt("errcode");
String errorMsg = jsonObject.getString("errmsg");
if(0 == errorCode){
result = true;
}else{
result = false;
log.error("删除菜单失败errorCode:{} errorMsg:{}",errorCode,errorMsg);
}
} return result;
}
}
第七步:新建包com.wtz.test,新建类MenuManager.java
package com.wtz.test; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.wtz.menu.Button;
import com.wtz.menu.ClickButton;
import com.wtz.menu.ComplexButton;
import com.wtz.menu.Menu;
import com.wtz.menu.ViewButton;
import com.wtz.util.MenuUtil;
import com.wtz.util.Parameter;
import com.wtz.util.WeixinUtil;
import com.wtz.vo.Token; /**
* @author wangtianze QQ:864620012
* @date 2017年4月24日 上午10:58:47
* <p>version:1.0</p>
* <p>description:菜单测试类</p>
*/
public class MenuManager {
private static Logger log = LoggerFactory.getLogger(MenuManager.class); /**
* 定义菜单结构
*
* @return
*/
private static Menu getMenu(){
ClickButton button11 = new ClickButton();
button11.setName("Click11");
button11.setType("click");
button11.setKey("anniu11"); ClickButton button12 = new ClickButton();
button12.setName("Click12");
button12.setType("click");
button12.setKey("anniu12"); ViewButton button13 = new ViewButton();
button13.setName("View13");
button13.setType("view");
button13.setUrl("http://www.baidu.com"); ViewButton button14 = new ViewButton();
button14.setName("View14");
button14.setType("view");
button14.setUrl("http://www.baidu.com"); ComplexButton complexButton1 = new ComplexButton();
complexButton1.setName("第一个");
complexButton1.setSub_button(new Button[] {button11,button13}); ComplexButton complexButton2 = new ComplexButton();
complexButton2.setName("第二个");
complexButton2.setSub_button(new Button[] {button12,button14}); Menu menu = new Menu();
menu.setButton(new Button[] {complexButton1,complexButton2}); return menu;
} public static void main(String[] args){
//调用接口获取凭证
Token token = WeixinUtil.getToken(Parameter.appId, Parameter.appSecret); if(null != token){
//创建菜单------------------------------------------------------------------------
// boolean result = MenuUtil.createMenu(getMenu(), token.getAccessToken());
// //判断创建菜单结果
// if(result){
// log.info("创建菜单成功!");
// }else{
// log.info("创建菜单失败!");
// }
//查询菜单------------------------------------------------------------------------
String jsonMenus = MenuUtil.getMenu(token.getAccessToken());
log.info(jsonMenus);
//删除菜单------------------------------------------------------------------------
// boolean result = MenuUtil.deleteMenu(token.getAccessToken());
// if(result){
// log.info("删除菜单成功!");
// }else{
// log.info("删除菜单失败!");
// }
}
}
}
第八步:找到包com.wtz.util,修改类ProcessService.java
package com.wtz.util; import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.wtz.dao.PostCodeDao;
import com.wtz.message.response.Article;
import com.wtz.message.response.NewsMessage;
import com.wtz.message.response.TextMessage; /**
* @author wangtianze QQ:864620012
* @date 2017年4月19日 下午8:04:14
* <p>version:1.0</p>
* <p>description:核心服务类</p>
*/
public class ProcessService {
//定义数据访问的dao
private static PostCodeDao dao = new PostCodeDao(); //-----------------------------------老的,加密前--------------------------------------------------
// public static String dealRequest(HttpServletRequest request){
// //XML格式的消息数据
// String respXml = "";
// //默认返回的文本消息内容
// String respContent = "未知的消息类型";
// //调用parseXml方法解析请求消息
// Map<String, String> requestMap;
// try {
// requestMap = MessageUtil.parseXml(request);
// //发送方账号
// String fromUserName = requestMap.get("FromUserName");
// //开发者微信号
// String toUserName = requestMap.get("ToUserName");
// //消息类型
// String MsgType = requestMap.get("MsgType");
// //消息内容
// String content = requestMap.get("Content");
//
// //回复文本消息
// TextMessage textMessage = new TextMessage();
// textMessage.setToUserName(fromUserName);
// textMessage.setFromUserName(toUserName);
// textMessage.setCreateTime(new Date().getTime());
// textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
//
// if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){
// respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n";
// if(content.equals("1")){
// respContent = "请按照格式输入地区名,例如输入 邮编:东城";
// }
// if(content.equals("2")){
// respContent = "请按照格式输入地区名,例如输入 区号:东城";
// }
// if(content.equals("?")){
// respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n";
// }
// if(content.startsWith("邮编:")){
// int pos = content.indexOf(":");
// String cityName = content.substring(pos + 1);
// respContent = dao.findPostCodeByCityName(cityName);
// System.out.println("邮编:respContent:" + respContent);
// }
// if(content.startsWith("区号:")){
// int pos = content.indexOf(":");
// String cityName = content.substring(pos + 1);
// respContent = dao.findTelCodeByCityName(cityName);
// System.out.println("区号:respContent:" + respContent);
// }
// }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)){
// respContent = "您发送的是图片消息";
// }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)){
// respContent = "您发送的是语音消息";
// }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)){
// respContent = "您发送的是视频消息";
// }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)){
// respContent = "您发送的是地理位置消息";
// }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)){
// respContent = "您发送的是链接消息";
// }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)){
// //事件类型
// String eventType = requestMap.get("Event");
// if(eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)){
// respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n";
// }else if(eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){
// //TODO 取消订阅后用户不会再收到公众号发送的消息,因此不需要回复
// }else if(eventType.equals(MessageUtil.EVENT_TYPE_SCAN)){
// //TODO 处理扫描带参数二维码事件
// }else if(eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)){
// //TODO 处理上报地理位置事件
// }else if(eventType.equals(MessageUtil.EVENT_TYPE_CLICK)){
// //TODO 处理菜单点击事件
// }
// }
// //设置文本消息的内容
// textMessage.setContent(respContent);
// //将文本消息对象转换成xml
// respXml = MessageUtil.messageToXml(textMessage);
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// return respXml;
// } //----------------------------------------------新的,加密后---------------------------------------------
public static String dealRequest(String request){
//XML格式的消息数据
String respXml = "";
//默认返回的文本消息内容
String respContent = "未知的消息类型";
//调用parseXml方法解析请求消息
Map<String, String> requestMap;
try {
requestMap = MessageUtil.parseXml(request);
//发送方账号
String fromUserName = requestMap.get("FromUserName");
//开发者微信号
String toUserName = requestMap.get("ToUserName");
//消息类型
String MsgType = requestMap.get("MsgType");
//消息内容
String content = requestMap.get("Content"); //回复文本消息
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){
respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n";
if(content.equals("1")){
respContent = "请按照格式输入地区名,例如输入 邮编:东城";
}
if(content.equals("2")){
respContent = "请按照格式输入地区名,例如输入 区号:东城";
}
if(content.equals("?")){
respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n";
}
if(content.startsWith("邮编:")){
int pos = content.indexOf(":");
String cityName = content.substring(pos + 1);
respContent = dao.findPostCodeByCityName(cityName);
System.out.println("邮编:respContent:" + respContent);
}
if(content.startsWith("区号:")){
int pos = content.indexOf(":");
String cityName = content.substring(pos + 1);
respContent = dao.findTelCodeByCityName(cityName);
System.out.println("区号:respContent:" + respContent);
}
}else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)){
respContent = "您发送的是图片消息";
}else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)){
respContent = "您发送的是语音消息";
}else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)){
respContent = "您发送的是视频消息";
}else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)){
respContent = "您发送的是地理位置消息";
}else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)){
respContent = "您发送的是链接消息";
}else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)){
//事件类型
String eventType = requestMap.get("Event");
if(eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)){
respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n";
}else if(eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){
//TODO 取消订阅后用户不会再收到公众号发送的消息,因此不需要回复
}else if(eventType.equals(MessageUtil.EVENT_TYPE_SCAN)){
//TODO 处理扫描带参数二维码事件
}else if(eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)){
//TODO 处理上报地理位置事件
}else if(eventType.equals(MessageUtil.EVENT_TYPE_CLICK)){
//事件Key值,与创建菜单时的key值对应
String eventKey = requestMap.get("EventKey");
System.out.println("eventKey:" + eventKey);
if(eventKey.equals("anniu11")){
Article article = new Article();
article.setTitle("anniu1");
article.setDescription("anniu1Desc");
article.setPicUrl("");
article.setUrl("http://www.baidu.com"); List<Article> articleList = new ArrayList<Article>();
articleList.add(article); //创建图文消息
NewsMessage newsMessage = new NewsMessage();
newsMessage.setToUserName(fromUserName);
newsMessage.setFromUserName(toUserName);
newsMessage.setCreateTime((new Date()).getTime());
newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);
newsMessage.setArticleCount(articleList.size());
newsMessage.setArticles(articleList);
respXml = MessageUtil.messageToXml(newsMessage);
}else if(eventType.equals("anniu2")){
textMessage.setContent("anniu2");
respXml = MessageUtil.messageToXml(textMessage);
}
}
}
//设置文本消息的内容
textMessage.setContent(respContent);
//将文本消息对象转换成xml
respXml = MessageUtil.messageToXml(textMessage);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return respXml;
}
}
自定义菜单完成