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


    微信企业号申请注册流程

    回调模式

    在回调模式下,企业不仅可以主动调用企业号接口,还可以接收用户的消息或事件。接收的信息使用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
  • 相关阅读:
    Python: 通过 pip 安装第三方包后依然不能 import
    jar命令
    vim中删除^M
    Linux 非互联网环境安装依赖包
    安装rpm包时提示错误:依赖检测失败的解决方法
    python3.5安装
    yum配置安装 及报错
    统计数组元素出现的次数
    插入法排序
    选择法排序
  • 原文地址:https://www.cnblogs.com/GarsonZhang/p/4037289.html
Copyright © 2020-2023  润新知