Senparc.Weixin.MP SDK 微信公众平台开发教程(二):成为开发者

微信公众平台接口开发详解

这一篇主要讲作为一名使用公众平台接口的开发者,你需要知道的一些东西。其中也涉及到一些微信官方的规定或比较掩蔽的注意点。欢迎补充!

    我觉得做好成为开发者的准备比稀里糊涂开通微信后台的“高级”功能更重要,所以这一节先放在前面说。

一、公众平台的通讯过程

    作为开发者,我们需要面对的主要有两个对象:微信服务器和应用程序(网站)服务器。

    当微信用户向你的公众平台发送一条消息,实际上这条消息首先发送到微信服务器,由微信服务器向网站服务器发起另外一个请求,网站服务器返回这个请求的结果,再由微信服务器发送到微信客户端。

    整个消息通讯流程如下图:

    

    上述5个步骤中,作为开发者我们主要精力都集中在步骤3上,这个步骤主实际上要有3项任务:

  1. 接收来自2的XML信息
  2. 服务器内部逻辑执行
  3. 组织并返回用于4的XML信息

    上述三项任务我会在后面做详细说明,并提供一整套简单、高效的处理方法。

二、XML通讯格式

    用户使用微信客户端发送的不同类型的消息,网站服务器会收到不同格式的数据(文字、语音、图片等等),数据格式暂时只有XML一种。

    作为学习,我觉得只要熟练掌握最简单的文字类型就可以了,其他的格式都是大同小异。且在后面的说明中你会发现,Senparc.Weixin.MP.dll可以帮助我们完全忽略这些繁琐的格式和定义。

    一个简单的文字请求XML(RequestMessage)内容如下:

对应节点的官方说明如下:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgTypetext
Content文本消息内容
MsgId消息id,64位整型

    

一:

 

  对应节点的官方说明如下:

参数描述
ToUserName接收方帐号(收到的OpenID)
FromUserName开发者微信号
CreateTime消息创建时间
MsgTypetext
Content回复的消息内容,长度不超过2048字节
FuncFlag位0x0001被标志时,星标刚收到的消息。

三、一些需要注意和容易被忽视的问题:

  1. 每条XML信息都有大小限制,如文本信息,建议Content内容不要超过600字。
  2. 上图中,步骤2开始之后,微信服务器有一个等待时间:5秒,如果在这个时间内没有进行到步骤4,那么这个请求将会被关闭(包括数据传输的时间)。也就是说如果超过时间,即使网站服务器返回了数据,客户端也无法收到回复。
  3. 在文本消息中,是允许添加<a>标签来放置连接的,但是有许多朋友测试之后发现iOS没问题,Android上链接无法点击,其实原因是(至少目前为止):Android的微信客户端对<a>标签格式的判定比较严格,请严格按照这个格式书写:<a href="http://xxxx">内容</a>,href后不要使用单引号,也不要添加其他属性。
  4. 上面XML节点中的FromUserName即微信用户的OpenId,对于同一个公众账号,这个OpenId的前6位是一致的,并且在整个公众平台的记录中也是唯一的。也就是说同一个用户关注了两个不同的公众账号,他会有两个不同的OpenId。
  5. CreateTime使用的是Unix时间,因此如果使用C#的话,需要做一个转换。
  6. 尽量保持官方API中XML节点的顺序,以前微信服务器是使用节点位置的方式读取信息的(node[0]),而非节点名称,现在这个问题似乎有好转,不过还是要小心(¥…………&%&……)。
  7. 由于这种特殊的通讯方式,(至少目前为止)所有请求必须从客户端先发起,不要指望光使用API或SDK可以实现由网站服务器主动推送消息到客户端(当然其他办法还是有的,比如模拟登陆)。

四、工欲善其事,必先利其器:Senparc.Weixin.MP.dll

    虽然整个通讯过程十分简单,但是官方API还是对一些字段做了特殊的约定或处理,况且面向过程地处理这么多类型的请求数据也是一件十分费力的事情。

    为此我做了一个开源项目:Senparc.Weixin.MP,地址:https://github.com/JeffreySu/WeiXinMPSDK/

    Senparc.Weixin.MP的主要目的是帮助C#开发者简化整个通讯过程,面向对象地处理消息,把主要精力放到业务逻辑上,而非繁琐的API上。

    使用Senparc.Weixin.MP,并部署到外网与微信服务器通讯,你需要准备这些环境:

  1. VS2012(至少VS2010 SP1);
  2. 如果需要运行MVC的Demo,至少需要.NET 4.0(安装MVC 4),运行Webforms Demo,至少需要.NET 3.5;
  3. 一个可以使用80端口访问的域名或IP,虚拟主机、花生壳映射内网、VPS、独立服务器都可以。

     这里先简单地引入Senparc.Weixin.MP这个项目的介绍,后面我会做更详细的说明并举例(https://github.com/JeffreySu/WeiXinMPSDK/ 里面也已经编写了足够多的使用文档和Demo可以参考)。

系列教程索引

地址:Senparc.Weixin SDK 微信公众号 .NET 开发教程 索引 - SZW - 博客园

  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) 后使用项目源代码调试

<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"); ``` --- 相关问题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值