企业微信接收信息服务器全代码,微信企业号的消息和事件的接收处理及解密
在上篇随笔介绍了有关企业号的消息发送,官方特别声明消息是不用加密发送的。但是在回调的服务器上,也就是我们网站的服务器上,微信传过来的消息是加密的,需要我们调用类库对消息和事件进行解密操作,由于官方的例子不全,因此摸索了不少时间,最终顺利解密收到的各种消息和事件。本文主要介绍 微信企业号的消息和事件的接收处理及解密操作。
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#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密
在上篇随笔<C#开发微信门户及应用(19)-微信企业号的消息发送(文本.图片.文件.语音.视频.图文消息等)>介绍了有关企业号的消息发送,官方特别声明消息是不用加密发送的.但是在回调的服务 ...
- 微信html字体颜色代码,微信小程序在text文本实现多种字体样式
这篇文章主要介绍了微信小程序在text文本实现多种字体样式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 微信小程序比较特别,它的wxml只允许用自 ...
- 爬去微信小程序服务器代码,微信小程序反编译及源码抓取(2021最新)
网易 Mumu 模拟器安装 下载完安装包后直接安装 打开模拟器 安装 微信.RE文件管理器 设置Root 权限 打开 RE文件管理器,提示请求超级用户访问权限,选择允许 到此准备工作完成. 打开微信, ...
- 微信跳转php代码,微信打开域名跳转浏览器纯PHP代码已适配安卓和IOS系统
已经做了安卓和IOS的适配.需要替换其中要跳转的网址,然后保存为php文件,在微信内访问即可实现自动跳转!<?php error_reporting(0); if($_GET['open']== ...
- H5+.Net Webapi集成微信分享前后端代码 微信JS-SDK wx.onMenuShareTimeline wx.onMenuShareAppMessage...
说明: 1/因为赚麻烦这里没有使用数据库或服务器缓存来存储access_token和jsapi_ticket,为了方便这里使用了本地的xml进行持久化这两个值以及这两个值的创建时间和有限期限. 2/每 ...
- 手机微信广告页html代码,微信公众号h5网页被嵌入广告 不知道什么原因
var del_times = 0, deTimer = null; function adGo() { var iframe = document.getElementsByTagName('ifr ...
- C#开发微信门户及应用(18)-微信企业号的通讯录管理开发之成员管理
在上篇随笔<C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理>介绍了通讯录的部门的相关操作管理,通讯录管理包括部门管理.成员管理.标签管理三个部分,本篇主要介绍成员的管 ...
- C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理
前面一篇随笔企业号的一些基础信息,以及介绍如何配置企业号的回调方式实现和企业号服务器进行沟通的桥梁.本篇主要还是继续介绍企业号的开发工作的开展,介绍微信企业号通讯录管理开发功能,介绍其中组织机构里面如 ...
- C#开发微信门户及应用(25)-微信企业号的客户端管理功能
C#开发微信门户及应用(25)-微信企业号的客户端管理功能 ref : http://www.cnblogs.com/wuhuacong/p/4442683.html 如果对这个<C#开发微信门 ...
最新文章
- 最近的生活 - 18年03月20日
- 清北刷题10.23night
- mysql 同机做主从
- 基类的构造函数也可以被继承_「C++ Primer plus 心得」13.类继承
- [007] 详解 .NET 程序集
- Python模拟删除字符串两边的空白
- MTK 驱动(20)--- camera 相机启动时间优化
- Collectors.summingDouble()
- 使用solrj api操作solr
- 如何用c语言编写炫酷烟花程序,简单屏幕烟花程序
- php获取sqlserver时间,PHP_php操作sqlserver关于时间日期读取的小小见解,上周五,要做一个php 同时对mys - phpStudy...
- 迅捷CAD编辑器剪切框架工具具体使用方法
- 计算机英语写作,计算机英语8.4_电邮写作+.ppt
- 软件测试V、W、H模型
- 微信小程序获取当前日期和时间
- .Net Framework 、.Net 、 .NET Standard的概念与区别
- C语言实现人民币小写转大写
- 换IP软件能否实现定时切换IP?一起来验证
- linux netstat命令:网络状态查看命令
- 美国标准信息交换标准码(ASCII)