企业号回调模式(C#)

  最近也要开发回调模式,弄了好多天,配置URL都会跳出“echostr校验失败,请您检查是否正确解密并输出明文echostr ”,昨天晚上终于找到我的问题在哪了!!今天赶紧把这口恶气给出了,哈哈哈

  下面撸问题:首先,我参考的是伍华聪老师的企业号开发系列,甩上链接:http://www.cnblogs.com/wuhuacong/p/3996000.html,里面讲的很详细,主要我加了一行urldecode(在微信的开发文档——回调模式里面有写要对获取到的echostr进行urldecode),具体会在下面的代码里用红色标明。最最最重要的,就是!SAE并不能用(对于C#来说)!至少我不行!昨天看见网上说SAE不支持.net,然后测试了一下,果然真的是卡在这里了!后来用了公司的外网服务器,就成功了!!原来卡了这么久完全不是代码问题,哭都来不及。。。下面附上代码(亲测可以顺利开启回调模式,至于消息回调还没做,

using System;
using
System.Web; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Text; public class Auth : IHttpHandler { public void ProcessRequest(HttpContext context) { //string postString = string.Empty; if (HttpContext.Current.Request.HttpMethod.ToUpper() != "GET") { } else { WXHD(); } } private void WXHD() { #region 获取关键参数 string token = ConfigurationManager.AppSettings["CorpToken"];//从配置文件获取Token string encodingAESKey = ConfigurationManager.AppSettings["EncodingAESKey"];//从配置文件获取EncodingAESKey string corpId = ConfigurationManager.AppSettings["CorpId"];//从配置文件获取corpId #endregion string echoStringinitial = HttpContext.Current.Request.QueryString["echostr"]; string echoString = HttpUtility.UrlDecode(echoStringinitial); // 开发文档中写的“企业在获取时需要做urldecode处理string signature = HttpContext.Current.Request.QueryString["msg_signature"]; string timestamp = HttpContext.Current.Request.QueryString["timestamp"]; string nonce = HttpContext.Current.Request.QueryString["nonce"]; string decryptEchoString = ""; if (CheckSignature(token, signature, timestamp, nonce, corpId, encodingAESKey, echoString, ref decryptEchoString)) { if (!string.IsNullOrEmpty(decryptEchoString)) { HttpContext.Current.Response.Write(decryptEchoString); HttpContext.Current.Response.End(); } } } public bool CheckSignature(string token, string signature, string timestamp, string nonce, string corpId, string encodingAESKey, string echostr, ref string retEchostr) { WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId); int result = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref retEchostr); if (result != 0) { LogTextHelper.Error("ERR: VerifyURL fail, ret: " + result); return false; } return true; //ret==0表示验证成功,retEchostr参数表示明文,用户需要将retEchostr作为get请求的返回参数,返回给企业号。 // HttpUtils.SetResponse(retEchostr); } public bool IsReusable { get { return false; } } }

上面是Auth.ashx(一般处理程序),其中的WXBizMsgCrypt是微信开发文档中给的,直接下载使用就好。下载链接:http://qydev.weixin.qq.com/wiki/index.php?title=%E5%8A%A0%E8%A7%A3%E5%AF%86%E5%BA%93%E4%B8%8B%E8%BD%BD%E4%B8%8E%E8%BF%94%E5%9B%9E%E7%A0%81

日志记录的帮助类LogTextHelper我是网上找的,直接找度娘就好了,实在不行,直接把那一行注释掉就好了,当然这样就没日志可以看咯。

webconfig配置文件里添加:

<appSettings>
    <add key ="CorpToken" value="你的token"/>
    <add key="EncodingAESKey" value="你的encodingaeskey"/>
    <add key="CorpId" value="企业的corpid"/>
  </appSettings>

 

URL中记得要加上端口号,Token和EncodingAESKey我都是点的后面的随机获取,再坑爹的一步来了,点保存的话,你可能点了一下以后他还是会提示“echostr校验失败,请您检查是否正确解密并输出明文echostr ”,but!不要气馁,一直点,他就会显示回调配置成功啦!

 

好了,至此,回调模式开启总算是搞定了,下面说一下我是怎么知道不是代码问题的,在下载WXBizMsgCrypt时,压缩包里有一份sample.cs,如果是用的SAE作为自己服务器失败的,可以去SAE的日志中心(应用——日志中心,就在 代码管理 的下面几个),这样就能看到URL和HTTP返回码了,把里面的每个参数复制到对应的sample.cs中,记得echostr要urldecode(百度就能解码),然后在sample.cs中断点,看ret是不是0,如果是,那程序说明并没有问题(记得sample.cs中的token, corpID, EncodingAESKey也要改成自己的)。

OK,我要继续去码消息回复加解密了,有问题请留言,说的不对的请指正喔。

 

posted @ 2016-11-25 09:10  浅语sunny  阅读(1718)  评论(0编辑  收藏  举报