微信自定义菜单的创建(JAVA版)

来源:互联网 发布:python list数组 编辑:程序博客网 时间:2024/05/02 15:48

微信自定义菜单的创建与使用

  • 微信自定义菜单的创建与使用
    • 需求
    • 菜单类介绍
    • 场景
    • 代码
    • 总结

需求

当微信公众号设置为开发者模式,想要自己创建和开发菜单的话,就需要自己调用微信创建菜单的接口来创建菜单了。创建菜单之后,如果需要迫切的看到效果,有时候需要取消关注-从新关注才能够看到的哦(缓存问题)。由于新版微信添加的挺多按钮类型,目前只实现click(点击推事件)和view(跳转URL),其他类型的大致相同。
按钮事件描述
注意:公众号必须是认证了的才有这个自定义菜单创建的功能的哦。你可以在自己的公众号->开发者中心,查看是否支持该接口。

菜单类介绍

Buttonx按钮类

    private String name;    private String type;   //菜单类型 1:点击事件,2:跳转url,3:分组菜单    private String key;   //菜单key值    private String url;   //跳转的链接    private List<Buttonx> sub_button;   //如果是一级菜单,这集合表示二级菜单    //all get and set  所有字段的get 和 set方法

Menux菜单类

public class Menux {    private List<Buttonx> button;    public List<Buttonx> getButton() {        return button;    }    public void setButton(List<Buttonx> button) {        this.button = button;    }}

菜单类包含按钮类(微信最多只能有三个一级菜单哦),按钮类有一级按钮、事件推送按钮、跳转URL按钮,一级按钮可以包含5个二级按钮,5个二级按钮的类型只有事件推送按钮、跳转URL按钮。

场景

如下图公众号菜单:
这里写图片描述
按钮类型:
1.主页:跳转URL按钮
2.主页3:推送事件按钮
3.一级菜单:(如名)

代码

根据菜单分别构建相关的button和menu对象。
如:
主页这个button对象:

        Buttonx btn1 = new Buttonx();        btn1.setName("主页");        btn1.setUrl("http://www.csdn.net/");        btn1.setType("view");        Buttonx btn2 = new Buttonx();        btn2.setName("主页3");        btn2.setKey("KEY_1");        btn2.setType("click");        Buttonx btnsub = new Buttonx();        btnsub.setName("一级菜单");        Buttonx btn3 = new Buttonx();        btn3.setName("大家好");        btn3.setUrl("http://www.baidu.com/");        btn3.setType("view");        Buttonx btn4 = new Buttonx();        btn4.setName("你好");        btn4.setKey("KEY_1");        btn4.setType("click");        btnsub.sub_button.add(btn3);        btnsub.sub_button.add(btn4);        Menux menu = new Menux();        menu.getButton().add(btn1);        menu.getButton().add(btn2);        menu.getButton().add(btnsub);        // 将菜单对象转换成json字符串,利用的是一个jar包,不用自己封装了,也可以自己手动封装        String jsonMenu = net.sf.json.JSONObject.fromObject(menu).toString();        // 调用接口创建菜单        JSONObject jsonObject = httpRequest(url, "POST", jsonMenu);        if (null != jsonObject) {                //如果返回的代码不等于0,那么就是说操作的数据不成功                if (0 != jsonObject.getInt("errcode")) {                    result = jsonObject.getInt("errcode");                    log.error("创建菜单失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));            }            }        }

httpRequest(String requestUrl, String requestMethod, String outputStr)方法描述:

/**     * 发起https请求并获取结果     * @param requestUrl 请求地址     * @param requestMethod 请求方式(GET、POST)     * @param outputStr 提交的数据     * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)     */    public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {        JSONObject jsonObject = null;        StringBuffer buffer = new StringBuffer();        try {            // 创建SSLContext对象,并使用我们指定的信任管理器初始化            TrustManager[] tm = { new MyX509TrustManager() };            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");            sslContext.init(null, tm, new java.security.SecureRandom());            // 从上述SSLContext对象中得到SSLSocketFactory对象            SSLSocketFactory ssf = sslContext.getSocketFactory();            URL url = new URL(requestUrl);            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();            httpUrlConn.setSSLSocketFactory(ssf);            httpUrlConn.setDoOutput(true);            httpUrlConn.setDoInput(true);            httpUrlConn.setUseCaches(false);            // 设置请求方式(GET/POST)            httpUrlConn.setRequestMethod(requestMethod);            if ("GET".equalsIgnoreCase(requestMethod))                httpUrlConn.connect();            // 当有数据需要提交时            if (null != outputStr) {                OutputStream outputStream = httpUrlConn.getOutputStream();                // 注意编码格式,防止中文乱码                outputStream.write(outputStr.getBytes("UTF-8"));                outputStream.close();            }            // 将返回的输入流转换成字符串            InputStream inputStream = httpUrlConn.getInputStream();            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);            String str = null;            while ((str = bufferedReader.readLine()) != null) {                buffer.append(str);            }            bufferedReader.close();            inputStreamReader.close();            // 释放资源            inputStream.close();            inputStream = null;            httpUrlConn.disconnect();            jsonObject = JSONObject.fromObject(buffer.toString());        } catch (ConnectException ce) {            log.error("Weixin server connection timed out.");        } catch (Exception e) {            log.error("https request error:{}", e);        }        return jsonObject;    }

总结

执行如果没有出现错误,就代表请求成功了,对应的微信公众号就生成了自定义菜单了。在公众号点击按钮的时候,就会响应对应的事件了。
注意:如果点击的按钮是推送事件的话,那么就需要在自己的系统设置响应的相关内容了。

0 0
原创粉丝点击