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

  验证服务器地址数据库

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

  

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

  咱们就把它翻译成.net的,哈哈。微信公众平台

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

  WechatService:画红框的项目,是一个MVC4的项目,接收微信发来的消息以及提供了一些外部程序调用的接口。若是WCF熟悉,也能够用WCF来作。测试

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

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

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

  Service.WechatPlatform:存一些微信帐号信息的,好比Token之类的常量,若是须要使用多个微信公众平台,这里还能够用工厂模式扩展多平台。翻译

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

  

  二、在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:洗洗睡了。

相关文章
相关标签/搜索