Senparc.Weixin.MP SDK 微信公眾平臺開發教程(二十):使用選單訊息功能

SZW發表於2019-03-09

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

  1. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(一):微信公眾平臺註冊
  2. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(二):成為開發者
  3. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(三):微信公眾平臺開發驗證
  4. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(四):Hello World
  5. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(五):使用Senparc.Weixin.MP SDK
  6. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(六):瞭解MessageHandler
  7. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(七):解決使用者上下文(Session)問題
  8. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(八):通用介面說明
  9. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(九):自定義選單介面說明
  10. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十):多客服介面說明
  11. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十一):高階介面說明
  12. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十二):OAuth2.0說明
  13. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十三):地圖相關介面說明
  14. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十四):請求訊息去重
  15. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十五):訊息加密
  16. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十六):AccessToken自動管理機制
  17. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十七):個性化選單介面說明
  18. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十八):Web代理功能
  19. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十九):MessageHandler 的未知型別訊息處理
  20. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(二十):使用選單訊息功能

相關文章