C#开发微信门户及应用(20)-微信企业号的菜单管理

前面几篇陆续介绍了很多微信企业号的相关操作,企业号和公众号一样都可以自定义菜单,因此他们也可以通过API进行菜单的创建、获取列表、删除的操作,因此本篇继续探讨这个主体,介绍企业号的菜单管理操作。
菜单在很多情况下,能够给我们提供一个快速入口,也可以用来获取用户信息的主要入口,通过OAuth2验证接口,以及自定义的重定向菜单,我们就可以获取对应的用户ID,然后进一步获取到用户的相关数据,可以显示给客户。

1、菜单的总体介绍

菜单的事件处理如下所示,包括了单击和跳转两个操作,未来企业号可能会增加一些和公众号一样的扫码操作,拍照操作等功能的,目前只有两个。



官方的菜单定义接口包含了下面三种操作,菜单创建、列表获取和菜单删除,这点和公众号操作几乎一样了。


2、菜单的实体类定义和接口定义处理

我们定义菜单,包括定义它的一些属性,包含有name, type, key,url,以及一个指向自身引用的子菜单引用,因此菜单就可以循环构造多个层次,虽然严格意义上来讲,企业号的菜单和公众号菜单一样,一级三个,二级最多五个,而且没有三级菜单了。
实体类的UML图示如下所示。



菜单管理的创建操作,官方定义如下所示。
请求说明

Https请求方式: POST
https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN&agentid=1
请求包如下:

{
   "button":[
       {    
           "type":"click",
           "name":"今日歌曲",
           "key":"V1001_TODAY_MUSIC"
       },
       {
           "name":"菜单",
           "sub_button":[
               {
                   "type":"view",
                   "name":"搜索",
                   "url":"http://www.soso.com/"
               },
               {
                   "type":"click",
                   "name":"赞一下我们",
                   "key":"V1001_GOOD"
               }
           ]
      }
   ]
}

参数说明

权限说明

管理员须拥有应用的管理权限,并且应用必须设置在回调模式。
返回结果

{ "errcode":0, "errmsg":"ok"}

根据上面官方的定义语义,我们菜单管理的C#管理接口定义如下所示。

/// <summary>
/// 企业号菜单管理接口定义
/// </summary>
public interface ICorpMenuApi
{
    /// <summary>
    /// 获取菜单数据
    /// </summary>
    /// <param name="accessToken">调用接口凭证</param>
    /// <returns></returns>
    MenuListJson GetMenu(string accessToken, string agentid);

    /// <summary>
    /// 创建菜单
    /// </summary>
    /// <param name="accessToken">调用接口凭证</param>
    /// <param name="menuJson">菜单对象</param>
    /// <returns></returns>
    CommonResult CreateMenu(string accessToken, MenuListJson menuJson, string agentid);

    /// <summary>
    /// 删除菜单
    /// </summary>
    /// <param name="accessToken">调用接口凭证</param>
    /// <returns></returns>
    CommonResult DeleteMenu(string accessToken, string agentid);
}

我们以创建菜单的实现为例来介绍微信企业号菜单的操作,其他的操作类似处理,都是返回一个公共的消息类,方便处理和读取,代码如下所示。

/// <summary>
/// 创建菜单
/// </summary>
/// <param name="accessToken">调用接口凭证</param>
/// <param name="menuJson">菜单对象</param>
/// <returns></returns>
public CommonResult CreateMenu(string accessToken, MenuListJson menuJson, string agentid)
{
    var url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token={0}&agentid={1}", accessToken, agentid);
    string postData = menuJson.ToJson();

    return Helper.GetCorpExecuteResult(url, postData);
}

3、企业号菜单管理接口的调用和处理效果

调用的代码和效果图如下所示。

private void btnMenuCreate_Click(object sender, EventArgs e)
{
    MenuJson productInfo = new MenuJson("产品介绍", new MenuJson[] { 
        new MenuJson("软件产品介绍", ButtonType.click, "event-software")
        , new MenuJson("框架源码产品", ButtonType.click, "event-source")
        , new MenuJson("软件定制开发", ButtonType.click, "event-develop")
    });

    MenuJson frameworkInfo = new MenuJson("框架产品", new MenuJson[] { 
        new MenuJson("Win开发框架", ButtonType.click, "win"),
        new MenuJson("WCF开发框架", ButtonType.click, "wcf"),
        new MenuJson("混合式框架", ButtonType.click, "mix"), 
        new MenuJson("Web开发框架", ButtonType.click, "web")
        ,new MenuJson("代码生成工具", ButtonType.click, "database2sharp")
    });

    MenuJson relatedInfo = new MenuJson("相关链接", new MenuJson[] { 
        new MenuJson("公司介绍", ButtonType.click, "event_company"),
        new MenuJson("官方网站", ButtonType.view, "http://www.iqidi.com"),
        new MenuJson("联系我们", ButtonType.click, "event_contact"),
        new MenuJson("应答系统", ButtonType.click, "set-1"),    
        new MenuJson("发邮件", ButtonType.view, "http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=S31yfX15fn8LOjplKCQm")
    });

    MenuListJson menuJson = new MenuListJson();
    menuJson.button.AddRange(new MenuJson[] { productInfo, frameworkInfo, relatedInfo });

    //Console.WriteLine(menuJson.ToJson());

    if (MessageUtil.ShowYesNoAndWarning("您确认要创建菜单吗") == System.Windows.Forms.DialogResult.Yes)
    {
        ICorpMenuApi bll = new CorpMenuApi(); 
        CommonResult result = bll.CreateMenu(token, menuJson, agentid);
        Console.WriteLine("创建菜单:" + (result.Success ? "成功" : "失败:" + result.ErrorMessage));
    }
}

private void btnMenuGet_Click(object sender, EventArgs e)
{
    ICorpMenuApi bll = new CorpMenuApi();
    MenuListJson menu = bll.GetMenu(token, agentid);
    if (menu != null)
    {
        Console.WriteLine(menu.ToJson());
    }
}

调用代码的测试输出如下所示。


如果对这个《C#开发微信门户及应用》系列感兴趣,可以关注我的其他文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容