在《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