微信测试号开发之五 自定义菜单

 

注意:

1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。

2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。

3、测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

 

按钮类型:

1、click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
2、view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。

了解更多请查看微信开发文档  https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013

 

创建菜单接口:

http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

click和view类型按钮的请求数据格式如下:

 

{
     "button":[
     {
          "type":"click",
          "name":"今日歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"菜单",
           "sub_button":[
           {
               "type":"view",
               "name":"搜索",
               "url":"http://www.soso.com/"
            },
            {
                 "type":"miniprogram",
                 "name":"wxa",
                 "url":"http://mp.weixin.qq.com",
                 "appid":"wx286b93c14bbf93aa",
                 "pagepath":"pages/lunar/index"
             },
            {
               "type":"click",
               "name":"赞一下我们",
               "key":"V1001_GOOD"
            }]
       }]
 }

 

 

进行开发:

(一):封装按钮对象

 

一:基类

 

public class Button {

  private String name;//所有一级菜单、二级菜单都共有一个相同的属性,那就是name


   public String getName() {
       return name;
   }


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


}

 

 

 

 

 

二:子菜单类

 

/**
* 描述: 子菜单项 :没有子菜单的菜单项,有可能是二级菜单项,也有可能是不含二级菜单的一级菜单。
 */
public class CommonButton extends Button {
    
    private String type;
    private String key;
    private String url;


    public String getType() {
        return type;
    }


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


    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;
}
    
    
}

 

 

三:父菜单类

 

 

/**
* 描述: 父菜单项 :包含有二级菜单项的一级菜单。这类菜单项包含有二个属性:name和sub_button,而sub_button以是一个子菜单项数组 
 */
public class ComplexButton extends Button {
    private Button[] sub_button;


    public Button[] getSub_button() {
        return sub_button;
    }


    public void setSub_button(Button[] sub_button) {
        this.sub_button = sub_button;
    }
}

 

 

四:菜单对象的封装类

/**
* 描述: 整个菜单对象的封装
 */
public class Menu {
    private Button[] button;

    public Button[] getButton() {
        return button;
    }

    public void setButton(Button[] button) {
        this.button = button;
    }
}

 

 

 

 

(二):封装生成菜单的方法

 

 

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mote.weixin.entry.Menu;


public class MenuUtils {

    private static ObjectMapper MAPPER = new ObjectMapper();
    
    
    public static int createMenu(Menu menu, String accessToken) throws Exception {
        int result = 0;
        // 拼装创建菜单的url
        String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+accessToken+"";
        // 将菜单对象转换成json字符串
        String jsonMenu = MAPPER.writeValueAsString(menu);
        // 调用接口创建菜单,CommonUtils是上一篇中介绍的内容
        String resq = CommonUtils.Post_Json(url, jsonMenu);
        
        JsonNode tree = MAPPER.readTree(resq);
        if(tree.get("errcode").toString().equals("0")){
        System.out.println("菜单创建成功!");
        }else{
        System.out.println("菜单创建失败!");
        }

        return result;
    }
}

 

 

 

 

 

 

(三):组装数据,生成菜单

 

import org.springframework.stereotype.Controller;


import com.mote.weixin.entry.Button;
import com.mote.weixin.entry.CommonButton;
import com.mote.weixin.entry.ComplexButton;
import com.mote.weixin.entry.Menu;
import com.mote.weixin.utils.CommonUtils;
import com.mote.weixin.utils.MenuUtils;


@Controller
public class MenuController {

public static void main(String[] args) {


try {
// 调用接口获取access_token,CommonUtils是上一篇中的内容
String accessToken = CommonUtils.getAccessToken();
// 调用接口创建菜单
MenuUtils.createMenu(getMenu(), accessToken);
} catch (Exception e) {
System.out.println("菜单创建失败");
e.printStackTrace();
}


}


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


CommonButton btn11 = new CommonButton();
btn11.setName("校园导航");
btn11.setType("view");
btn11.setUrl("http://02d73f21.ngrok.io/wx_coges/navi.jsp");


CommonButton btn21 = new CommonButton();
btn21.setName("学校风采");
btn21.setType("view");
btn21.setKey("21");
btn21.setUrl("https://www.baidu.com/");


CommonButton btn31 = new CommonButton();
btn31.setName("健身服务");
btn31.setType("click");
btn31.setKey("31");


CommonButton btn32 = new CommonButton();
btn32.setName("爱情咨询");
btn32.setType("click");
btn32.setKey("32");


/**
* 微信: mainBtn2,mainBtn3底部的三个一级菜单
*/


ComplexButton mainBtn3 = new ComplexButton();
mainBtn3.setName("更多服务");
mainBtn3.setSub_button(new CommonButton[] { btn31, btn32});


/**
* 封装整个菜单
*/
Menu menu = new Menu();
menu.setButton(new Button[] { btn11, btn21, mainBtn3 });


return menu;
}


}

 

 

 

 

 

ok了,直接执行main方法就可以生成菜单了,试试吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值