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

一、自定义菜单接口:

           其中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 }

 

       

                     

posted @ 2017-12-04 11:30  北极的大企鹅  阅读(233)  评论(0编辑  收藏  举报
阅读 - 79万