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

原文:https://blog.csdn.net/qq_37936542/article/details/78549731

注意:

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"
            }]
       }]
 }



进行开发:

(一):封装按钮对象


一:基类

  1. public class Button {  
  2.   
  3.   private String name;//所有一级菜单、二级菜单都共有一个相同的属性,那就是name  
  4.   
  5.   
  6.    public String getName() {  
  7.        return name;  
  8.    }  
  9.   
  10.   
  11.    public void setName(String name) {  
  12.        this.name = name;  
  13.    }  
  14.   
  15.   
  16. }  


二:子菜单类

  1. /** 
  2. * 描述: 子菜单项 :没有子菜单的菜单项,有可能是二级菜单项,也有可能是不含二级菜单的一级菜单。 
  3.  */  
  4. public class CommonButton extends Button {  
  5.       
  6.     private String type;  
  7.     private String key;  
  8.     private String url;  
  9.   
  10.   
  11.     public String getType() {  
  12.         return type;  
  13.     }  
  14.   
  15.   
  16.     public void setType(String type) {  
  17.         this.type = type;  
  18.     }  
  19.   
  20.   
  21.     public String getKey() {  
  22.         return key;  
  23.     }  
  24.   
  25.   
  26.     public void setKey(String key) {  
  27.         this.key = key;  
  28.     }  
  29.   
  30.   
  31. public String getUrl() {  
  32. return url;  
  33. }  
  34.   
  35.   
  36. public void setUrl(String url) {  
  37. this.url = url;  
  38. }  
  39.       
  40.       
  41. }  


三:父菜单类


  1. /** 
  2. * 描述: 父菜单项 :包含有二级菜单项的一级菜单。这类菜单项包含有二个属性:name和sub_button,而sub_button以是一个子菜单项数组  
  3.  */  
  4. public class ComplexButton extends Button {  
  5.     private Button[] sub_button;  
  6.   
  7.   
  8.     public Button[] getSub_button() {  
  9.         return sub_button;  
  10.     }  
  11.   
  12.   
  13.     public void setSub_button(Button[] sub_button) {  
  14.         this.sub_button = sub_button;  
  15.     }  
  16. }  


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


  1. import com.fasterxml.jackson.databind.JsonNode;  
  2. import com.fasterxml.jackson.databind.ObjectMapper;  
  3. import com.mote.weixin.entry.Menu;  
  4.   
  5.   
  6. public class MenuUtils {  
  7.   
  8.     private static ObjectMapper MAPPER = new ObjectMapper();  
  9.       
  10.       
  11.     public static int createMenu(Menu menu, String accessToken) throws Exception {  
  12.         int result = 0;  
  13.         // 拼装创建菜单的url  
  14.         String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+accessToken+"";  
  15.         // 将菜单对象转换成json字符串  
  16.         String jsonMenu = MAPPER.writeValueAsString(menu);  
  17.         // 调用接口创建菜单,CommonUtils是上一篇中介绍的内容  
  18.         String resq = CommonUtils.Post_Json(url, jsonMenu);  
  19.           
  20.         JsonNode tree = MAPPER.readTree(resq);  
  21.         if(tree.get("errcode").toString().equals("0")){  
  22.         System.out.println("菜单创建成功!");  
  23.         }else{  
  24.         System.out.println("菜单创建失败!");  
  25.         }  
  26.   
  27.         return result;  
  28.     }  
  29. }  



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

  1. import org.springframework.stereotype.Controller;  
  2.   
  3.   
  4. import com.mote.weixin.entry.Button;  
  5. import com.mote.weixin.entry.CommonButton;  
  6. import com.mote.weixin.entry.ComplexButton;  
  7. import com.mote.weixin.entry.Menu;  
  8. import com.mote.weixin.utils.CommonUtils;  
  9. import com.mote.weixin.utils.MenuUtils;  
  10.   
  11.   
  12. @Controller  
  13. public class MenuController {  
  14.   
  15. public static void main(String[] args) {  
  16.   
  17.   
  18. try {  
  19. // 调用接口获取access_token,CommonUtils是上一篇中的内容  
  20. String accessToken = CommonUtils.getAccessToken();  
  21. // 调用接口创建菜单  
  22. MenuUtils.createMenu(getMenu(), accessToken);  
  23. catch (Exception e) {  
  24. System.out.println("菜单创建失败");  
  25. e.printStackTrace();  
  26. }  
  27.   
  28.   
  29. }  
  30.   
  31.   
  32. /** 
  33. * 组装菜单数据 
  34.  
  35. * @return 
  36. */  
  37. private static Menu getMenu() {  
  38.   
  39.   
  40. CommonButton btn11 = new CommonButton();  
  41. btn11.setName("校园导航");  
  42. btn11.setType("view");  
  43. btn11.setUrl("http://02d73f21.ngrok.io/wx_coges/navi.jsp");  
  44.   
  45.   
  46. CommonButton btn21 = new CommonButton();  
  47. btn21.setName("学校风采");  
  48. btn21.setType("view");  
  49. btn21.setKey("21");  
  50. btn21.setUrl("https://www.baidu.com/");  
  51.   
  52.   
  53. CommonButton btn31 = new CommonButton();  
  54. btn31.setName("健身服务");  
  55. btn31.setType("click");  
  56. btn31.setKey("31");  
  57.   
  58.   
  59. CommonButton btn32 = new CommonButton();  
  60. btn32.setName("爱情咨询");  
  61. btn32.setType("click");  
  62. btn32.setKey("32");  
  63.   
  64.   
  65. /** 
  66. * 微信: mainBtn2,mainBtn3底部的三个一级菜单 
  67. */  
  68.   
  69.   
  70. ComplexButton mainBtn3 = new ComplexButton();  
  71. mainBtn3.setName("更多服务");  
  72. mainBtn3.setSub_button(new CommonButton[] { btn31, btn32});  
  73.   
  74.   
  75. /** 
  76. * 封装整个菜单 
  77. */  
  78. Menu menu = new Menu();  
  79. menu.setButton(new Button[] { btn11, btn21, mainBtn3 });  
  80.   
  81.   
  82. return menu;  
  83. }  
  84.   
  85.   
  86. }  


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

文末福利:

福利一:前端,Java,产品经理,微信小程序,Python等10G资源合集大放送:jianshu.com/p/e8197d4d9

福利二:微信小程序入门与实战全套详细视频教程。


【领取方法】

关注 【编程微刊】微信公众号:

回复【小程序demo】一键领取130个微信小程序源码demo资源。

回复【领取资源】一键领取前端,Java,产品经理,微信小程序,Python等资源合集10G资源大放送。





原文作者:祈澈姑娘
原文链接:jianshu.com/u/05f416aef
创作不易,转载请告知

90后前端妹子,爱编程,爱运营,爱折腾。
坚持总结工作中遇到的技术问题,坚持记录工作中所所思所见,欢迎大家一起探讨交流。




posted @ 2018-03-29 16:43  祈澈姑娘  阅读(483)  评论(0编辑  收藏  举报