C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密
在上篇随笔《C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)》介绍了有关企业号的消息发送,官方特别声明消息是不用加密发送的。但是在回调的服务器上,也就是我们网站的服务器上,微信传过来的消息是加密的,需要我们调用类库对消息和事件进行解密操作,由于官方的例子不全,因此摸索了不少时间,最终顺利解密收到的各种消息和事件。本文主要介绍 微信企业号的消息和事件的接收处理及解密操作。
1、企业号回调模式的设置
和公众号一样,微信企业号如果需要进行二次开发,也是需要在后台设置好对应的回调参数,如下界面所示。
设置好这些后,检查通过后,我们就可以在自己微信应用服务器上进行消息的收发操作了。
在回调的消息入口处,我们需要对POST数据和普通的GET数据进行分开处理,GET数据是微信自身的验证处理,POST数据是微信消息的交互操作。
/// <summary>/// 企业号回调信息接口。统一接收并处理信息的入口。/// </summary>public class corpapi : IHttpHandler{/// <summary>/// 处理企业号的信息/// </summary>/// <param name="context"></param>public void ProcessRequest(HttpContext context){
上面我们定义了一个一般应用处理程序来对消息进行处理。
然后我们分开不同的消息类型(POST、GET 方式),针对性的进行处理。
if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST"){using (Stream stream = HttpContext.Current.Request.InputStream){Byte[] postBytes = new Byte[stream.Length];stream.Read(postBytes, 0, (Int32)stream.Length);postString = Encoding.UTF8.GetString(postBytes);}if (!string.IsNullOrEmpty(postString)){Execute(postString, accountInfo);}}else{Auth(accountInfo);}
2、微信回调消息的验证
下面是微信对于回调模式,验证URL的说明。
验证URL有效性
当你提交以上信息时,企业号将发送GET请求到填写的URL上,GET请求携带四个参数,企业在获取时需要做urldecode处理,否则会验证不成功。
参数 | 描述 | 是否必带 |
---|---|---|
msg_signature | 微信加密签名,msg_signature结合了企业填写的token、请求中的timestamp、nonce参数、加密的消息体 | 是 |
timestamp | 时间戳 | 是 |
nonce | 随机数 | 是 |
echostr | 加密的随机字符串,以msg_encrypt格式提供。需要解密并返回echostr明文,解密后有random、msg_len、msg、$CorpID四个字段,其中msg即为echostr明文 | 首次校验时必带 |
企业通过参数msg_signature对请求进行校验,如果确认此次GET请求来自企业号,那么企业应用对echostr参数解密并原样返回echostr明文(不能加引号),则接入验证生效,回调模式才能开启。
后续回调企业时都会在请求URL中带上以上参数(echostr除外),校验方式与首次验证URL一致。
根据上面的说明,我们需要获取这些参数,然后调用微信提供的消息处理函数进行加解密处理。
在验证URL的Auth(accountInfo);操作里面,我们可以看到核心的内容如下所示,就是获取到这些传递过来的参数信息,然后交给基类处理消息的签名内容。
#region 具体处理逻辑string echoString = HttpContext.Current.Request.QueryString["echoStr"];string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企业号的 msg_signaturestring timestamp = HttpContext.Current.Request.QueryString["timestamp"];string nonce = HttpContext.Current.Request.QueryString["nonce"];string decryptEchoString = "";if (new CorpBasicApi().CheckSignature(token, signature, timestamp, nonce, corpId, encodingAESKey, echoString, ref decryptEchoString)){if (!string.IsNullOrEmpty(decryptEchoString)){HttpContext.Current.Response.Write(decryptEchoString);HttpContext.Current.Response.End();}} #endregion
验证代码部门如下所示。
/// <summary>/// 验证企业号签名/// </summary>/// <param name="token">企业号配置的Token</param>/// <param name="signature">签名内容</param>/// <param name="timestamp">时间戳</param>/// <param name="nonce">nonce参数</param>/// <param name="corpId">企业号ID标识</param>/// <param name="encodingAESKey">加密键</param>/// <param name="echostr">内容字符串</param>/// <param name="retEchostr">返回的字符串</param>/// <returns></returns>public bool CheckSignature(string token, string signature, string timestamp, string nonce, string corpId, string encodingAESKey, string echostr, ref string retEchostr){WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId);int result = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref retEchostr);if (result != 0){LogTextHelper.Error("ERR: VerifyURL fail, ret: " + result);return false;}return true;}
3、企业号的消息处理
上面介绍了,微信企业号对URL的验证过程,还有另外一个消息处理过程,就是微信服务器把消息发送给我们自己的应用服务器进行处理的过程,我们应用服务器需要在收到消息后,及时进行常规回复处理。
也就是下面的代码逻辑。
if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST"){using (Stream stream = HttpContext.Current.Request.InputStream){Byte[] postBytes = new Byte[stream.Length];stream.Read(postBytes, 0, (Int32)stream.Length);postString = Encoding.UTF8.GetString(postBytes);}if (!string.IsNullOrEmpty(postString)){Execute(postString, accountInfo);}}
同样,我们给微信服务器回应消息的时候,我们也需要获得相应的参数,然后再行构造信息回答。
string echoString = HttpContext.Current.Request.QueryString["echoStr"];string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企业号的 msg_signaturestring timestamp = HttpContext.Current.Request.QueryString["timestamp"];string nonce = HttpContext.Current.Request.QueryString["nonce"];
而另外一些参数信息,则是来源于我们企业号账号的配置参数。
//获取配置参数并对加解密函数初始化string CorpToken = accountInfo.Token;string AESKey = accountInfo.EncodingAESKey;string CorpId = accountInfo.CorpID;
然后使用微信提供的消息加解密类,就可以顺利对消息进行加解密的处理了。具体操作代码如下所示。
//根据参数信息,初始化微信对应的消息加密解密类WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(CorpToken, AESKey, CorpId);//对收到的密文进行解析处理string sMsg = ""; // 解析之后的明文int flag = wxcpt.DecryptMsg(signature, timestamp, nonce, postStr, ref sMsg);if (flag == 0){//LogTextHelper.Info("记录解密后的数据:");//LogTextHelper.Info(sMsg);//记录解密后的数据 CorpApiDispatch dispatch = new CorpApiDispatch();string responseContent = dispatch.Execute(sMsg);//加密后并发送//LogTextHelper.Info(responseContent);string encryptResponse = "";timestamp = DateTime.Now.DateTimeToInt().ToString();wxcpt.EncryptMsg(responseContent, timestamp, nonce, ref encryptResponse, ref signature);HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;HttpContext.Current.Response.Write(encryptResponse);}else{LogTextHelper.Info("解密消息失败!");}
最终,我们把解密完成的消息交给对应的封装类进行统一处理就可以了。
CorpApiDispatch dispatch = new CorpApiDispatch();string responseContent = dispatch.Execute(sMsg);
这样我们在企业号API的封装,就可以只需要关注消息如何应答的逻辑就可以了,其他的不用关心。
如果对这个《C#开发微信门户及应用》系列感兴趣,可以关注我的其他文章,系列随笔如下所示:
C#开发微信门户及应用(25)-微信企业号的客户端管理功能
C#开发微信门户及应用(24)-微信小店货架信息管理
C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试
C#开发微信门户及应用(22)-微信小店的开发和使用
C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密
C#开发微信门户及应用(20)-微信企业号的菜单管理
C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)
C#开发微信门户及应用(18)-微信企业号的通讯录管理开发之成员管理
C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理
C#开发微信门户及应用(16)-微信企业号的配置和使用
C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能
C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据
C#开发微信门户及应用(13)-使用地理位置扩展相关应用
C#开发微信门户及应用(12)-使用语音处理
C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍
C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息
C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器
C#开发微信门户及应用(8)-微信门户应用管理系统功能介绍
C#开发微信门户及应用(7)-微信多客服功能及开发集成
C#开发微信门户及应用(6)--微信门户菜单的管理操作
C#开发微信门户及应用(5)--用户分组信息管理
C#开发微信门户及应用(4)--关注用户列表及详细信息管理
C#开发微信门户及应用(3)--文本消息和图文消息的应答
本文转自博客园伍华聪的博客,原文链接:C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密,如需转载请自行联系原博主。
C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密相关推荐
- 企业微信接收信息服务器全代码,微信企业号的消息和事件的接收处理及解密
在上篇随笔介绍了有关企业号的消息发送,官方特别声明消息是不用加密发送的.但是在回调的服务器上,也就是我们网站的服务器上,微信传过来的消息是加密的,需要我们调用类库对消息和事件进行解密操作,由于官方的例 ...
- C#开发微信门户及应用(24)-微信小店货架信息管理
在前面微信小店系列篇<C#开发微信门户及应用(22)-微信小店的开发和使用>里面介绍了一些微信小店的基础知识,以及<C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试& ...
- C#开发微信门户及应用(25)-微信企业号的客户端管理功能
C#开发微信门户及应用(25)-微信企业号的客户端管理功能 ref : http://www.cnblogs.com/wuhuacong/p/4442683.html 如果对这个<C#开发微信门 ...
- C#开发微信门户及应用(18)-微信企业号的通讯录管理开发之成员管理
在上篇随笔<C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理>介绍了通讯录的部门的相关操作管理,通讯录管理包括部门管理.成员管理.标签管理三个部分,本篇主要介绍成员的管 ...
- C#开发微信门户及应用(32)--微信支付接入和API封装使用
C#开发微信门户及应用(32)--微信支付接入和API封装使用 在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去, ...
- C#开发微信门户及应用(27)-公众号模板消息管理
原文:C#开发微信门户及应用(27)-公众号模板消息管理 通过模板消息接口,公众号能向关注其账号的用户发送预设模板的消息.模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中, ...
- C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理
前面一篇随笔企业号的一些基础信息,以及介绍如何配置企业号的回调方式实现和企业号服务器进行沟通的桥梁.本篇主要还是继续介绍企业号的开发工作的开展,介绍微信企业号通讯录管理开发功能,介绍其中组织机构里面如 ...
- C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试
在上篇<C#开发微信门户及应用(22)-微信小店的开发和使用>里面介绍了一些微信小店的基础知识,以及对应的对象模型,本篇继续微信小店的主题,介绍其中API接口的封装和测试使用.微信小店的相 ...
- C#开发微信门户及应用(7)-微信多客服功能及开发集成
原文:C#开发微信门户及应用(7)-微信多客服功能及开发集成 最近一直在弄微信的集成功能开发,发现微信给认证账户开通了一个多客服的功能,对于客户的咨询,可以切换至客服处理的方式,而且可以添加多个客服进 ...
最新文章
- 循环IRNNv2Layer实现
- 联想打字必须按FN+数字-fn打字
- mysql增删改查的命令_MySql增删改查命令
- mesh和wifi中继的区别_深度解读Mesh路由和无线中继的差异,谁才是性价比之选?...
- 计算机级用英语怎么说,计算机国家一级用英语怎么说
- x264 编码器选项分析 (x264 Codec Strong and Weak Points) 2
- 常见危险函数及特殊函数(一)
- gateway网关_公司要把网关Zuul换成Gateway,再难也得顶上
- Oracle数据库SQL优化详解
- Mujoco 基本教程
- C语言之一个有趣的关机程序
- 微软一站式示例代码库(中文版)2012-2-10版本, 新添加ASP.NET, Windows Form, VSX, Windows Shell, WPF等16个Sample
- CSS3中rotate的作用
- 【人工智能】Google I/O 2023:让 AI 对每个人都更有帮助 Making AI more helpful for everyone
- paper weekly_Android Weekly:Galaxy Fold详细信息,可在17分钟内充电的4000 mAh电池等
- java poi导出下载excel报表或下载到指定路径
- 订阅者-发布者简单demo
- godaddy php mail,Godaddy空间发送邮件的方法 | Godaddy美国主机中文指南
- 泛型是双刃剑?Go1.18 编译会慢近 20%
- 2022-2028年全球与中国防水翘板开关行业产销需求与投资预测分析
热门文章
- BoW模型用于图像检索的一般化流程
- Fishe向量Fisher Vecotr(一)
- Machine Learning week 1 quiz: Linear Algebra
- 【OpenCV3】RGB图像向CMYK颜色空间转换
- JAVA.NET.SOCKETEXCEPTION: TOO MANY OPEN FILES
- HDU 1848 Fibonacci again and again(博弈)
- golang Reflect包
- python练习集100题(21-40)
- Python中获取字典中最值对应的键
- 微信开发(02)之处理微信客户端发来的消息