Java微信二次开发(七)
自定义菜单
第一步:新建包com.wtz.menu,新建类Button.java
1 package com.wtz.menu; 2 3 /** 4 * @author wangtianze QQ:864620012 5 * @date 2017年4月23日 下午11:01:02 6 * <p>version:1.0</p> 7 * <p>description:按钮的基类</p> 8 */ 9 public class Button { 10 private String name; 11 12 public String getName() { 13 return name; 14 } 15 16 public void setName(String name) { 17 this.name = name; 18 } 19 }
第二步:找到包com.wtz.menu,新建类ClickButton.java
1 package com.wtz.menu; 2 3 /** 4 * @author wangtianze QQ:864620012 5 * @date 2017年4月23日 下午11:05:10 6 * <p>version:1.0</p> 7 * <p>description:click类型的按钮</p> 8 */ 9 public class ClickButton extends Button{ 10 private String type; 11 12 private String key; 13 14 public String getType() { 15 return type; 16 } 17 public void setType(String type) { 18 this.type = type; 19 } 20 public String getKey() { 21 return key; 22 } 23 public void setKey(String key) { 24 this.key = key; 25 } 26 }
第三步:找到包com.wtz.menu,新建类ViewButton.java
1 package com.wtz.menu; 2 3 /** 4 * @author wangtianze QQ:864620012 5 * @date 2017年4月23日 下午11:09:43 6 * <p>version:1.0</p> 7 * <p>description:View类型的Button</p> 8 */ 9 public class ViewButton extends Button{ 10 private String type; 11 12 private String url; 13 14 public String getType() { 15 return type; 16 } 17 public void setType(String type) { 18 this.type = type; 19 } 20 public String getUrl() { 21 return url; 22 } 23 public void setUrl(String url) { 24 this.url = url; 25 } 26 }
第四步:找到包com.wtz.menu,新建类ComplexButton.java
1 package com.wtz.menu; 2 3 /** 4 * @author wangtianze QQ:864620012 5 * @date 2017年4月23日 下午11:13:25 6 * <p>version:1.0</p> 7 * <p>description:复合类型的按钮</p> 8 * <p>就是代表任意的一级及其子菜单(一个)</p> 9 */ 10 public class ComplexButton extends Button{ 11 private Button[] sub_button; 12 13 public Button[] getSub_button() { 14 return sub_button; 15 } 16 17 public void setSub_button(Button[] sub_button) { 18 this.sub_button = sub_button; 19 } 20 }
第五步:找到包com.wtz.menu,新建类Menu.java
1 package com.wtz.menu; 2 3 /** 4 * @author wangtianze QQ:864620012 5 * @date 2017年4月23日 下午11:07:26 6 * <p>version:1.0</p> 7 * <p>description:菜单类</p> 8 */ 9 public class Menu { 10 private Button[] button; 11 12 public Button[] getButton() { 13 return button; 14 } 15 16 public void setButton(Button[] button) { 17 this.button = button; 18 } 19 }
第六步:找到包com.wtz.util,新建类MenuUtil.java
1 package com.wtz.util; 2 3 import net.sf.json.JSONObject; 4 5 import org.slf4j.Logger; 6 import org.slf4j.LoggerFactory; 7 8 import com.wtz.menu.Menu; 9 10 /** 11 * @author wangtianze QQ:864620012 12 * @date 2017年4月23日 下午11:18:12 13 * <p>version:1.0</p> 14 * <p>description:自定义菜单工具类</p> 15 */ 16 public class MenuUtil { 17 private static Logger log = LoggerFactory.getLogger(MenuUtil.class); 18 19 //菜单创建(POST) 20 public final static String menu_create_url ="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN"; 21 //菜单查询(GET) 22 public final static String menu_get_url = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN"; 23 //菜单删除(GET) 24 public final static String menu_delete_url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN"; 25 26 /** 27 * 创建菜单 28 * 29 * @param menu 菜单实例 30 * @param accessToken 凭证 31 * @return true 成功 false 失败 32 */ 33 public static boolean createMenu(Menu menu,String accessToken){ 34 boolean result = false; 35 String url = menu_create_url.replace("ACCESS_TOKEN",accessToken); 36 37 //将菜单对象转换成json字符串 38 String jsonMenu = JSONObject.fromObject(menu).toString(); 39 40 //发起POST请求创建菜单 41 JSONObject jsonObject = WeixinUtil.httpsRequest(url,"POST",jsonMenu); 42 43 if(null != jsonObject){ 44 int errorCode = jsonObject.getInt("errcode"); 45 String errorMsg = jsonObject.getString("errmsg"); 46 if(0 == errorCode){ 47 result = true; 48 }else{ 49 result = false; 50 log.error("创建菜单失败errorCode:{} errorMsg:{}",errorCode,errorMsg); 51 } 52 } 53 54 return result; 55 } 56 57 /** 58 * 查询菜单 59 * 60 * @param accessToken 凭证 61 * @return 62 */ 63 public static String getMenu(String accessToken){ 64 String result = null; 65 String requestUrl = menu_get_url.replace("ACCESS_TOKEN",accessToken); 66 67 //发送GET请求查询菜单 68 JSONObject jsonObject = WeixinUtil.httpsRequest(requestUrl, "GET", null); 69 70 if(null != jsonObject){ 71 result = jsonObject.toString(); 72 } 73 74 return result; 75 } 76 77 /** 78 * 删除菜单 79 * 80 * @param accessToken 凭证 81 * @return true 成功 false 失败 82 */ 83 public static boolean deleteMenu(String accessToken){ 84 boolean result = false; 85 String requestUrl = menu_delete_url.replace("ACCESS_TOKEN",accessToken); 86 87 //发送GET请求删除菜单 88 JSONObject jsonObject = WeixinUtil.httpsRequest(requestUrl, "GET", null); 89 90 if(null != jsonObject){ 91 int errorCode = jsonObject.getInt("errcode"); 92 String errorMsg = jsonObject.getString("errmsg"); 93 if(0 == errorCode){ 94 result = true; 95 }else{ 96 result = false; 97 log.error("删除菜单失败errorCode:{} errorMsg:{}",errorCode,errorMsg); 98 } 99 } 100 101 return result; 102 } 103 }
第七步:新建包com.wtz.test,新建类MenuManager.java
1 package com.wtz.test; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 import com.wtz.menu.Button; 7 import com.wtz.menu.ClickButton; 8 import com.wtz.menu.ComplexButton; 9 import com.wtz.menu.Menu; 10 import com.wtz.menu.ViewButton; 11 import com.wtz.util.MenuUtil; 12 import com.wtz.util.Parameter; 13 import com.wtz.util.WeixinUtil; 14 import com.wtz.vo.Token; 15 16 /** 17 * @author wangtianze QQ:864620012 18 * @date 2017年4月24日 上午10:58:47 19 * <p>version:1.0</p> 20 * <p>description:菜单测试类</p> 21 */ 22 public class MenuManager { 23 private static Logger log = LoggerFactory.getLogger(MenuManager.class); 24 25 /** 26 * 定义菜单结构 27 * 28 * @return 29 */ 30 private static Menu getMenu(){ 31 ClickButton button11 = new ClickButton(); 32 button11.setName("Click11"); 33 button11.setType("click"); 34 button11.setKey("anniu11"); 35 36 ClickButton button12 = new ClickButton(); 37 button12.setName("Click12"); 38 button12.setType("click"); 39 button12.setKey("anniu12"); 40 41 ViewButton button13 = new ViewButton(); 42 button13.setName("View13"); 43 button13.setType("view"); 44 button13.setUrl("http://www.baidu.com"); 45 46 ViewButton button14 = new ViewButton(); 47 button14.setName("View14"); 48 button14.setType("view"); 49 button14.setUrl("http://www.baidu.com"); 50 51 ComplexButton complexButton1 = new ComplexButton(); 52 complexButton1.setName("第一个"); 53 complexButton1.setSub_button(new Button[] {button11,button13}); 54 55 ComplexButton complexButton2 = new ComplexButton(); 56 complexButton2.setName("第二个"); 57 complexButton2.setSub_button(new Button[] {button12,button14}); 58 59 Menu menu = new Menu(); 60 menu.setButton(new Button[] {complexButton1,complexButton2}); 61 62 return menu; 63 } 64 65 public static void main(String[] args){ 66 //调用接口获取凭证 67 Token token = WeixinUtil.getToken(Parameter.appId, Parameter.appSecret); 68 69 if(null != token){ 70 //创建菜单------------------------------------------------------------------------ 71 // boolean result = MenuUtil.createMenu(getMenu(), token.getAccessToken()); 72 // //判断创建菜单结果 73 // if(result){ 74 // log.info("创建菜单成功!"); 75 // }else{ 76 // log.info("创建菜单失败!"); 77 // } 78 //查询菜单------------------------------------------------------------------------ 79 String jsonMenus = MenuUtil.getMenu(token.getAccessToken()); 80 log.info(jsonMenus); 81 //删除菜单------------------------------------------------------------------------ 82 // boolean result = MenuUtil.deleteMenu(token.getAccessToken()); 83 // if(result){ 84 // log.info("删除菜单成功!"); 85 // }else{ 86 // log.info("删除菜单失败!"); 87 // } 88 } 89 } 90 }
第八步:找到包com.wtz.util,修改类ProcessService.java
1 package com.wtz.util; 2 3 import java.io.IOException; 4 import java.util.ArrayList; 5 import java.util.Date; 6 import java.util.List; 7 import java.util.Map; 8 9 import javax.servlet.http.HttpServletRequest; 10 11 import com.wtz.dao.PostCodeDao; 12 import com.wtz.message.response.Article; 13 import com.wtz.message.response.NewsMessage; 14 import com.wtz.message.response.TextMessage; 15 16 /** 17 * @author wangtianze QQ:864620012 18 * @date 2017年4月19日 下午8:04:14 19 * <p>version:1.0</p> 20 * <p>description:核心服务类</p> 21 */ 22 public class ProcessService { 23 //定义数据访问的dao 24 private static PostCodeDao dao = new PostCodeDao(); 25 26 //-----------------------------------老的,加密前-------------------------------------------------- 27 // public static String dealRequest(HttpServletRequest request){ 28 // //XML格式的消息数据 29 // String respXml = ""; 30 // //默认返回的文本消息内容 31 // String respContent = "未知的消息类型"; 32 // //调用parseXml方法解析请求消息 33 // Map<String, String> requestMap; 34 // try { 35 // requestMap = MessageUtil.parseXml(request); 36 // //发送方账号 37 // String fromUserName = requestMap.get("FromUserName"); 38 // //开发者微信号 39 // String toUserName = requestMap.get("ToUserName"); 40 // //消息类型 41 // String MsgType = requestMap.get("MsgType"); 42 // //消息内容 43 // String content = requestMap.get("Content"); 44 // 45 // //回复文本消息 46 // TextMessage textMessage = new TextMessage(); 47 // textMessage.setToUserName(fromUserName); 48 // textMessage.setFromUserName(toUserName); 49 // textMessage.setCreateTime(new Date().getTime()); 50 // textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); 51 // 52 // if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){ 53 // respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n"; 54 // if(content.equals("1")){ 55 // respContent = "请按照格式输入地区名,例如输入 邮编:东城"; 56 // } 57 // if(content.equals("2")){ 58 // respContent = "请按照格式输入地区名,例如输入 区号:东城"; 59 // } 60 // if(content.equals("?")){ 61 // respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n"; 62 // } 63 // if(content.startsWith("邮编:")){ 64 // int pos = content.indexOf(":"); 65 // String cityName = content.substring(pos + 1); 66 // respContent = dao.findPostCodeByCityName(cityName); 67 // System.out.println("邮编:respContent:" + respContent); 68 // } 69 // if(content.startsWith("区号:")){ 70 // int pos = content.indexOf(":"); 71 // String cityName = content.substring(pos + 1); 72 // respContent = dao.findTelCodeByCityName(cityName); 73 // System.out.println("区号:respContent:" + respContent); 74 // } 75 // }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)){ 76 // respContent = "您发送的是图片消息"; 77 // }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)){ 78 // respContent = "您发送的是语音消息"; 79 // }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)){ 80 // respContent = "您发送的是视频消息"; 81 // }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)){ 82 // respContent = "您发送的是地理位置消息"; 83 // }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)){ 84 // respContent = "您发送的是链接消息"; 85 // }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)){ 86 // //事件类型 87 // String eventType = requestMap.get("Event"); 88 // if(eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)){ 89 // respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n"; 90 // }else if(eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){ 91 // //TODO 取消订阅后用户不会再收到公众号发送的消息,因此不需要回复 92 // }else if(eventType.equals(MessageUtil.EVENT_TYPE_SCAN)){ 93 // //TODO 处理扫描带参数二维码事件 94 // }else if(eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)){ 95 // //TODO 处理上报地理位置事件 96 // }else if(eventType.equals(MessageUtil.EVENT_TYPE_CLICK)){ 97 // //TODO 处理菜单点击事件 98 // } 99 // } 100 // //设置文本消息的内容 101 // textMessage.setContent(respContent); 102 // //将文本消息对象转换成xml 103 // respXml = MessageUtil.messageToXml(textMessage); 104 // } catch (IOException e) { 105 // // TODO Auto-generated catch block 106 // e.printStackTrace(); 107 // } 108 // 109 // return respXml; 110 // } 111 112 //----------------------------------------------新的,加密后--------------------------------------------- 113 public static String dealRequest(String request){ 114 //XML格式的消息数据 115 String respXml = ""; 116 //默认返回的文本消息内容 117 String respContent = "未知的消息类型"; 118 //调用parseXml方法解析请求消息 119 Map<String, String> requestMap; 120 try { 121 requestMap = MessageUtil.parseXml(request); 122 //发送方账号 123 String fromUserName = requestMap.get("FromUserName"); 124 //开发者微信号 125 String toUserName = requestMap.get("ToUserName"); 126 //消息类型 127 String MsgType = requestMap.get("MsgType"); 128 //消息内容 129 String content = requestMap.get("Content"); 130 131 //回复文本消息 132 TextMessage textMessage = new TextMessage(); 133 textMessage.setToUserName(fromUserName); 134 textMessage.setFromUserName(toUserName); 135 textMessage.setCreateTime(new Date().getTime()); 136 textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); 137 138 if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){ 139 respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n"; 140 if(content.equals("1")){ 141 respContent = "请按照格式输入地区名,例如输入 邮编:东城"; 142 } 143 if(content.equals("2")){ 144 respContent = "请按照格式输入地区名,例如输入 区号:东城"; 145 } 146 if(content.equals("?")){ 147 respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n"; 148 } 149 if(content.startsWith("邮编:")){ 150 int pos = content.indexOf(":"); 151 String cityName = content.substring(pos + 1); 152 respContent = dao.findPostCodeByCityName(cityName); 153 System.out.println("邮编:respContent:" + respContent); 154 } 155 if(content.startsWith("区号:")){ 156 int pos = content.indexOf(":"); 157 String cityName = content.substring(pos + 1); 158 respContent = dao.findTelCodeByCityName(cityName); 159 System.out.println("区号:respContent:" + respContent); 160 } 161 }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)){ 162 respContent = "您发送的是图片消息"; 163 }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)){ 164 respContent = "您发送的是语音消息"; 165 }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)){ 166 respContent = "您发送的是视频消息"; 167 }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)){ 168 respContent = "您发送的是地理位置消息"; 169 }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)){ 170 respContent = "您发送的是链接消息"; 171 }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)){ 172 //事件类型 173 String eventType = requestMap.get("Event"); 174 if(eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)){ 175 respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n"; 176 }else if(eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){ 177 //TODO 取消订阅后用户不会再收到公众号发送的消息,因此不需要回复 178 }else if(eventType.equals(MessageUtil.EVENT_TYPE_SCAN)){ 179 //TODO 处理扫描带参数二维码事件 180 }else if(eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)){ 181 //TODO 处理上报地理位置事件 182 }else if(eventType.equals(MessageUtil.EVENT_TYPE_CLICK)){ 183 //事件Key值,与创建菜单时的key值对应 184 String eventKey = requestMap.get("EventKey"); 185 System.out.println("eventKey:" + eventKey); 186 if(eventKey.equals("anniu11")){ 187 Article article = new Article(); 188 article.setTitle("anniu1"); 189 article.setDescription("anniu1Desc"); 190 article.setPicUrl(""); 191 article.setUrl("http://www.baidu.com"); 192 193 List<Article> articleList = new ArrayList<Article>(); 194 articleList.add(article); 195 196 //创建图文消息 197 NewsMessage newsMessage = new NewsMessage(); 198 newsMessage.setToUserName(fromUserName); 199 newsMessage.setFromUserName(toUserName); 200 newsMessage.setCreateTime((new Date()).getTime()); 201 newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS); 202 newsMessage.setArticleCount(articleList.size()); 203 newsMessage.setArticles(articleList); 204 respXml = MessageUtil.messageToXml(newsMessage); 205 }else if(eventType.equals("anniu2")){ 206 textMessage.setContent("anniu2"); 207 respXml = MessageUtil.messageToXml(textMessage); 208 } 209 } 210 } 211 //设置文本消息的内容 212 textMessage.setContent(respContent); 213 //将文本消息对象转换成xml 214 respXml = MessageUtil.messageToXml(textMessage); 215 } catch (IOException e) { 216 // TODO Auto-generated catch block 217 e.printStackTrace(); 218 } 219 220 return respXml; 221 } 222 }
自定义菜单完成
posted on 2017-04-24 15:33 wangtianze 阅读(506) 评论(0) 编辑 收藏 举报