微信公众号开发-自定义菜单

专栏简介
💒个人主页
📰专栏目录
📖心灵鸡汤📖
没有人能改变你,别人只能影响你,能改变你的只有你自己。
✍相关博文✍
微信API封装
token验证

微信公众号开发-自定义菜单


下案例仅供参考,但保证有效可用!!!


一、应用场景

1.在启用token验证后,无法通过公众平台编辑菜单,需要通过API编辑菜单
2.想要在自己的系统中进行相关菜单编辑,而不通过登录公众号进行编辑

二、功能实现

以下示例以点击菜单跳转网页为例,其它菜单功能请参考官网自定义菜单

1.服务器配置

微信公众号-服务器配置(token验证)已开通的请忽略

2.access_token 获取

可参考 微信公众号消息推送开发(模板消息):开发实现(二)获取access_token

3.代码实现

1.javaBean创建

1.分别创建SubMenu.java和ParentMenu.java实体类用于封装请求体(不创建实体类的话直接封装josn字符串也可以)

SubMenu.java  	
package com.lvyq.wechat.menu;

/**
 * @author lvyq
 * @version 1.0
 * @description: 二级菜单数组,个数应为1~5个
 * @date 2022/7/12 11:00
 */
public class SubMenu {

    /**
     * 菜单标题,不超过16个字节,子菜单不超过60个字节
     */
    /**
     * 菜单的响应动作类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型
     */
    private String type;

    private String name;
    /**
     * 菜单KEY值,用于消息接口推送,不超过128字节  click等点击类型必须
     */
    private String key;

    /**
     *网页 链接,用户点击菜单可打开链接,不超过1024字节。
     * type为miniprogram时,不支持小程序的老版本客户端将打开本url。
     * view、miniprogram类型必须
     */

    private String url;

    /**
     * miniprogram类型必须	小程序的appid(仅认证公众号可配置)
     */
    private String appid;

    /**
     * miniprogram类型必须
     * 小程序的页面路径
     */
    private String pagepath;

    /**
     * article_id类型和article_view_limited类型必须
     * 发布后获得的合法 article_id
     */
    private String article_id;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getAppid() {
        return appid;
    }

    public void setAppid(String appid) {
        this.appid = appid;
    }

    public String getPagepath() {
        return pagepath;
    }

    public void setPagepath(String pagepath) {
        this.pagepath = pagepath;
    }

    public String getArticle_id() {
        return article_id;
    }

    public void setArticle_id(String article_id) {
        this.article_id = article_id;
    }
}
ParentMenu.java  	
import java.util.List;

/**
 * @author lvyq
 * @version 1.0 按钮 一级菜单数组,个数应为1~3个
 * @description: TODO
 * @date 2022/7/12 10:49
 */
public class ParentMenu extends SubMenu {

    /**
     * 二级菜单数组,个数应为1~5个
     */
    private List<SubMenu> sub_button;

    public List<SubMenu> getSub_button() {
        return sub_button;
    }

    public void setSub_button(List<SubMenu> sub_button) {
        this.sub_button = sub_button;
    }
}

2.创建菜单

根据以下demo修改即可,access_token的获取方式,上文已经给了传送门

创建MenuCreate.java
package com.lvyq.wechat.menu;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

/**
 * @author lvyq
 * @version 1.0
 * @description: TODO
 * @date 2022/7/11 16:08
 */
public class MenuCreate {

    public static final String ACCESS_TOKEN ="xxxx";
    public static String MENU_CREATE="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";

    public static void main(String[] args) {
        List<ParentMenu> button = new ArrayList<>();
        ParentMenu parentMenu = new ParentMenu();
        parentMenu.setName("百度CSDN");
        List<SubMenu> subButtons = new ArrayList<>();
        SubMenu subButton = new SubMenu();
        subButton.setType("view");
        subButton.setName("百度一下");
        subButton.setUrl("http://www.baidu.com/");
        subButtons.add(subButton);
        SubMenu subButton2 = new SubMenu();
        subButton2.setType("view");
        subButton2.setName("CSDN");
        subButton2.setUrl("https://www.csdn.net/");
        subButtons.add(subButton2);
        parentMenu.setSub_button(subButtons);
        button.add(parentMenu);
        JSONObject mav = new JSONObject();
        mav.put("button",JSON.toJSON(button));
        MENU_CREATE=MENU_CREATE.replace("ACCESS_TOKEN",ACCESS_TOKEN);
        sendPost(MENU_CREATE, mav.toJSONString());
    }
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setDoOutput(true);
            conn.setDoInput(true);
            out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"));
            out.print(param);
            out.flush();
            String line;
            for(in = new BufferedReader(new InputStreamReader(conn.getInputStream())); (line = in.readLine()) != null; result = result + line) {
            }
        } catch (Exception var16) {
            System.out.println("发送 POST 请求出现异常!" + var16);
            var16.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }

                if (in != null) {
                    in.close();
                }
            } catch (IOException var15) {
                var15.printStackTrace();
            }

        }

        return result;
    }

}

效果图:
Alt

总结

每次创建新的菜单时会直接覆盖,查询菜单和删除菜单就不说了,不常用

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要喷香水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值