Java微信二次开发(七)
自定义菜单
第一步:新建包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微信二次开发(七)的更多相关文章
- Java微信二次开发(一)
准备用Java做一个微信二次开发项目,把流程写在这里吧. 第一天,做微信请求验证 需要导入库:servlet-api.jar 第一步:新建包com.wtz.service,新建类LoginServle ...
- Java微信二次开发(五)
消息加密 需要到入库:commons-io-2.4.jar,commons-codec-1.9.jar(在官网的Java微信加密demo下) 第一步:访问https://mp.weixin.qq.co ...
- Java微信二次开发(十)
生成带参数的二维码以及长链接转短链接 第一步:找到包com.wtz.vo,新建类WeixinQRCode.java package com.wtz.vo; /** * @author wangtian ...
- Java微信二次开发(六)
Token定时获取 需要导入库:添加log4j(slf4j-api-1.5.10.jar,slf4j-log4j12-1.5.10.jar,log4j-1.2.15.jar,并且在src下添加log4 ...
- Java微信二次开发(三)
各种类型消息的封装 第一步:找到com.wtz.message.response包,新建类Image.java package com.wtz.message.response; /** * @aut ...
- Java微信二次开发(九)
多媒体文件上传与下载 第一步:找到包com.wtz.vo,新建类WeixinMedia.java package com.wtz.vo; /** * @author wangtianze QQ:864 ...
- Java微信二次开发(八)
高级接口,先做了两个(获取用户信息和获取关注者列表) 第一步:找到包com.wtz.vo,新建类UserInfo.java package com.wtz.vo; /** * @author wang ...
- Java微信二次开发(二)
第二天,做微信文本消息接口请求与发送 需要导入库:dom4j-1.6.1.jar,xstream-1.3.1.jar 第一步:新建包com.wtz.message.response,新建类BaseMe ...
- Java微信公众平台开发(七)--多媒体消息回复之图片回复
之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复[普通消息类型消息],这里将讲述多媒体消息的回复方法,[多媒体消息]包含回复图片消息/回复语音消息/回复视频消息/回复音乐消 ...
随机推荐
- 2018-2019-2 20175105 实验一《JAVA开发环境的熟悉》实验报告
一.实验内容及步骤 (一)使用JDK编译.运行简单的Java程序 利用cd指令和mkdir指令创建文件夹 利用vim指令编辑源代码文件 利用javac指令编译,利用java指令运行 (二)使用IDEA ...
- Objective-C Mach-O文件格式深入理解
Mach-O(Mach Object),是一种基于Mach内核的文件格式,苹果很多文件都采用这种格式,最常见的就是可执行文件和动态库. 当然,还有.o的目标文件..a和.framework的静态库以及 ...
- QT 布局管理器的使用
很多的时候,需要布局管理器的使用, 在此介绍一下布局管理器的使用,直接上代码 #include "widget.h" #include "ui_widget.h" ...
- Linux下DHCP服务安装配置
简介 安装配置 一.简介 DHCP (Dynamic Host Configuration Protocol,动态主机管理协议)是一种基于UDP协议且仅限用于局域网的网络协议,主要用途是为局域网内部设 ...
- Java多线程编程模式实战指南(三):Two-phase Termination模式
停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程时还有一些额外的细节需要考虑,如待停止的线程处于阻塞(等待锁)或者等待状态(等待其它线程) ...
- Django 学习 (第五部)
表设计: from django.db import models # Create your models here. # class Foo(models.Model): # name = mod ...
- Redis对象占用内存分析
当你往Redis中插入了一系统对象,如何分析这些对象的占用情况? 1.我们可以在Redis的控制台使用info命令来查看各项指标,其中有一项是Memory,可以通过存储前后的used_memory差异 ...
- es5中for...in 和es6中 for..of遍历
//定义一个数组 var arr=['A','B','C']; //定义一个对象 var obj={name:'张三',age:20} // for..in 遍历数组 得到索引 for(var x i ...
- [Oracle][OnlineREDO]数据库无法启动时的对应策略:
[Oracle][OnlineREDO]数据库无法启动时的对应策略: 1. Start with mount. SQL> conn / as sysdba SQL> startup mo ...
- [Spark][Hive]Hive的命令行客户端启动:
[Spark][Hive]Hive的命令行客户端启动: [training@localhost Desktop]$ chkconfig | grep hive hive-metastore 0:off ...