《微信企业号开发日志》之企业号接入
微信企业号申请注册流程
回调模式
在回调模式下,企业不仅可以主动调用企业号接口,还可以接收用户的消息或事件。接收的信息使用XML数据格式、UTF8编码,并以AES方式加密。
企业号的每个应用都有自己的回调模式开关。在管理端开启并设置好相关参数后,此应用的回调模式才生效。
针对加解密的处理,微信提供了各种语言的库,企业可以在附录中下载。下载地址
开启应用的回调模式
当你开启应用的回调模式时,企业号会要求你填写应用的URL、Token、EncodingAESKey三个参数。
URL是企业应用接收企业号推送请求的访问协议和地址,支持http或https协议。
Token可由企业任意填写,用于生成签名。
EncodingAESKey用于消息体的加密,是AES密钥的Base64编码。
验证URL、Token以及加密的详细处理请参考后续'接收消息时的加解密处理'的章节。
验证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明文(不能加引号),则接入验证生效,回调模式才能开启。
我们在项目下新建一个一般处理程序:QYWX.ashx
先来获取验证回调所需要的参数
//微信接入的测试 string token = ConfigurationManager.AppSettings["CorpToken"];//从配置文件获取Token string CorpID = ConfigurationManager.AppSettings["CorpID"];//从配置文件获取Token string EncodingAESKey = ConfigurationManager.AppSettings["EncodingAESKey"];//从配置文件获取Token string signature = context.Request["msg_signature"]; string timestamp = context.Request["timestamp"]; string nonce = context.Request["nonce"];
string echostr = context.Request["echostr"];
其中CorpToken,CorpID,EncodingAESKey是在配置文件中配置的,方便更改,配置文件节点如下:
<appSettings > <!--企业号配置信息--> <add key="CorpToken" value="XXXXXXXXXX"/> <add key="CorpID" value="XXXXXXXXXXXXX"/> <add key="EncodingAESKey" value="1v82IRu54erxBj3v1hItooXOXXXXXXXXXXXXXXX"/> </appSettings>
现在,我们来写验证处理流程
新建一个验证类CheckSignatureQY.cs
结构如图所示:
说明: Check为静态方法,,这个类很简单,现在贴上全部代码:
public class CheckSignatureQY { /// <summary> /// 在网站没有提供Token(或传入为null)的情况下的默认Token,建议在网站中进行配置。 /// </summary> public const string Token = "weixin"; /// <summary> /// 微信链接服务器验证凭证 /// </summary> /// <param name="sVerifyMsgSig">微信加密签名,msg_signature结合了企业填写的token、请求中的timestamp、nonce参数、加密的消息体 </param> /// <param name="sVerifyTimeStamp">时间戳</param> /// <param name="sVerifyNonce">随机数</param> /// <param name="sVerifyEchoStr">加密的随机字符串,以msg_encrypt格式提供。需要解密并返回echostr明文,解密后有random、msg_len、msg、$CorpID四个字段,其中msg即为echostr明文 </param> /// <param name="sEncodingAESKey">EncodingAESKey用于消息体的加密,是AES密钥的Base64编码。</param> /// <param name="sCorpID">帐号信息 CorpID</param> /// <param name="sEchoStr"></param> /// <param name="sToken"></param> /// <returns></returns> public static bool Check(string sVerifyMsgSig, string sVerifyTimeStamp, string sVerifyNonce, string sVerifyEchoStr , string sEncodingAESKey, string sCorpID, ref string sEchoStr, string sToken = null) { sToken = String.IsNullOrEmpty(sToken) ? Token : sToken; WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID); int ret = 0; ret = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr, ref sEchoStr); if (ret != 0) sEchoStr = "ERR: VerifyURL fail, ret: " + ret; return ret == 0; } }
说明:WXBizMsgCrypt 为微信官方的加密类:下载传送门
完成了CheckSignatureQY类以后,我们就要在QYWX.ashx中调用,微信验证的方法为GET,所以我们在QYWX.ashx中写入如下代码:
if (context.Request.HttpMethod == "GET")//验证 { string sEchoStr = ""; bool check = CheckSignatureQY.Check(signature, timestamp, nonce, echostr , EncodingAESKey, CorpID, ref sEchoStr, token);//True表示成功 //WriteText(check ? "True" : "False"); //check为True成功,Flase失败,失败信息在SechoStr WriteContent(sEchoStr); //返回随机字符串则表示验证通过 }
然后在微信调用界面中
点击完成就会完成了微信验证啦,如图所示:
本节到此结束