验证服务器地址
上一篇我们说了如何开启开发者模式,填写了接收微信推送消息的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 if (!string.IsNullOrEmpty(echoStr)) 16 { 17 WeLogger.Info("echoStr值为:" + echoStr); 18 Response.Write(echoStr); 19 Response.End(); 20 21 } 22 } 23 }
接下来在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:洗洗睡了。