在《Senparc.Weixin.MP SDK 微信公眾平台開發教程(十一):高級接口說明》教程中,我們介紹了如何使用“客服接口”,即在服務器后台,在任意時間向微信發送文本、圖文、圖片等不同類型的消息,在這篇教程中你將學會如何向公眾號發送一條帶有選擇按鈕的菜單消息,並且當用戶點擊不同選項之后,服務器給出不同的回應。
首先,我們來看一下菜單消息長什么樣子:

(圖一)
點擊不同的選項,系統會返回不同的消息:

(圖二)
請注意:上圖中的“滿意”和“一般”是點擊消息中的“滿意”和“一般”之后自動發送的,而不是手動輸入文字,如果是手動輸入文字,系統將不會識別:

下面,我們來動手進行代碼編寫。
第一步:發送菜單消息
發送菜單消息的代碼如下:
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() 等其他需要出發發送菜單消息的事件中,例如(源碼):
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 //1、此接口可以在任意地方調用(包括后台線程),此處演示為通過 18 //2、一下"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
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(一):微信公眾平台注冊
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(二):成為開發者
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(三):微信公眾平台開發驗證
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(四):Hello World
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(五):使用Senparc.Weixin.MP SDK
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(六):了解MessageHandler
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(七):解決用戶上下文(Session)問題
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(八):通用接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(九):自定義菜單接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十):多客服接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十一):高級接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十二):OAuth2.0說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十三):地圖相關接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十四):請求消息去重
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十五):消息加密
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十六):AccessToken自動管理機制
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十七):個性化菜單接口說明
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十八):Web代理功能
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(十九):MessageHandler 的未知類型消息處理
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(二十):使用菜單消息功能
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(二十一):在小程序中使用 WebSocket (.NET Core)
- Senparc.Weixin.MP SDK 微信公眾平台開發教程(二十二):如何安裝 Nuget(dll) 后使用項目源代碼調試
