了解 Senparc 的消息处理机制
参考资料
消息分类与 MessageHandler 简介
微信公众平台对消息做了比较清晰的分类,最基本的包括请求(Request)和响应(Response)两大类,每类又细分为文字、语音、图片等格式。
在 Senparc.Weixin.MP SDK 中,这些类型以枚举方式区分,并按照严格的命名规则定义了所有 RequestMessage 和 ResponseMessage 类。
如果不使用封装,开发者需要编写大量的 switch 或反射代码来区分消息类型。为了简化这一流程,从 v0.3.0 起,SDK 提供了 MessageHandler 抽象类。它内部已通过高效的方式处理了类型判断,开发者只需继承该类并重写对应方法即可。
使用 MessageHandler 的步骤
第一步:创建自定义 MessageHandler 类
新建 MyMessageHandler.cs,以 MessageHandler 为基类,重写所有方法:
- 构造函数接收来自微信服务器的请求流(
inputStream),也可传入XDocument调用基类对应构造函数。 - 重写的方法对应不同的请求类型(如文字、图片等),命名规则清晰易懂。
第二步:在重写方法中实现业务逻辑
例如处理文字(Text)消息时,使用 ResponseMessageBase.CreateFromRequestMessage 初始化特定类型的响应消息,返回类型需基于 IResponseMessageBase。
第三步:在 Controller 的 Action 中使用 MessageHandler
关键代码只需三步:
- 实例化自定义 MessageHandler
- 调用
await messageHandler.ExecuteAsync()执行整个处理过程(内部会调用对应的OnxxRequestAsync方法) - 返回响应结果
配置 AppId 和 AppSecret
在 Web.config 的 appSettings 节点中添加配置:
<add key="WeixinAppId" value="你的AppId" />
<add key="WeixinAppSecret" value="你的AppSecret" />Code language: HTML, XML (xml)
在代码中读取:
private string appId = WebConfigurationManager.AppSettings["WeixinAppId"];
private string appSecret = WebConfigurationManager.AppSettings["WeixinAppSecret"];Code language: PHP (php)
注意:示例原文中
value="true"仅为占位,实际应填写真实的 AppId 和 AppSecret。Token 建议使用数字+英文大小写组合,避免被破解伪造请求。
微信后台配置
在微信公众平台后台配置消息 URL 时,需要提供一个 GET 请求的 Action 用于验证(与之前握手阶段一致),以及一个 POST 请求的 Action 用于接收用户消息。
PostModel 实体类包含了 Signature、Timestamp、Nonce(由微信通过 URL 参数传入)以及 AppId、Token、EncodingAESKey 等敏感信息,需自行传入。
常见问题:调试失败与 IP 白名单
如果一直调试失败,有可能是 IP 白名单的问题。
为提高接口调用安全性,微信对”获取 access_token”接口增加了 IP 白名单校验:只有将服务器 IP 地址加入公众号的 IP 白名单,才能成功调用该接口。
解决方法:登录微信公众平台 → 开发 → 基本配置 → 公众号开发信息 → 添加 IP 白名单,将部署服务器的公网 IP 添加进去。