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


    原文: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后前端妹子,爱编程,爱运营,爱折腾。
    坚持总结工作中遇到的技术问题,坚持记录工作中所所思所见,欢迎大家一起探讨交流。




  • 相关阅读:
    小能客服
    bootstrap 字体图标
    在线绘图(PS)(海报)
    UI教程
    免费在线设计网站
    测量史上首个易语言工程测量模块
    在ado.net中实现oracle存储过程调用两种方式
    VS一些快捷键
    解决Win10家庭版没有‘本地用户和组’问题
    参照示例搭建一个Quertz + Topshelf的一个作业调度服务(基础)
  • 原文地址:https://www.cnblogs.com/wangting888/p/9701601.html
Copyright © 2020-2023  润新知