《微信企业号开发日志》之企业号接入

微信企业号申请注册流程

回调模式

在回调模式下,企业不仅可以主动调用企业号接口,还可以接收用户的消息或事件。接收的信息使用XML数据格式、UTF8编码,并以AES方式加密

企业号的每个应用都有自己的回调模式开关。在管理端开启并设置好相关参数后,此应用的回调模式才生效。

针对加解密的处理,微信提供了各种语言的库,企业可以在附录中下载。下载地址


开启应用的回调模式

当你开启应用的回调模式时,企业号会要求你填写应用的URL、Token、EncodingAESKey三个参数。

URL是企业应用接收企业号推送请求的访问协议和地址,支持http或https协议。

Token可由企业任意填写,用于生成签名。

EncodingAESKey用于消息体的加密,是AES密钥的Base64编码。

验证URL、Token以及加密的详细处理请参考后续'接收消息时的加解密处理'的章节。


Hdms.png

验证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"];

其中CorpTokenCorpIDEncodingAESKey是在配置文件中配置的,方便更改,配置文件节点如下:

<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); //返回随机字符串则表示验证通过

            }

然后在微信调用界面中

点击完成就会完成了微信验证啦,如图所示:

本节到此结束

慎于行,敏于思!GGGGGG
原文地址:https://www.cnblogs.com/GarsonZhang/p/4037289.html