前面几篇陆续介绍了很多微信企业号的相关操作,企业号和公众号一样都可以自定义菜单,因此他们也可以通过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

请求包如下:

  1. {
  2. "button":[
  3. {
  4. "type":"click",
  5. "name":"今日歌曲",
  6. "key":"V1001_TODAY_MUSIC"
  7. },
  8. {
  9. "name":"菜单",
  10. "sub_button":[
  11. {
  12. "type":"view",
  13. "name":"搜索",
  14. "url":"http://www.soso.com/"
  15. },
  16. {
  17. "type":"click",
  18. "name":"赞一下我们",
  19. "key":"V1001_GOOD"
  20. }
  21. ]
  22. }
  23. ]
  24. }
  • 参数说明
参数 必须 说明
access_token 调用接口凭证
agentid 企业应用的id,整型。可在应用的设置页面查看
button 一级菜单数组,个数应为1~3个
sub_button 二级菜单数组,个数应为1~5个
type 菜单的响应动作类型,目前有click、view两种类型
name 菜单标题,不超过16个字节,子菜单不超过40个字节
key click类型必须 菜单KEY值,用于消息接口推送,不超过128字节
url view类型必须 网页链接,员工点击菜单可打开链接,不超过256字节
  • 权限说明

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

返回结果

  1. {
  2. "errcode":0,
  3. "errmsg":"ok"
  4. }

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

  1. /// <summary>
  2. /// 企业号菜单管理接口定义
  3. /// </summary>
  4. public interface ICorpMenuApi
  5. {
  6. /// <summary>
  7. /// 获取菜单数据
  8. /// </summary>
  9. /// <param name="accessToken">调用接口凭证</param>
  10. /// <returns></returns>
  11. MenuListJson GetMenu(string accessToken, string agentid);
  12.  
  13. /// <summary>
  14. /// 创建菜单
  15. /// </summary>
  16. /// <param name="accessToken">调用接口凭证</param>
  17. /// <param name="menuJson">菜单对象</param>
  18. /// <returns></returns>
  19. CommonResult CreateMenu(string accessToken, MenuListJson menuJson, string agentid);
  20.  
  21. /// <summary>
  22. /// 删除菜单
  23. /// </summary>
  24. /// <param name="accessToken">调用接口凭证</param>
  25. /// <returns></returns>
  26. CommonResult DeleteMenu(string accessToken, string agentid);
  27. }

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

  1. /// <summary>
  2. /// 创建菜单
  3. /// </summary>
  4. /// <param name="accessToken">调用接口凭证</param>
  5. /// <param name="menuJson">菜单对象</param>
  6. /// <returns></returns>
  7. public CommonResult CreateMenu(string accessToken, MenuListJson menuJson, string agentid)
  8. {
  9. var url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token={0}&agentid={1}", accessToken, agentid);
  10. string postData = menuJson.ToJson();
  11.  
  12. return Helper.GetCorpExecuteResult(url, postData);
  13. }

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

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

  1. private void btnMenuCreate_Click(object sender, EventArgs e)
  2. {
  3. MenuJson productInfo = new MenuJson("产品介绍", new MenuJson[] {
  4. new MenuJson("软件产品介绍", ButtonType.click, "event-software")
  5. , new MenuJson("框架源码产品", ButtonType.click, "event-source")
  6. , new MenuJson("软件定制开发", ButtonType.click, "event-develop")
  7. });
  8.  
  9. MenuJson frameworkInfo = new MenuJson("框架产品", new MenuJson[] {
  10. new MenuJson("Win开发框架", ButtonType.click, "win"),
  11. new MenuJson("WCF开发框架", ButtonType.click, "wcf"),
  12. new MenuJson("混合式框架", ButtonType.click, "mix"),
  13. new MenuJson("Web开发框架", ButtonType.click, "web")
  14. ,new MenuJson("代码生成工具", ButtonType.click, "database2sharp")
  15. });
  16.  
  17. MenuJson relatedInfo = new MenuJson("相关链接", new MenuJson[] {
  18. new MenuJson("公司介绍", ButtonType.click, "event_company"),
  19. new MenuJson("官方网站", ButtonType.view, "http://www.iqidi.com"),
  20. new MenuJson("联系我们", ButtonType.click, "event_contact"),
  21. new MenuJson("应答系统", ButtonType.click, "set-1"),
  22. new MenuJson("发邮件", ButtonType.view, "http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=S31yfX15fn8LOjplKCQm")
  23. });
  24.  
  25. MenuListJson menuJson = new MenuListJson();
  26. menuJson.button.AddRange(new MenuJson[] { productInfo, frameworkInfo, relatedInfo });
  27.  
  28. //Console.WriteLine(menuJson.ToJson());
  29.  
  30. if (MessageUtil.ShowYesNoAndWarning("您确认要创建菜单吗") == System.Windows.Forms.DialogResult.Yes)
  31. {
  32. ICorpMenuApi bll = new CorpMenuApi();
  33. CommonResult result = bll.CreateMenu(token, menuJson, agentid);
  34. Console.WriteLine("创建菜单:" + (result.Success ? "成功" : "失败:" + result.ErrorMessage));
  35. }
  36. }
  37.  
  38. private void btnMenuGet_Click(object sender, EventArgs e)
  39. {
  40. ICorpMenuApi bll = new CorpMenuApi();
  41. MenuListJson menu = bll.GetMenu(token, agentid);
  42. if (menu != null)
  43. {
  44. Console.WriteLine(menu.ToJson());
  45. }
  46. }

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

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

C#开发微信门户及应用(25)-微信企业号的客户端管理功能

