在《Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明》教程中,咱们介绍了如何使用“客服接口”,即在服务器后台,在任意时间向微信发送文本、图文、图片等不一样类型的消息,在这篇教程中你将学会如何向公众号发送一条带有选择按钮的菜单消息,而且当用户点击不一样选项以后,服务器给出不一样的回应。html
首先,咱们来看一下菜单消息长什么样子:git
(图一)github
点击不一样的选项,系统会返回不一样的消息:web
(图二)小程序
请注意:上图中的“满意”和“通常”是点击消息中的“满意”和“通常”以后自动发送的,而不是手动输入文字,若是是手动输入文字,系统将不会识别:服务器
下面,咱们来动手进行代码编写。微信
发送菜单消息的代码以下:websocket
1 var menuContentList = new List<SendMenuContent>(){ 2 new SendMenuContent("s:101","满意"), 3 new SendMenuContent("s:102","通常"), 4 new SendMenuContent("s:103","不满意") 5 }; 6 //使用异步接口 7 CustomApi.SendMenuAsync(appId, OpenId, "请对 Senparc.Weixin SDK 给出您的评价", menuContentList, "感谢您的参与!"); 8
以上代码能够添加在程序的任意地方,用户均可收到消息(固然须要符合客服消息的发送限制,如“48小时互动限制”)。网络
一般,咱们会在菜单事件中添加反馈的按钮,此时上述代码能够加入到 MessageHandler 的 OnTextOrEventRequest() 或 OnEvent_ClickRequest() 等其余须要出发发送菜单消息的事件中,例如(源码):app
1 /// <summary> 2 /// 点击事件 3 /// </summary> 4 /// <param name="requestMessage">请求消息</param> 5 /// <returns></returns> 6 public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) 7 { 8 IResponseMessageBase reponseMessage = null; 9 //菜单点击,须要跟建立菜单时的Key匹配 10 11 switch (requestMessage.EventKey) 12 { 13 //其余 case 14 case "SendMenu": 15 { 16 //注意: 17 //一、此接口能够在任意地方调用(包括后台线程),此处演示为经过 18 //二、一下"s:"前缀只是 Senparc.Weixin 的内部约定,可使用 OnTextRequest事件中的 requestHandler.SelectMenuKeyword() 方法自动匹配到后缀(如101) 19 20 var menuContentList = new List<SendMenuContent>(){ 21 new SendMenuContent("s:101","满意"), 22 new SendMenuContent("s:102","通常"), 23 new SendMenuContent("s:103","不满意") 24 }; 25 //使用异步接口 26 CustomApi.SendMenuAsync(appId, OpenId, "请对 Senparc.Weixin SDK 给出您的评价", menuContentList, "感谢您的参与!"); 27 28 reponseMessage = new ResponseMessageNoResponse();//不返回任何消息 29 } 30 break; 31 //其余代码 32 } 33 34 return reponseMessage; 35 }
执行上述代码后,便可看到图一的反馈。
菜单消息被点击后(如图二),使用的是普通文本消息发送,只不过菜单的id(如上述代码的“s:101”)会被放到一个独立的属性中一块儿发送,Senparc.Weixin SDK 就是靠这些特征来区分文字类型消息是否属于菜单消息。所以,咱们在 OnTextOrEventRequest() 或 OnTextRequest() 方法中加入如下判断(源码):
1 /// <summary> 2 /// 处理文字请求 3 /// </summary> 4 /// <param name="requestMessage">请求消息</param> 5 /// <returns></returns> 6 public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) 7 { 8 var defaultResponseMessage = base.CreateResponseMessage<ResponseMessageText>(); 9 10 var requestHandler = 11 requestMessage.StartHandler() 12 //选择菜单,关键字:101(微信服务器端最终格式:id="s:101",content="满意") 13 .SelectMenuKeyword("101", () => 14 { 15 defaultResponseMessage.Content = $"感谢您的评价({requestMessage.Content})!咱们会一如既往为提升企业和开发者生产力而努力!"; 16 return defaultResponseMessage; 17 }) 18 //选择菜单,关键字:102(微信服务器端最终格式:id="s:102",content="通常") 19 .SelectMenuKeyword("102", () => 20 { 21 defaultResponseMessage.Content = $"感谢您的评价({requestMessage.Content})!但愿咱们的服务能让您愈来愈满意!"; 22 return defaultResponseMessage; 23 }) 24 //选择菜单,关键字:103(微信服务器端最终格式:id="s:103",content="不满意") 25 .SelectMenuKeyword("103", () => 26 { 27 defaultResponseMessage.Content = $"感谢您的评价({requestMessage.Content})!但愿咱们的服务能让您愈来愈满意!"; 28 return defaultResponseMessage; 29 }) 30 .SelectMenuKeywords(new[] { "110", "111" }, () => 31 { 32 defaultResponseMessage.Content = $"这里只是演示,能够同时支持多个选择菜单"; 33 return defaultResponseMessage; 34 }) 35 36 //Default不必定要在最后一个 37 .Default(() => 38 { 39 defaultResponseMessage.Content = "未做处理的消息。"; 40 41 return defaultResponseMessage; 42 }); 43 44 return requestHandler.GetResponseMessage(); 45 }
上述代码中,requestMessage.StartHandler() 用于建立一个文本处理工具,可用于判断文字关键字等,其中的 .SelectMenuKeyword() 和 SelectMenuKeywords() 方法分别用于匹配一个或多个菜单消息的关键字,其格式是"s:101"中的"101",前缀“s:”做为一个 SDK 内部约定的标识会被忽略。固然,若是你须要判断完整的菜单消息 id,能够经过 requestMessage.bizmsgmenuid 直接获取到"s:101"。
发布上述代码后,便可实现针对不一样菜单消息 id 的消息返回,能够扩展到各类场景,快试试吧!
以上功能能够经过关注【盛派网络小助手】公众号,点击菜单【更多】>【发送菜单】进行测试。
地址:http://www.cnblogs.com/szw/p/weixin-course-index.html