• .net开发微信公众号(2)-验证服务器地址


      验证服务器地址

      上一篇我们说了如何开启开发者模式,填写了接收微信推送消息的URL,这一篇我们说下如何验证URL,只有验证完成了,URL才能正式启用。

      

      上面这些是微信公众平台开发文档里说的验证方法,非常清楚,小伙伴们一看就能明白。微信只给出了PHP的代码示例。杯具。

      我们就把它翻译成.net的,哈哈。

      1、新建一个解决方案,起一个MVC4的项目,如下图。这里是我建好的一个解决方案,在这里简单介绍一下。

      WechatService:画红框的项目,是一个MVC4的项目,接收微信发来的消息以及提供了一些外部程序调用的接口。如果WCF熟悉,也可以用WCF来做。

      Service.Common:放了一些通用的静态方法。

      Service.DB:和数据库相关的内容。

      Service.Wechat.Common:和微信平台接口相关的内容。

      Service.WechatPlatform:存一些微信账号信息的,比如Token之类的常量,如果需要使用多个微信公众平台,这里还可以用工厂模式扩展多平台。

      TestUnit:一个普通控制台程序,用来做简单的代码测试。

      

      2、在WechatService里面,我们新建一个空白control叫WechatController.cs文件,里面加一个Service的Action。

      

      调用一个Valid的方法,校验微信发来信息的有效性。我用完了就注释掉了。

    1 //接受微信服务端发来的消息
    2 public void Service()
    3 {
    4         Valid();
    5 }    

      Valid的方法。

      WeLogger是个写txt日志文件的类。如果不用,可以直接删除整行。

     1         //用于申请“成为开发者”时向微信发送验证信息。
     2         public void Valid()  
     3         {
     4             string echoStr = Request.QueryString["echoStr"];
     5             if (string.IsNullOrEmpty(echoStr))
     6             {
     7                 WeLogger.Debug("echoStr为空");
     8                 return;
     9             }
    10             string signature = Request.QueryString["signature"];
    11             string timestamp = Request.QueryString["timestamp"];
    12             string nonce = Request.QueryString["nonce"];
    13             if (WeUtility.CheckSignature(signature,timestamp,nonce))
    14             {

    15 Response.Write(echoStr); 16 Response.End();

    17 } 18 }

      接下来在Service.Wechat.Common项目的WeUtility类里写一个CheckSignature静态方法

     1 public static bool CheckSignature(string signature, string timestamp, string nonce)
     2         {
     3             if (string.IsNullOrEmpty(signature) || string.IsNullOrEmpty(timestamp) || string.IsNullOrEmpty(nonce))
     4             {
     5                 return false;
     6             }
     7             //这个变量要与网页里面填写的接口配置信息中填写的Token一致
     8             string Token = WeConst.Token;
     9             string[] ArrTmp = { Token, timestamp, nonce };
    10             Array.Sort(ArrTmp);//排序
    11             string tmpStr = string.Join("", ArrTmp);
    12             tmpStr = UtilityFunc.SHA1_Hash(tmpStr);//对该字符串进行sha1加密
    13             tmpStr = tmpStr.ToLower();
    14 
    15             //获得加密后的字符串可与signature对比
    16             //通过检验signature对请求进行校验,若正确,则原样返回echostr参数内容,接入生效,否则接入失败
    17             if (tmpStr == signature)
    18             {
    19                 return true;
    20             }
    21             else
    22             {
    23                 return false;
    24             }
    25         }

      在Service.Common项目的UtilityFunc类里写一个SHA1_Hash静态方法

     1         /// <summary>
     2         /// 字符串转换SHA1
     3         /// </summary>
     4         /// <param name="str_sha1_in"></param>
     5         /// <returns></returns>
     6         public static string SHA1_Hash(string str_sha1_in)
     7         {
     8             SHA1 sha1 = new SHA1CryptoServiceProvider();
     9             byte[] bytes_sha1_in = UTF8Encoding.Default.GetBytes(str_sha1_in);
    10             byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
    11             string str_sha1_out = BitConverter.ToString(bytes_sha1_out);
    12             str_sha1_out = str_sha1_out.Replace("-", "");
    13             return str_sha1_out;
    14         }

      这样就ok了,如果你在微信填的URL地址是http://xxx.xxx.xxx/Wechat/Service的话,就可以直接把程序打包发布到IIS上,然后登录微信公众平台,提交所有信息,验证通过即可激活开发者模式。

      Valid方法激活了开发者模式之后就可以直接删了或注释掉,以后不再用了。

      CheckSignature方法在之后接收所有微信推送过来的消息时验证都要用,所有都写到Service.Wechat.Common里了。

      

      这篇就结束了,非常简单。

      总结一下,在微信账号上填写好URL之后把验证代码写好发布,然后在微信账号里验证一下我们填的地址是有效的就激活成功了。

      PS:如果在Valid方法里不做任何验证,直接在response里输出echoStr,理论上验证也能通过。这里感觉可以偷个懒,小伙伴们可以试试。

      PS:洗洗睡了。

      

      

  • 相关阅读:
    搭建springCloud网关zuul
    springboot添加https
    SpringBoot上传文件,经过spingCloud-Zuul,中文文件名乱码解决办法
    springboot mongodb jpa常用方法整理
    springboot拦截中自动注入的组件为null问题解决方法
    springboot JPA mysql
    转载Spring Data JPA 指南——整理自官方参考文档
    springboot带有进度条的上传
    HTTP请求示例
    http的N种请求
  • 原文地址:https://www.cnblogs.com/imoonstal/p/4246963.html
Copyright © 2020-2023  润新知