C#开发微信门户及应用(24)-微信小店货架信息管理

C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试

C#开发微信门户及应用(22)-微信小店的开发和使用

C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密

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

C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)

C#开发微信门户及应用(18)-微信企业号的通讯录管理开发之成员管理

C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理

C#开发微信门户及应用(16)-微信企业号的配置和使用

C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

C#开发微信门户及应用(13)-使用地理位置扩展相关应用

C#开发微信门户及应用(12)-使用语音处理

C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍

C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息

C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器

C#开发微信门户及应用(8)-微信门户应用管理系统功能介绍

C#开发微信门户及应用(7)-微信多客服功能及开发集成

C#开发微信门户及应用(6)--微信门户菜单的管理操作

C#开发微信门户及应用(5)--用户分组信息管理

C#开发微信门户及应用(4)--关注用户列表及详细信息管理

C#开发微信门户及应用(3)--文本消息和图文消息的应答

C#开发微信门户及应用(2)--微信消息的处理和应答

C#开发微信门户及应用(1)--开始使用微信接口

C#开发微信门户及应用(20)-微信企业号的菜单管理的更多相关文章

  1. C#开发微信门户及应用(25)-微信企业号的客户端管理功能

    我们知道,微信公众号和企业号都提供了一个官方的Web后台,方便我们对微信账号的配置,以及相关数据的管理功能,对于微信企业号来说,有通讯录中的组织架构管理.标签管理.人员管理.以及消息的发送等功能,其中 ...

  2. C#开发微信门户及应用(38)--微信摇一摇红包功能

    摇一摇周边红包接口是为线下商户提供的发红包功能.用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包.我曾经在<C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实 ...

  3. C#开发微信门户及应用(37)--微信公众号标签管理功能

    微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能.开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建.查询.修改.删除等操作, ...

  4. C#开发微信门户及应用(36)--微信卡劵管理的封装操作

    前面几篇介绍了微信支付方面的内容,本篇继续微信接口的一些其他方面的内容:卡劵管理.卡劵管理是微信接口里面非常复杂的一个部分,里面的接口非常多,我花了不少时间对它进行了封装处理,重构优化等等工作,卡劵在 ...

  5. C#开发微信门户及应用(35)--微信支付之企业付款封装操作

    在前面几篇随笔,都是介绍微信支付及红包相关的内容,其实支付部分的内容还有很多,例如企业付款.公众号支付或刷卡支付.摇一摇红包.代金券等方面的内容,这些都是微信接口支持的内容,本篇继续微信支付这一主题, ...

  6. C#开发微信门户及应用(34)--微信裂变红包

    在上篇随笔<C#开发微信门户及应用(33)--微信现金红包的封装及使用>介绍了普通现金红包的封装和使用,这种红包只能单独一次发给一个人,用户获取了红包就完成了,如果我们让用户收到红包后,可 ...

  7. C#开发微信门户及应用(33)--微信现金红包的封装及使用

    我在上篇随笔<C#开发微信门户及应用(32)--微信支付接入和API封装使用>介绍为微信支付的API封装及使用,其中介绍了如何配置好支付环境,并对扫码支付的两种方式如何在C#开发中使用进行 ...

  8. C#开发微信门户及应用(32)--微信支付接入和API封装使用

    在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去,微信支付旨在为广大微信用户及商户提供更优质的支付服务,微信的支付 ...

  9. C#开发微信门户及应用(27)-公众号模板消息管理

    通过模板消息接口,公众号能向关注其账号的用户发送预设模板的消息.模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等.不支持广告等营销类消 ...

随机推荐

  1. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  2. Android—万能ListView适配器

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...

  3. Java 进阶 hello world! - 中级程序员之路

    Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...

  4. 简历生成平台项目开发-STEP1问卷设计

    周五课程结束完后,小组建立QQ群和微信群,着手讨论项目问题.一开始的大概想法:就业信息平台,收集企业招聘信息和就业生资料,提供给学生和企业的校企对接平台.后来发现群里谭卓同学也有个相关的思路,经过商量 ...

  5. SpringMvc中初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...

  6. linux下mono,powershell安装教程

    1简介 简单来说pash就是bash+powershell 2官网 https://github.com/Pash-Project/Pash 3下载fedora20---lxde桌面---32位版. ...

  7. Xamarin. Android实现下拉刷新功能

    PS:发现文章被其他网站或者博客抓取后发表为原创了,给图片加了个水印 下拉刷新功能在安卓和iOS中非常常见,一般实现这样的功能都是直接使用第三方的库,网上能找到很多这样的开源库.然而在Xamarin. ...

  8. 在rem布局下使用背景图片以及sprite

    现在移动端页面用rem布局已经是一大流派了,成熟的框架如淘宝的flexiable.js,以及我的好友@墨尘写的更轻量级的hotcss.用rem作单位使得元素能够自适应后,还有一块需要关注的,那就是背景 ...

  9. 将mvc2升级到mvc4

    万万没想到大二时候参加中国大学生计算机大赛的一个项目正是当前项目所需! 时间紧任务重,还好之前的项目稍微改改即可交付使用,但是还是缺少一些功能模块,巧合的是,缺少的这个功能模块是今年刚刚完成的基于mv ...

  10. Entity Framework 6 Recipes 2nd Edition(13-7)译 -> 返回只部分填充的实体

    问题 你有一个实体里的某个属性很少被读取或和更新,这个属性因为比较大,所以读取和更新都需要付很大的代价.你想有选择的放置这个属性 解决方案 假设你有一个如Figure 13-9 所示的模型 Figur ...