Senparc.Weixin.MP SDK 微信公眾平台開發教程(十七):個性化菜單接口說明


  前不久微信上線了個性化菜單接口,Senparc.Weixin SDK也已經同步更新。

  本次更新升級Senparc.Weixin.MP版本到v13.5.2,依賴Senparc.Weixin版本4.5.4。.NET4.5(master) / .NET4.0兩個分支都已同步更新。

  由於個性化菜單變化比較大,所以對整個菜單接口進行了目前為止最大面積的重構(可以向下兼容)。

  相比之前的自定義菜單,目前整個菜單相關功能針對文件結構進行了全面的整理,:

 

接口

  菜單接口已經全部歸入CommonAPIs/Menu目錄下,CommonApi部分類下面再分出3個類文件:

 
文件名 說明
CommonApi.Menu.Common.cs 菜單公共方法
CommonApi.Menu.Conditional.cs 個性化菜單
CommonApi.Menu.Custom.cs 普通自定義菜單

菜單接口文件

  其中自定義菜單接口已經確保向下兼容,以前如果有已經開發自定義菜單功能的項目,可以放心升級。

  個性化菜單類內容如下:

 1 /*----------------------------------------------------------------
 2     Copyright (C) 2015 Senparc
 3     
 4     文件名:CommonApi.Menu.Conditional
 5     文件功能描述:個性化自定義菜單接口
 6     
 7     
 8     創建標識:Senparc - 20151222
 9         
10     修改標識:Senparc - 20151222
11     修改描述:v13.5.1 添加個性化菜單接口
12 ----------------------------------------------------------------*/
13 
14 /*
15     API:http://mp.weixin.qq.com/wiki/0/c48ccd12b69ae023159b4bfaa7c39c20.html
16  */
17 
18 using Senparc.Weixin.Entities;
19 using Senparc.Weixin.Helpers;
20 using Senparc.Weixin.MP.Entities;
21 using Senparc.Weixin.MP.Entities.Menu;
22 
23 namespace Senparc.Weixin.MP.CommonAPIs
24 {
25     public partial class CommonApi
26     {
27         /// <summary>
28         /// 創建個性化菜單
29         /// </summary>
30         /// <param name="accessTokenOrAppId">AccessToken或AppId。當為AppId時,如果AccessToken錯誤將自動獲取一次。當為null時,獲取當前注冊的第一個AppId。</param>
31         /// <param name="buttonData">菜單內容</param>
32         /// <returns></returns>
33         public static CreateMenuConditionalResult CreateMenuConditional(string accessTokenOrAppId, ConditionalButtonGroup buttonData, int timeOut = Config.TIME_OUT)
34         {
35             return ApiHandlerWapper.TryCommonApi(accessToken =>
36              {
37                  var urlFormat = "https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token={0}";
38                  var jsonSetting = new JsonSetting(true);
39                  return CommonJsonSend.Send<CreateMenuConditionalResult>(accessToken, urlFormat, buttonData, timeOut: timeOut, jsonSetting: jsonSetting);
40 
41              }, accessTokenOrAppId);
42         }
43 
44 
45         #region GetMenu
46 
47         /* 使用普通自定義菜單查詢接口可以獲取默認菜單和全部個性化菜單信息,請見自定義菜單查詢接口的說明 */
48 
49         /// <summary>
50         /// 測試個性化菜單匹配結果
51         /// </summary>
52         /// <param name="accessTokenOrAppId"></param>
53         /// <param name="userId">可以是粉絲的OpenID,也可以是粉絲的微信號。</param>
54         /// <returns></returns>
55         public static MenuTryMatchResult TryMatch(string accessTokenOrAppId, string userId)
56         {
57             return ApiHandlerWapper.TryCommonApi(accessToken =>
58             {
59                 var url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/delconditional?access_token={0}", accessToken);
60 
61                 var data = new
62                 {
63                     user_id = userId
64                 };
65 
66                 return CommonJsonSend.Send<MenuTryMatchResult>(accessToken, url, data, CommonJsonSendType.POST);
67 
68             }, accessTokenOrAppId);
69         }
70 
71         #endregion
72 
73         /// <summary>
74         /// 刪除菜單
75         /// </summary>
76         /// <param name="accessTokenOrAppId"></param>
77         /// <param name="menuId">菜單Id</param>
78         /// <returns></returns>
79         public static WxJsonResult DeleteMenuConditional(string accessTokenOrAppId, string menuId)
80         {
81             return ApiHandlerWapper.TryCommonApi(accessToken =>
82             {
83                 var url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/delconditional?access_token={0}", accessToken);
84 
85                 var data = new
86                 {
87                     menuId = menuId
88                 };
89 
90                 return CommonJsonSend.Send(accessToken, url, data, CommonJsonSendType.POST);
91 
92             }, accessTokenOrAppId);
93 
94         }
95 
96         /* 使用普通自定義菜單刪除接口可以刪除所有自定義菜單(包括默認菜單和全部個性化菜單),請見自定義菜單刪除接口的說明。 */
97     }
98 }
View Code

  菜單公共方法中,GetButtonGroup()方法添加了一個參數:buttonGroup,用於指定菜單按鈕列表類型(屬於個性化菜單還是自定義菜單)。

  

實體

  有關實體類的變化都體現在Entities/Menu目錄下,新建了IButtonGroupBase接口以及ButtonGroupBase基類。ButtonGroup(自定義菜單)和ConditionalButtonGroup(個性化菜單)按鈕都繼承自ButtonGroupBase。

  Entities/Menu/Buttons/目錄下的所有按鈕類型是通用的。

 

返回類型

  重新整理的返回類型都在Entities/JsonResult/Menu/目錄下:

 

 

注意點

  1. 自定義菜單和個性化菜單的菜單添加、刪除接口是不同的,使用的時候需要調用各自不同的接口。
  2. 如果使用個性化菜單,MenuMatchRule中的規則必須至少填寫一個。
  3. 對於使用了個性化菜單和不使用,獲取菜單時返回的數據是不同的(前者包含后者),因此SDK針對這兩種情況只提供了同一個實體:GetMenuResult(對應的接收消息實體為GetMenuResultFull)。有關個性化菜單的信息(列表)可以直接從GetMenuResult.conditionalmenu讀取,如果為null或者列表為空,則表示沒有個性化菜單。

 

測試和可視化編輯

  源代碼中提供了一個簡易的可視化編輯工具,同時可以查看得到的菜單JSON數據格式(顯示的是操作的實體轉換成的JSON,非原始JSON)。

  地址:https://sdk.weixin.senparc.com/Menu

 

系列教程索引

地址:http://www.cnblogs.com/szw/archive/2013/05/14/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 微信公眾平台開發教程(二十):使用菜單消息功能
  21. Senparc.Weixin.MP SDK 微信公眾平台開發教程(二十一):在小程序中使用 WebSocket (.NET Core)
  22. Senparc.Weixin.MP SDK 微信公眾平台開發教程(二十二):如何安裝 Nuget(dll) 后使用項目源代碼調試


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM