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)。

  地址:http://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代理功能

 

QQ:498977166

http://szw.cnblogs.com/
研究、探讨.NET开发
转载请注明出处和作者,谢谢!

 

微信开发深度解析:微信公众号、小程序高效开发秘籍
Senparc官方教程《微信开发深度解析:微信公众号、小程序高效开发秘籍》,耗时2年精心打造的微信开发权威教程,点击这里,购买正版

 

<think>好的,我现在需要帮助用户解决如何使用Senparc.Weixin.Open库获取微信开放平台的component_verify_ticket的问题。首先,我需要回顾用户提供的引用内容,看看有没有相关的信息。 用户提供了三个引用,其中引用[3]提到在.net web api中接收推送的component_verify_ticket,并可以将其保存在缓存、数据库或文件中。这说明component_verify_ticket是通过微信开放平台推送过来的,而不是主动获取的。因此,步骤应该是配置接收推送的消息,然后从中提取并存储这个票据。 接下来,我需要考虑Senparc.Weixin.Open库中的相关类和方法。引用[1]提到了WeixinOpenException,可能和异常处理有关,但这不是当前问题的重点。引用[2]提到CustomThirdPartyMessageHandlers用于接收和解析消息,这应该与处理微信推送的component_verify_ticket有关。 用户的问题是如何获取component_verify_ticket,根据微信开放平台的流程,第三方平台需要提供一个接收消息的URL,微信服务器会定期推送component_verify_ticket到这个URL。因此,使用Senparc库时,需要设置一个Controller来处理这个推送,并使用CustomThirdPartyMessageHandlers来解析消息。 然后,我需要检查是否需要注册第三方平台信息,例如ComponentBag,这在引用[1]的WeixinOpenException中有提到ComponentBag属性,可能用于存储平台相关信息。注册信息可能需要AppId、密钥等。 另外,引用[3]提到将component_verify_ticket存储在缓存中,这可能涉及到Senparc的缓存机制,比如使用Cache或数据库存储。用户需要在自己的代码中处理接收到的票据,并保存到合适的存储介质中。 可能还需要配置消息处理程序,确保能够正确解析微信推送的XML数据,并从中提取component_verify_ticket。处理完成后,返回成功响应给微信服务器,以避免重复推送。 总结步骤应该是:配置接收URL的Controller,使用CustomThirdPartyMessageHandlers解析消息,提取票据并存储。同时,需要注册第三方平台信息,确保库能正确处理请求。 现在需要验证这些步骤是否正确,是否有遗漏。比如是否需要配置中间件或路由,确保请求能正确路由到Controller。另外,处理消息时是否需要验证签名,这部分Senparc库可能已经封装好了,用户只需关注处理逻辑。 可能还需要参考Senparc的官方文档,确保代码示例的正确性。例如,处理推送消息的Controller可能继承自特定的基类,或者使用特定的属性标记路由。 最后,确保用户了解component_verify_ticket的有效期较长,但仍需定期检查更新,避免过期导致的问题。</think>要通过 Senparc.Weixin.Open 获取微信开放平台的 component_verify_ticket,需通过以下步骤实现: --- ### 一、配置接收推送的 Controller 1. **创建消息接收接口** 在 Web API 中创建用于接收微信推送的 Controller,继承 `WeixinOpenController`: ```csharp public class WeixinOpenController : Senparc.Weixin.Open.Containers.ThirdPartyMessageHandler.WeixinOpenController { // 处理 component_verify_ticket 推送 public override ActionResult Post(string postModel) { var messageHandler = new CustomThirdPartyMessageHandler(Request.InputStream, postModel); messageHandler.Execute(); // 执行消息解析 return Content("success"); // 必须返回 success } } ``` 2. **注册路由** 确保路由配置中包含该接口(如 `/WeixinOpen`),需与微信开放平台后台设置的**授权事件接收URL**一致[^3]。 --- ### 二、实现消息处理器 使用 `CustomThirdPartyMessageHandler` 解析 XML 消息: ```csharp public class CustomThirdPartyMessageHandler : ThirdPartyMessageHandler { public CustomThirdPartyMessageHandler(Stream inputStream, string postModel) : base(inputStream, postModel) { } public override IResponseMessageBase OnComponentVerifyTicketRequest(RequestMessageComponentVerifyTicket requestMessage) { // 提取 component_verify_ticket var componentVerifyTicket = requestMessage.ComponentVerifyTicket; // 存储到缓存(示例使用 Senparc 缓存) CacheStrategyFactory.GetObjectCacheStrategyInstance().Set( "ComponentVerifyTicket", componentVerifyTicket, TimeSpan.FromMinutes(20)); // 根据实际情况设置过期时间[^3] return new SuccessResponseMessage(); } } ``` --- ### 三、注册第三方平台信息 在全局启动时注册组件信息: ```csharp var componentAppId = "第三方平台AppId"; var componentSecret = "第三方平台AppSecret"; var componentToken = "令牌"; var componentEncodingAESKey = "消息加解密Key"; ComponentContainer.Register( componentAppId, componentSecret, componentToken, componentEncodingAESKey); ``` --- ### 四、获取已存储的 component_verify_ticket 后续通过缓存或数据库读取: ```csharp var componentVerifyTicket = CacheStrategyFactory.GetObjectCacheStrategyInstance().Get<string>("ComponentVerifyTicket"); ``` --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值