千家信息网

C#开发微信之微信企业号消息和事件接收处理及解密的示例分析

发表于:2025-01-28 作者:千家信息网编辑
千家信息网最后更新 2025年01月28日,这篇文章给大家分享的是有关C#开发微信之微信企业号消息和事件接收处理及解密的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、企业号回调模式的设置和公众号一样,微信
千家信息网最后更新 2025年01月28日C#开发微信之微信企业号消息和事件接收处理及解密的示例分析

这篇文章给大家分享的是有关C#开发微信之微信企业号消息和事件接收处理及解密的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1、企业号回调模式的设置

和公众号一样,微信企业号如果需要进行二次开发,也是需要在后台设置好对应的回调参数,如下界面所示。

设置好这些后,检查通过后,我们就可以在自己微信应用服务器上进行消息的收发操作了。

在回调的消息入口处,我们需要对POST数据和普通的GET数据进行分开处理,GET数据是微信自身的验证处理,POST数据是微信消息的交互操作。

    ///     /// 企业号回调信息接口。统一接收并处理信息的入口。    ///     public class corpapi : IHttpHandler    {        ///         /// 处理企业号的信息        ///         ///         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_signature                        string 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

验证代码部门如下所示。

        ///         /// 验证企业号签名        ///         /// 企业号配置的Token        /// 签名内容        /// 时间戳        /// nonce参数        /// 企业号ID标识        /// 加密键        /// 内容字符串        /// 返回的字符串        ///         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_signature            string 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#开发微信之微信企业号消息和事件接收处理及解密的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

企业 消息 处理 参数 验证 信息 内容 数据 加密 服务器 应用 服务 明文 代码 字符 字符串 模式 过程 逻辑 配置 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河南省网络安全专家王瑞民教授 国内网络技术有哪些 服务器大数据要多大的硬盘 无锡网络安全员证 部队网络安全课件模板 网络技术课件检索式 软件开发销售担责任吗 单路c602服务器 数据库原理单选 网络安全知识资料答案 数据库 时钟替换算法 浙江顺联网络技术 注重信息网络安全的好处 黎明觉醒手游服务器维护要多久 网管把代理服务器关了上不了网了 华为服务器主板的管理地址 贵州钱宝宝网络技术有限公司 黄梅桃花图案设计与软件开发 混沌与秩序2最新服务器 浙江有哪些网络安全公司 布达佩斯网络安全公约支持国家 思科网络技术学院教程全集 数据库设计及表间关系 如何导出导入数据库的表 stac网络安全 网络安全手抄报科技安全 上海好生意互联网科技有限公司 服务好实力强的协同软件开发 广州优橙网络技术怎么样 upnp多媒体服务器
0