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  阅读(500)  评论(0编辑  收藏  举报

导航