Java微信公众号服务号开发(四):公众号底部菜单设置

今天来说一下微信公众号底部的菜单设置

设置更改公众号底部的菜单有两种方式:1、通过Java代码调取微信提供的接口进行设置。

2、直接在微信公众号平台用json数据设置

这两种方式都比较简单。个人采取的一般是第二种方式。

一、Java代码调取微信接口进行设置直接上代码

1、定义APPID,APPSECRET的ConstantWeChat常量类

public class ConstantWeChat {
    public static final String APPID = "";

    public static final String APPSECRET = "";
}

2、通用微信接口类CommonWechatUtil类,获取accesstoken

public class CommonWechatUtil {
    private static Logger log = LoggerFactory.getLogger(CommonWechatUtil.class);
    // 凭证获取(GET)
    public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
/**
     * 获取接口访问凭证
     *
     * @param appid 凭证
     * @param appsecret 密钥
     * @return
     */
    public static AccessToken getToken(String appid, String appsecret) {
        AccessToken token = null;
        String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
        // 发起GET请求获取凭证
        JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);
        if (null != jsonObject) {
            try {
                token = new AccessToken();
                token.setAccessToken(jsonObject.getString("access_token"));
                token.setExpiresIn(jsonObject.getInt("expires_in"));
            } catch (JSONException e) {
                token = null;
                // 获取token失败
                log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
        return token;
    }
}

3、调用创建菜单的接口CommonWechatUtil类中的方法createMenu

// 菜单创建(POST) 限100(次/天)
    public static String menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
    
/**
     * 创建菜单
     *
     * @param menu 菜单实例
     * @param accessToken 有效的access_token
     * @return 0表示成功,其他值表示失败
     */
    public static int createMenu(Menu menu, String accessToken) {
        int result = 0;

        // 拼装创建菜单的url
        String url = menu_create_url.replace("ACCESS_TOKEN", accessToken);
        // 将菜单对象转换成json字符串
        String jsonMenu = JSONObject.fromObject(menu).toString();
        // 调用接口创建菜单
        JSONObject jsonObject = httpsRequest(url, "POST", jsonMenu);

        if (null != jsonObject) {
            if (0 != jsonObject.getInt("errcode")) {
                result = jsonObject.getInt("errcode");
                log.error("创建菜单失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }

        return result;
    }

4、组装菜单getMenu方法

/**
     * 组装菜单数据
     *
     * @return
     * @throws UnsupportedEncodingException
     */
    private static Menu getMenu() {


        ViewButton btn11 = new ViewButton();
        btn11.setName("开启");
        btn11.setType("view");
        btn11.setUrl("http://www.baidu.com");

        ViewButton btn21 = new ViewButton();
        btn21.setName("关闭");
        btn21.setType("view");
        btn21.setUrl("http://www.baidu.com");

        ViewButton btn31 = new ViewButton();
        btn31.setName("谢谢");
        btn31.setType("view");
        btn31.setUrl("https://www.baidu.com");

        ViewButton btn41 = new ViewButton();
        btn41.setName("关注");
        btn41.setType("view");
        btn41.setUrl("https://www.baidu.com");

        CommonButton btn12 = new CommonButton();
        btn12.setName("赞");
        btn12.setType("click");
        btn12.setKey("return_content");

        ComplexButton mainBtn1 = new ComplexButton();
        mainBtn1.setName("菜单1");
        mainBtn1.setSub_button(new BasicButton[] { btn11, btn21,btn31});

        ComplexButton mainBtn2 = new ComplexButton();
        mainBtn2.setName("菜单2");
        mainBtn2.setSub_button(new BasicButton[] { btn41, btn12 });

        /**

         *在某个一级菜单下没有二级菜单的情况,menu应该这样定义:<br>
         * menu.setButton(new Button[] { mainBtn1, mainBtn2, btn33 });
         */
        Menu menu = new Menu();
        menu.setButton(new BasicButton[] { mainBtn1, mainBtn2});

        return menu;
    }

5、编写创建菜单的方法

@Service("menuService")
public class MenuServiceImpl implements MenuService {
    private static final Logger LOGGER = LoggerFactory.getLogger(MenuServiceImpl.class);

    //    @Override
    public static Boolean createMenu() {
        // 第三方用户唯一凭证
        String appId = ConstantWeChat.APPID;
        // 第三方用户唯一凭证密钥
        String appSecret = ConstantWeChat.APPSECRET;
        // 调用接口获取access_token
        AccessToken at = CommonWechatUtil.getToken(appId, appSecret);
        if (null != at) {
            // 调用接口创建菜单
            int result = CommonWechatUtil.createMenu(getMenu(), at.getAccessToken());
            // 判断菜单创建结果
            if (0 == result){
                LOGGER.info("菜单创建成功!");
                return true;
            }
            else{
                LOGGER.info("菜单创建失败,错误码:" + result);
                return false;
            }
        }
        return false;
    }

6、main方法执行creatmenu方法

 public static void main(String[] args) {
        createMenu();
    }

以上就是第一种创建菜单的方法。

二、通过json的body体创建菜单

1、前往微信公众平台接口测试工具https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=%E5%9F%BA%E7%A1%80%E6%94%AF%E6%8C%81&form=%E8%8E%B7%E5%8F%96access_token%E6%8E%A5%E5%8F%A3%20/token

填写正确的配置信息

返回结果200代表返回成功,获取到access_token赋值粘贴下来。如果不是200,请根据对应的错误码查询错误。

2、获取到access_token之后,重新选择自定义菜单

将json数据放在body体中,按自己的实际情况修改json

{
 "button": [
 {
  "name": "菜单1", 
  "type": "view", 
  "url": "http://www.baidu.com"
 }, 
 {
  "name": "菜单2", 
  "type": "view", 
  "url": "http://www.baidu.com"
 },
 {
  "name": "菜单3", 
  "sub_button": [
  {
   "key": "text", 
   "name": "回复图文", 
   "type": "click"
  }, 
  {
   "name": "博客", 
   "type": "view", 
   "url": "http://www.baidu.com"
  }
  ]
 }
 ]
}

3、点击检查问题,返回值为200即代表菜单生成成功

 

注意:上述过程都执行完毕,没有问题的情况下,如果进入微信公众号测试号中,菜单没有更改。取消关注,重新关注一下就会发现菜单已经更改成功!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值