.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:洗洗睡了。

  

  

原文地址:https://www.cnblogs.com/imoonstal/p/4246963.html