zoukankan      html  css  js  c++  java
  • 微信企业号开发:自己定义菜单

    开发微信企业号能够通过程序自己定义菜单。仅仅须要调用相关的接口就能够实现。

    事实上这个菜单也就是微信底部的菜单,眼下自己定义菜单最多包含3个一级菜单,每一个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”取代。事实上创建菜单也非常easy。

    但有一点须要说明,假设有子菜单。那么这个菜单就不会向后端发送事件。比如:我定义了三个一级菜单一个click,两个view。

    假设没有子菜单。则点击click类型的菜单时。后主动向后端发送上报菜单事件,假设有则不会发送上报菜单事件。

    假设没有子菜单,则点击view类型的菜单时,回主动向后端发送点击菜单跳转链接的事件。而且会打开相应的网页。假设有则不会发送点击菜单跳转链接的事件,也不会打开相应的网页


    也就是。假设有子菜单,则这个菜单,就是点击单纯的显示子菜单,不会有其它的动作了。


    比如:


    核心代码菜单相关:

    public enum MenuTypeEnum
        {
            click = 1,
            view = 2,
            scancode_push = 3,
            scancode_waitmsg = 4,
            pic_sysphoto = 5,
            pic_photo_or_album = 6,
            pic_weixin = 7,
            location_select = 8
    
        };
       public abstract class SubButton
        {
            /// <summary>
            /// 菜单的响应动作类型。眼下有click、view两种类型 scancode_push	扫码推事件scancode_waitmsg	扫码推事件且弹出“消息接收中”提示框
            /// </summary>
            public string type { get; protected set; }
            /// <summary>
            /// 菜单标题,不超过16个字节。子菜单不超过40个字节 
            /// </summary>
            public string name { get; set; }
            public List<SubButton> sub_button { get; set; }
            public virtual bool  HasError()
            {
                if (string.IsNullOrEmpty(this.name))
                {
                    LogInfo.Error("菜单名称为空");
                    return true;
                }          
                if (string.IsNullOrEmpty(this.type))
                {
                    LogInfo.Error("菜单类型为空");
                    return true;
                }
                if (sub_button!=null&&sub_button.Count > 0)
                {
                    foreach (SubButton bt in sub_button)
                    {
                        if (bt.HasError())
                        {
                            return true;
                        }
                    }            
                }
                return false;
            }      
            public static SubButton CreateSubButton(MenuTypeEnum type,string name,string key,string url)
            {
                SubButton subButton = null;
                string menuTypeText = GetMenuTypeText(type);
                switch (type)
                {  
                    case MenuTypeEnum.view:
                        subButton = new SubViewButton(menuTypeText,name, url);
                        break;
                    case MenuTypeEnum.click:
                    case MenuTypeEnum.scancode_push:                 
                    case MenuTypeEnum.scancode_waitmsg:                 
                    case MenuTypeEnum.pic_sysphoto:                 
                    case MenuTypeEnum.pic_photo_or_album:                  
                    case MenuTypeEnum.pic_weixin:                
                    case MenuTypeEnum.location_select:
                        subButton = new SubClickButton(menuTypeText, name, key);                
                        break;
                    default:
                        throw new Exception("type=" + type + ",此类型的SubButton没有实现");
    
                }
                return subButton;
            }
            public static MenuTypeEnum GetMenuType(string type)
            {
                MenuTypeEnum text = MenuTypeEnum.click;
                switch (type)
                {
                    case "click":
                        text = MenuTypeEnum.click;
                        break;
                    case "view":
                        text = MenuTypeEnum.view ;
                        break;
                    case "scancode_push":
                        text =MenuTypeEnum.scancode_push ;
                        break;
                    case "scancode_waitmsg":
                        text = MenuTypeEnum.scancode_waitmsg ;
                        break;
                    case  "pic_sysphoto" :
                        text = MenuTypeEnum.pic_sysphoto;
                        break;
                    case "pic_photo_or_album":
                        text = MenuTypeEnum.pic_photo_or_album ;
                        break;
                    case "pic_weixin":
                        text = MenuTypeEnum.pic_weixin ;
                        break;
                    case "location_select":
                        text =MenuTypeEnum.location_select ;
                        break;
                    default:
                        throw new Exception("type=" + type + ",此类型的MenuTypeEnum没有找到");
    
                }
                return text;
            }
            public static string GetMenuTypeText(MenuTypeEnum type)
            {
                string text = "";
                switch (type)
                {
                    case MenuTypeEnum.click:
                        text = "click";
                        break;
                    case MenuTypeEnum.view:
                        text = "view";
                        break;
                    case MenuTypeEnum.scancode_push:
                        text = "scancode_push";
                        break;
                    case MenuTypeEnum.scancode_waitmsg:
                        text = "scancode_waitmsg";
                        break;
                    case MenuTypeEnum.pic_sysphoto:
                        text = "pic_sysphoto";
                        break;
                    case MenuTypeEnum.pic_photo_or_album:
                        text = "pic_photo_or_album";
                        break;
                    case MenuTypeEnum.pic_weixin:
                        text = "pic_weixin";
                        break;
                    case MenuTypeEnum.location_select:
                        text = "location_select";
                        break;
                    default:
                        throw new Exception("type=" + type + ",此类型的MenuTypeEnum没有实现");
    
                }
                return text;
            }
        }
       public class SubClickButton : SubButton
       {
           public SubClickButton(string type,string name,string key)
           {
               this.type = type;
               this.name = name;
               this.key = key;
           }
           /// <summary>
           /// 菜单KEY值,用于消息接口推送,不超过128字节 
           /// </summary>
           public string key { get; set; }
           public override bool HasError()
           {         
               if (string.IsNullOrEmpty(this.key))
               {
                   LogInfo.Error("菜单key为空");
                   return true;
               }         
               return base.HasError();
           } 
       }
       public class SubViewButton : SubButton
       {
           public SubViewButton(string type, string name, string url)
           {
               this.type = type;
               this.name = name;
               this.url = url;
           }
           /// <summary>
           /// 成员点击view类型按钮后。微信client将会打开开发人员在按钮中填写的网页URL,可与网页授权获取成员基本信息接口结合,获得成员基本信息。
           /// </summary>
           public string url { get; set; }
           public override bool HasError()
           {
               if (string.IsNullOrEmpty(this.url))
               {
                   LogInfo.Error("菜单url为空");
                   return true;
               }
               return base.HasError();         
           } 
       }
    

     /// <summary>
        /// 自己定义菜单
        /// </summary>
       public class Menu
        {
           public List<SubButton> button { get; set; }
           public virtual bool HasError()
           {
               if (button.Count >= 4)
               {
                   LogInfo.Error("最多包含3个一级菜单");
                   return true;
               }
               foreach(SubButton bt in button)
               {
                   if (bt.HasError())
                   {
                       return true;
                   }              
               }
               return false;
           }   
        }

    加入改动,删除菜单

    public class BLLMenu
        {
    
           /// <summary>
           /// 
           /// </summary>
           /// <param name="info"></param>
            /// <param name="agentid">企业应用的id。整型。可在应用的设置页面查看</param>
           /// <returns></returns>
            public static bool Create(Menu info, int agentid)
            {
                if (info.HasError())
                {
                    return false;
                }
                string urlFormat = "https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token={0}&agentid={1}";
                var url = string.Format(urlFormat, BLLAccessToken.GetAccessToken(), agentid);
                WebUtils wut = new WebUtils();
                var postData = Tools.ToJsonString<Menu>(info);
                //数据不用加密发送  
                LogInfo.Info("创建应用菜单消息: " + postData);
                string sendResult = wut.DoPost(url, postData);
                ReturnResult tempAccessTokenjson = Tools.JsonStringToObj<ReturnResult>(sendResult);
                if (tempAccessTokenjson.HasError())
                {
                    LogInfo.Error("发送创建应用菜单返回错误: " + Tools.ToJsonString<ReturnResult>(tempAccessTokenjson));
                    return false;
                }
             
                return true;
            }
           /// <summary>
           /// 
           /// </summary>
            /// <param name="agentid">企业应用的id,整型。可在应用的设置页面查看</param>
           /// <returns></returns>
            public static bool DelAll(int agentid)
            {
                string urlFormat = "https://qyapi.weixin.qq.com/cgi-bin/menu/delete?access_token={0}&agentid={1}";
                var url = string.Format(urlFormat, BLLAccessToken.GetAccessToken(), agentid);
                WebUtils wut = new WebUtils();
    
                //数据不用加密发送  
                LogInfo.Info("发送删除菜单消息: " + url);
                string sendResult = wut.DoGet(url);
                ReturnResult tempAccessTokenjson = Tools.JsonStringToObj<ReturnResult>(sendResult);
                if (tempAccessTokenjson.HasError())
                {
                    LogInfo.Error("发送删除菜单返回错误: " + Tools.ToJsonString<ReturnResult>(tempAccessTokenjson));
                    return false;
                }
           
                return true;
            }
            public static bool GetAll(int agentid)
            {
                string urlFormat = "https://qyapi.weixin.qq.com/cgi-bin/menu/get?

    access_token={0}&agentid={1}"; var url = string.Format(urlFormat, BLLAccessToken.GetAccessToken(), agentid); WebUtils wut = new WebUtils(); //数据不用加密发送 LogInfo.Info("发送获取菜单列表消息: " + url); string sendResult = wut.DoGet(url); MenuListResult tempAccessTokenjson = Tools.JsonStringToObj<MenuListResult>(sendResult); if (tempAccessTokenjson.HasError()) { LogInfo.Error("发送获取菜单列表返回错误: " + Tools.ToJsonString<MenuListResult>(tempAccessTokenjson)); return false; } return true; } }


    測试代码

     private void button7_Click(object sender, EventArgs e)
            {
    		///測试加入
                ConmonWeixin.MenuInfo.Menu info = new ConmonWeixin.MenuInfo.Menu();
                SubButton subbt1 = SubButton.CreateSubButton(MenuTypeEnum.click, "Click1", "Click1", "");          
                subbt1.sub_button = new List<SubButton>();
                SubButton bt11 = SubButton.CreateSubButton(MenuTypeEnum.scancode_push, "codePush2", "CancodePushButton11", "");
                SubButton bt12 = SubButton.CreateSubButton(MenuTypeEnum.scancode_waitmsg, "codeWaitmsg2", "CancodeWaitmsgButton12", "");
                SubButton bt13 = SubButton.CreateSubButton(MenuTypeEnum.click, "Click12", "Click12", "");
                SubButton bt14 = SubButton.CreateSubButton(MenuTypeEnum.view, "V2级", "V22", "https://www.baidu.com"); 
                subbt1.sub_button.Add(bt11);
                subbt1.sub_button.Add(bt12);
                subbt1.sub_button.Add(bt13);
                subbt1.sub_button.Add(bt14);
                SubButton subbt2 = SubButton.CreateSubButton(MenuTypeEnum.view, "V1级", "", "www.baidu.com");            
                subbt2.sub_button = new List<SubButton>();
                SubButton bt21 = SubButton.CreateSubButton(MenuTypeEnum.pic_sysphoto, "PicSysphoto", "PicSysphotoButton21", "");
    
                SubButton bt22 = SubButton.CreateSubButton(MenuTypeEnum.pic_photo_or_album, "photoalbum2", "PicSysphotoButton22", "");           
                subbt2.sub_button.Add(bt21);
                subbt2.sub_button.Add(bt22);
    
                SubButton subbt3 = SubButton.CreateSubButton(MenuTypeEnum.view, "V1级", "", "http://hlogin.html");          
                subbt3.sub_button = new List<SubButton>();
                SubButton bt31 = SubButton.CreateSubButton(MenuTypeEnum.pic_weixin, "pic_weixin2", "Subpic_weixinButton31", "");
    
                SubButton bt32 = SubButton.CreateSubButton(MenuTypeEnum.location_select, "location_selec", "location_selec32", "");
                subbt3.sub_button.Add(bt31);
                subbt3.sub_button.Add(bt32);
    
                info.button = new List<SubButton>();
                info.button.Add(subbt1);
                info.button.Add(subbt2);
                info.button.Add(subbt3);
                BLLMenu.Create(info,7);
              //  Menu info, int agentid
            }
    
            private void button8_Click(object sender, EventArgs e)
            {
    		//測试删除
                BLLMenu.DelAll(7);
            }

    创建应用菜单官方文档

    菜单接收事件官方文档

  • 相关阅读:
    Django之信号
    Django缓存
    git简介
    Django request.path
    Django loaction.pathname 属性
    Ajax
    Anaconda 执行命令报ssl错误
    几行代码快速去掉迅雷临时文件的后缀
    win7 64 位安装 python,提示: 0x80240017-未指定的错误
    系统变量 %USERPROFILE%
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7261297.html
Copyright © 2011-2022 走看看