zoukankan      html  css  js  c++  java
  • 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 = "感谢您关注【王天泽的服务号】
    " + "微信号:wangtianze1
    " + "请回复序号:
    " + "1.查邮政编码
    " + "2.查电话区号
    " + "?.返回帮助菜单
    ";
     54 //                if(content.equals("1")){
     55 //                    respContent = "请按照格式输入地区名,例如输入 邮编:东城";
     56 //                }
     57 //                if(content.equals("2")){
     58 //                    respContent = "请按照格式输入地区名,例如输入 区号:东城";
     59 //                }
     60 //                if(content.equals("?")){
     61 //                    respContent = "感谢您关注【王天泽的服务号】
    " + "微信号:wangtianze1
    " + "请回复序号:
    " + "1.查邮政编码
    " + "2.查电话区号
    " + "?.返回帮助菜单
    ";
     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 = "感谢您关注【王天泽的服务号】
    " + "微信号:wangtianze1
    " + "请回复序号:
    " + "1.查邮政编码
    " + "2.查电话区号
    " + "?.返回帮助菜单
    ";
     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 = "感谢您关注【王天泽的服务号】
    " + "微信号:wangtianze1
    " + "请回复序号:
    " + "1.查邮政编码
    " + "2.查电话区号
    " + "?.返回帮助菜单
    ";
    140                 if(content.equals("1")){
    141                     respContent = "请按照格式输入地区名,例如输入 邮编:东城";
    142                 }
    143                 if(content.equals("2")){
    144                     respContent = "请按照格式输入地区名,例如输入 区号:东城";
    145                 }
    146                 if(content.equals("?")){
    147                     respContent = "感谢您关注【王天泽的服务号】
    " + "微信号:wangtianze1
    " + "请回复序号:
    " + "1.查邮政编码
    " + "2.查电话区号
    " + "?.返回帮助菜单
    ";
    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 = "感谢您关注【王天泽的服务号】
    " + "微信号:wangtianze1
    " + "请回复序号:
    " + "1.查邮政编码
    " + "2.查电话区号
    " + "?.返回帮助菜单
    ";
    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 }

    自定义菜单完成

  • 相关阅读:
    GB/T 38863-2020 干部网络培训 平台数据接口技术要求
    SF/T 0023-2019 全国公证综合管理信息系统技术规范
    JTS/T 198-3-2019 水运工程施工信息模型应用标准
    GA/T 467-2019 居民身份证验证安全控制模块接口技术规范
    JR/T 0192-2020 证券期货业移动互联网应用程序安全规范
    JR/T 0191-2020 证券期货业软件测试指南 软件安全测试
    C 实战练习题目85
    C 实战练习题目84
    C 实战练习题目83
    C 实战练习题目82
  • 原文地址:https://www.cnblogs.com/wangtianze/p/6757125.html
Copyright © 2011-2022 走看看