• 微信公众号开发基础篇(八)


    一、自定义菜单接口:

               其中3-8是click类型的其他方面应用.

    二、需要的参数

            

    参数是否必须说明
    button 一级菜单数组,个数应为1~3个
    sub_button 二级菜单数组,个数应为1~5个
    type 菜单的响应动作类型
    name 菜单标题,不超过16个字节,子菜单不超过60个字节
    key click等点击类型必须 菜单KEY值,用于消息接口推送,不超过128字节
    url view类型必须 网页链接,用户点击菜单可打开链接,不超过1024字节
    media_id media_id类型和view_limited类型必须 调用新增永久素材接口返回的合法media_id

    三、实战自定义菜单操作

           1、建立实体类Button

     1 package com.my.pojo.button;
     2 
     3 import java.util.Arrays;
     4 
     5 /**
     6  * ///菜单按钮实体类
     7  * 
     8  * @author liuya
     9  * 
    10  */
    11 
    12 public class Button {
    13 
    14     // 菜单标题
    15     private String name;
    16     // 菜单类型
    17     private String type;
    18     // 菜单数组(微信界面最下边的菜单组件个数)
    19     private Button[] sub_button;
    20 
    21     public Button() {
    22         super();
    23     }
    24 
    25     public Button(String name, String type, Button[] sub_button) {
    26         this.name = name;
    27         this.type = type;
    28         this.sub_button = sub_button;
    29     }
    30 
    31     public String getName() {
    32         return name;
    33     }
    34 
    35     public void setName(String name) {
    36         this.name = name;
    37     }
    38 
    39     public String getType() {
    40         return type;
    41     }
    42 
    43     public void setType(String type) {
    44         this.type = type;
    45     }
    46 
    47     public Button[] getSub_button() {
    48         return sub_button;
    49     }
    50 
    51     public void setSub_button(Button[] sub_button) {
    52         this.sub_button = sub_button;
    53     }
    54 
    55     @Override
    56     public String toString() {
    57         return "Button [name=" + name + ", type=" + type + ", sub_button="
    58                 + Arrays.toString(sub_button) + "]";
    59     }
    60 
    61 }

               2、建立一个view类型的button

     1 package com.my.pojo.button;
     2 
     3 /**
     4  * //跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
     5  * 
     6  * @author liuya
     7  * 
     8  * 
     9  * 
    10  *         //跳转到网页的button
    11  */
    12 
    13 public class ViewButton extends Button {
    14 
    15     // 跳转的链接
    16     private String url;
    17 
    18     public ViewButton() {
    19     }
    20 
    21     public ViewButton(String url) {
    22         this.url = url;
    23     }
    24 
    25     public String getUrl() {
    26         return this.url;
    27     }
    28 
    29     public void setUrl(String url) {
    30         this.url = url;
    31     }
    32 
    33     @Override
    34     public String toString() {
    35         return "ViewButton [url=" + url + "]";
    36     }
    37 
    38 }

              3、建立一个clickButton类型的button

     1 package com.my.pojo.button;
     2 
     3 /**
     4  * 消息接口推送
     5  * 
     6  * @author liuya //
     7  * 
     8  *         //当点击button的时候触发事件
     9  */
    10 
    11 public class ClickButton extends Button {
    12 
    13     // 菜单KEY
    14     private String key;
    15 
    16     public ClickButton() {
    17     }
    18 
    19     public ClickButton(String key) {
    20         this.key = key;
    21     }
    22 
    23     public String getKey() {
    24         return this.key;
    25     }
    26 
    27     public void setKey(String key) {
    28         this.key = key;
    29     }
    30 
    31     @Override
    32     public String toString() {
    33         return "ClickButton [key=" + key + "]";
    34     }
    35 
    36 }

                 4、建立一个承载button的menu

    package com.my.pojo.button;
    
    import java.util.Arrays;
    
    /**
     * 
     * // 承载微信界面下边的多个菜单的框
     * 
     * @author liuya
     * 
     */
    
    public class Menu {
    
        // button数组
        private Button[] button;
    
        public Menu() {
        }
    
        public Menu(Button[] button) {
            this.button = button;
        }
    
        public Button[] getButton() {
            return this.button;
        }
    
        public void setButton(Button[] button) {
            this.button = button;
        }
    
        @Override
        public String toString() {
            return "Menu [button=" + Arrays.toString(button) + "]";
        }
    
    }

                   5、在util里建立一个可以操作菜单的方法

     1 // 建立一个菜单响应的方法(组装界面的菜单样式)
     2     public static Menu initMenu() {
     3 
     4         // 创建一个menu对象
     5         Menu menu = new Menu();
     6 
     7         // 一个展示的菜单(主菜单,就是菜单下没有菜单了)
     8         ViewButton button11 = new ViewButton();
     9 
    10         // 设置菜单的名称(就是菜单上显示的字)
    11         button11.setName("我的主页");
    12         // 设置菜单的类型(展示类型的)
    13         button11.setType("view");
    14         // 网址需要是一个完整的路径,包括协议和后边的路径
    15         button11.setUrl("http://www.cnblogs.com/liuyangfirst/");
    16 
    17         // 第二个主菜单
    18         ViewButton button22 = new ViewButton();
    19         // 设置菜单的名称(就是菜单上显示的字)
    20         button22.setName("个人简介");
    21         // 设置菜单的类型(展示类型的)
    22         button22.setType("view");
    23         // 网址需要是一个完整的路径,包括协议和后边的路径
    24         button22.setUrl("https://home.cnblogs.com/u/liuyangfirst/");
    25 
    26         // 第三个主菜单有子菜单
    27         Button button33 = new Button();
    28         // 设置菜单的名称(就是菜单上显示的字)
    29         button33.setName("菜单");
    30 
    31         // 第三个菜单的子菜单
    32         ClickButton button331 = new ClickButton();
    33         // 设置菜单的名称(就是菜单上显示的字)
    34         button331.setName("扫码事件");
    35         // 设置菜单的类型(扫码类型的)
    36         button331.setType("scancode_push");
    37         // 关键字
    38         button331.setKey("331");
    39 
    40         // 第三个菜单的子菜单
    41         ClickButton button332 = new ClickButton();
    42         // 设置菜单的名称(就是菜单上显示的字)
    43         button332.setName("地理位置");
    44         // 设置菜单的类型(地理位置类型的)
    45         button332.setType("location_select");
    46         // 关键字
    47         button332.setKey("332");
    48 
    49         // 把两个二级菜单通过数组的方式放入到主菜单中
    50         button331.setSub_button(new Button[] { button331, button332 });
    51 
    52         // 把三个主菜单,放入到menu中
    53         menu.setButton(new Button[] { button11, button22, button33 });
    54         return menu;
    55 
    56     }
    57 
    58     /**
    59      * 
    60      * @param token
    61      * @param menu
    62      * @return
    63      * @throws ParseException
    64      * @throws IOException
    65      * 
    66      * 
    67      * 
    68      *             //封装一个方法,请求微信服务平台,在公众号上建立一个菜单
    69      * 
    70      * 
    71      * 
    72      * 
    73      */
    74 
    75     public static int createMenu(String token, String menu)
    76             throws ParseException, IOException {
    77         Integer result = null;
    78 
    79         // 把接口传进来
    80         String url = CREATE_MENU_URL.replace("ACCESS_TOKEN", token);
    81 
    82         // 封装好的doPost方法调用这个接口地址
    83         JSONObject jsonObject = doPostStr(url, menu);
    84 
    85         // 获取的结果进行判断,不为空就进行操作
    86         if (jsonObject != null) {
    87 
    88             // 获取结果进行判断,如果是0的话就判断,如果不是0的话,根据文档的错误代码进行判断
    89             result = Integer.valueOf(jsonObject.getInt("errcode"));
    90         }
    91 
    92         return result;
    93     }

    同时要建立常量的menu接口

    1 // 菜单接口(使用接口创建自定义菜单后,开发者还可使用接口查询自定义菜单的结构)
    2     private static final String CREATE_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";

               6、调用建立的接口,进行测试和实际建立菜单(注意:公众号上的界面菜单,是通过这里调用测试建立的

     1 package com.my.test;
     2 
     3 import net.sf.json.JSONObject;
     4 
     5 import org.junit.Test;
     6 
     7 import com.my.pojo.AccessToken;
     8 import com.my.utils.WeixinUtil;
     9 
    10 /**
    11  * 测试类
    12  * 
    13  * @author liuya
    14  * 
    15  */
    16 
    17 public class TestDemo {
    18 
    19     @Test
    20     public void test() throws Exception {
    21         AccessToken accessToken = WeixinUtil.getAccessToken();
    22         System.out.println("票据信息 : " + accessToken.getToken());
    23         System.out.println("有效时间 : " + accessToken.getExpiresIn());
    24     }
    25 
    26     // 对菜单建立是否成功测试,同时是界面菜单建立的类
    27     @Test
    28     public void test3() throws Exception {
    29         AccessToken token = WeixinUtil.getAccessToken();
    30         String menuString = JSONObject.fromObject(WeixinUtil.initMenu())
    31                 .toString();
    32         int result = WeixinUtil.createMenu(token.getToken(), menuString);
    33         if (result == 0)
    34             System.out.println("创建菜单成功");
    35         else
    36             System.out.println("错误码" + result);
    37     }
    38 
    39 }

           

                         

  • 相关阅读:
    java内部类_让你一看就明白_再也不用困惑啦
    hibernate中的java对象有几种状态,其相互关系如何(区别和相互转换)
    未曾谋面却完成了短信发送功能_API是个好中介
    日历(Calendar)_java版(某年的日历,某月的日历)_用户完全自定义
    让你的网站拥有微博(weibo.com)关注图标
    一个demo告诉你优化算法的强大
    给你八分钟搞定dedeCMS(织梦内容管理系统)
    SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程)
    oracle数据库:jdbc通用sql分页封装
    浅析HTTP协议
  • 原文地址:https://www.cnblogs.com/liuyangfirst/p/7967177.html
Copyright © 2020-2023  润新知