自定义菜单

第一步:新建包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;
}
}

自定义菜单完成

Java微信二次开发(七)的更多相关文章

  1. Java微信二次开发(一)

    准备用Java做一个微信二次开发项目,把流程写在这里吧. 第一天,做微信请求验证 需要导入库:servlet-api.jar 第一步:新建包com.wtz.service,新建类LoginServle ...

  2. Java微信二次开发(五)

    消息加密 需要到入库:commons-io-2.4.jar,commons-codec-1.9.jar(在官网的Java微信加密demo下) 第一步:访问https://mp.weixin.qq.co ...

  3. Java微信二次开发(十)

    生成带参数的二维码以及长链接转短链接 第一步:找到包com.wtz.vo,新建类WeixinQRCode.java package com.wtz.vo; /** * @author wangtian ...

  4. Java微信二次开发(六)

    Token定时获取 需要导入库:添加log4j(slf4j-api-1.5.10.jar,slf4j-log4j12-1.5.10.jar,log4j-1.2.15.jar,并且在src下添加log4 ...

  5. Java微信二次开发(三)

    各种类型消息的封装 第一步:找到com.wtz.message.response包,新建类Image.java package com.wtz.message.response; /** * @aut ...

  6. Java微信二次开发(九)

    多媒体文件上传与下载 第一步:找到包com.wtz.vo,新建类WeixinMedia.java package com.wtz.vo; /** * @author wangtianze QQ:864 ...

  7. Java微信二次开发(八)

    高级接口,先做了两个(获取用户信息和获取关注者列表) 第一步:找到包com.wtz.vo,新建类UserInfo.java package com.wtz.vo; /** * @author wang ...

  8. Java微信二次开发(二)

    第二天,做微信文本消息接口请求与发送 需要导入库:dom4j-1.6.1.jar,xstream-1.3.1.jar 第一步:新建包com.wtz.message.response,新建类BaseMe ...

  9. Java微信公众平台开发(七)--多媒体消息回复之图片回复

    之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复[普通消息类型消息],这里将讲述多媒体消息的回复方法,[多媒体消息]包含回复图片消息/回复语音消息/回复视频消息/回复音乐消 ...

随机推荐

  1. leetcode 20. Valid Parentheses 、32. Longest Valid Parentheses 、

    20. Valid Parentheses 错误解法: "[])"就会报错,没考虑到出现')'.']'.'}'时,stack为空的情况,这种情况也无法匹配 class Soluti ...

  2. MP实战系列(三)之实体类讲解

    首先说一句,mybatis plus实在太好用了! mybaits plus的实体类: 以我博客的用户类作为讲解 package com.blog.entity; import com.baomido ...

  3. 【转】对random_state参数的理解

    转自:https://blog.csdn.net/az9996/article/details/86616668 在学习机器学习的过程中,常常遇到random_state这个参数,下面来简单叙述一下它 ...

  4. boot空间不足

    https://blog.csdn.net/suifenghahahaha/article/details/78748846 更新内核https://blog.csdn.net/qq_18683985 ...

  5. python 打印 emoji

    python 打印 emoji 如需转发,请注明出处:小婷儿的python  https://www.cnblogs.com/xxtalhr/p/10486506.html 一.Unicode字符集: ...

  6. C++ 实现strcpy

    strcpy库函数的原型: // 把src字符串拷贝到dest,并返回dest char *strcpy(char *dest, const char *src) 注意点: 1.形参src用const ...

  7. ubuntu 解决TXT文本的乱码的问题。

    windows 系统上编辑的 txt 文本,在ubuntu上出现 乱码,我是这样解决的 1.terminal上输入以下命令: gsettings set org.gnome.gedit.prefere ...

  8. Python/Jupyter Notebook以及可视化的运用

    最近陆陆续续使用Jupyter Notebook和Python可视化做了一些小工具,用于提高开发效率. 这里将其归类总结一下,作为学习的记录.

  9. Java Web应用开发中的一些概念

    最近在学习Java Web,发现Java Web的概念很多,而且各个概念之间的关系也挺复杂,本篇博客把这些关系总结于此,主要参考的博客附在文章末尾. 概念 服务器 服务器,硬件角度上说就是一台高性能的 ...

  10. Nginx Windows版的服务安装和管理工具

    以前研究过负载均衡,最近正在项目上实施(从来没做过小项目以上级别的东西,哈),nginx挺好,不过Windows有点为难,小流量和本地不追求性能,简单易用是目标. Nginx Windows上并没有提 ...