首先,请允许我说一句:shit!

因为这个问题不难,但是网上有关 ASP.NET WEBAPI的资料太少。都是PHP等等的。

我也是在看了某位大神的博客后有启发,一点点研究出来的。

来看正题!

1.微信公众平台的接入方法,无非4个参数(signature, timestamp, nonce, echostr)加1个Token(两边对应)

2.Token, timestamp, nonce字典排序后,按照字符串“SHA1”加密。得出一串字符串 tmpStr(转化为小写)

3.然后比对 tmpStr 是否等于 signature,如果相等,则表示此次请求是来自于微信。

4.确定请求来自于微信,则已经完成一大步了。剩下一个,将echostr参数传出给微信公众平台的工作了。(也正是这一步,耗费了3、4个小时)

PHP的代码就不说了,有例子,网上资料也很多。值得一提的是 ASP.NET MVC的操作,给个链接自己去看:Senparc.Weixin.MP SDK 微信公众平台开发教程 索引

下面结合代码来详细解释我的 ASP.NET WebAPI 对微信公众平台接入的操作。

1.获取四个参数,此处可以看Log能否输出获取到的4个参数

        ///声明Log全局变量
     private static log4net.ILog Log = LogManager.GetLogger("WeChatConnect");
     ///声明Token
public readonly string Token = "weixin";//与微信公众账号后台的Token设置保持一致,区分大小写。 ///申请消息
[HttpGet]
public HttpResponseMessage ConnWeChat(string signature, string timestamp, string nonce, string echostr)
{
try
{
Log.Debug("测试输出: echostr = " + echostr);
Log.Debug("测试输出: nonce = " + nonce);
Log.Debug("测试输出: timestamp = " + timestamp);
Log.Debug("测试输出: signature = " + signature); string EchoStr = Valid(signature, timestamp, nonce, echostr); if (!string.IsNullOrEmpty(EchoStr))
{
Log.Debug("验证成功!");
return JsonTools.ToHttpMsgForWeChat(echostr);
}
else
{
Log.Debug("验证失败!");
return JsonTools.ToHttpMsgForWeChat("验证失败!");
}
}
catch (Exception ex)
{
Log.Error("Log 测试输出:异常!", ex);
return JsonTools.ToHttpMsgForWeChat(ex.ToString());
}
}

2. Token, timestamp, nonce字典排序后,按照字符串“SHA1”加密。得出一串字符串 tmpStr(转化为小写),

比对 tmpStr 是否等于 signature,如果相等,则表示此次请求是来自于微信。

        private string Valid(string signature, string timestamp, string nonce, string echostr)
{
if (CheckSignature(signature,timestamp,nonce))
{
if (!string.IsNullOrEmpty(echostr))
{
return echostr;
}
} return "";
} /// <summary>
/// 验证微信签名
/// </summary>
/// * 将token、timestamp、nonce三个参数进行字典序排序
/// * 将三个参数字符串拼接成一个字符串进行sha1加密
/// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
/// <returns></returns>
private bool CheckSignature(string signature,string timestamp,string nonce)
{
string[] ArrTmp = { Token, timestamp, nonce };
Array.Sort(ArrTmp); //字典排序
string tmpStr = string.Join("", ArrTmp);
tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
tmpStr = tmpStr.ToLower();
if (tmpStr == signature)
{
return true;
}
else
{
return false;
}
}

3.确定请求来自于微信,则只剩下将echostr参数传出给微信公众平台了。

//来看看我上面代码中的输出方式:HttpResponseMessage
public HttpResponseMessage ConnWeChat(string signature, string timestamp, string nonce, string echostr) //输出语句
return JsonTools.ToHttpMsgForWeChat(echostr); //返回字符串调用方法:
 public static HttpResponseMessage ToHttpMsgForWeChat(string strMsg) { HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(strMsg, Encoding.GetEncoding("UTF-8"), "application/x-www-form-urlencoded") }; return result; }
此处要强调一下,参照PHP的 echo $echoStr , WebFrom 的 Response.Write(echoStr)等。
一次次的调试判断出微信的接受方式,只会以 "application/x-www-form-urlencoded" 来接受,所以我用HttpResponseMessage来指定其输出方式。最后测试成功!

网上各位大神给出的接入方法足以研究出接入规则,我通过某大神给的工具:Ngrok工具,成功部署本机80端口开放给外网,更加便于调试。感谢!

博客开了3年,第一次规规矩矩的写一次技术博文。不足的地方,望大家多多谅解。

专注于研究ASP.NET技术,最近迷上ASP.NET WebAPI。

个人网站正在搭建中:http://Amoysec.com,准备使用bootstrap + knockoutjs + MVC +WebAPI + EF6.0来做,其中对knockoutjs也算有不少的了解了,虽然比不上博客园的汤姆大叔,但也全凭自己对一份chm文档摸索出了不少。欢迎一起探讨!

 转载请注明出处,谢谢:http://www.cnblogs.com/mose/p/4136417.html

[原创] ASP.NET WEBAPI 接入微信公众平台 总结,Token验证失败解决办法的更多相关文章

  1. JAVA折腾微信公众平台(Token验证)[转]

    JAVA折腾微信公众平台(Token验证) BAE的JAVA还在内测的时候,抱着好奇的态度发邮件申请了内测权限,当时折腾了一天,然后就没折腾了.现在BAE的JAVA都已经正式开放使用了,我又蛋疼的想写 ...

  2. java微信公众号开发token验证失败的问题及解决办法

    本文引自http://m.blog.csdn.net/qq_32331997/article/details/72885424 微信公众平台服务器配置时,需要引入token,但是提交的时候总是提示to ...

  3. 微信公众号 报token验证失败

    最近两天一直碰到token验证失败的问题,如下图所示 然后上网疯狂的搜索答案,碰到的人还真不少,原因大概有这几个: 1)服务器URL未实名认证 2)token重名(基本不可能) 3)服务器部署的项目 ...

  4. 微信公众账号 token 验证失败 解决办法

    问题:微信公众账号 开发过程中配置  token 提示 验证失败 如下图: 点击修改配置: 填写相关url与token(自定义):点击提交,会出现 出现这种情况,主要是对相关参数不熟悉,要了解url与 ...

  5. 【微信Java开发 --2】接入微信公众平台开发,配置自己的服务器,验证过程

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑好我们就开始:1.填写好我们的URL和Token[此处是已经通过验证的] ...

  6. 第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发

    第一部分:微信公众号对接的基本介绍 一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击“修改配置”按钮,填写服务器地址( ...

  7. 第三方平台正式支持接入微信公众平台JS-SDK

    之前微信公众平台面向开发者开放微信内网页开发工具包,现在第三方平台也能正式支持接入微信公众平台JS-SDK了,第三方平台可以在获得公众号的授权后,通过JS-SDK帮助公众号开发和实现网页业务. 公众号 ...

  8. 1.Node.js 接入微信公众平台开发

    一.写在前面的话   Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...

  9. nodeJS接入微信公众平台开发

    一.写在前面的话   Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...

随机推荐

  1. OSG坐标系统

    1.世界坐标         世界坐标系描述的是整个场景中所有的对象,可以理解为绝对坐标系,所有对象的位置都是绝对坐标.从整体上考虑,它为所有对象的位置提供一个绝对的参考标准,从而避免了物体之间由于独 ...

  2. SQL Server 查看对象的权限

    例子 1. 查看登录名 loginA的权限: create login loginA with password = '123456'; go use studio; create user logi ...

  3. 减小Delphi的Exe文件大小(11种方法)

    一般来说,由Delphi生成的EXE文件,要比其由它编程语言生成的体积大一些.这主要是由于使用VCL的原因(当然,VCL是有许多优点的!) 以下是减小EXE文件大小的几种途径: 01) 使用加壳工具( ...

  4. Android切换页面效果的实现二:WebView+ViewPager

    前言: 由于第一种切换页面的效果不能满足项目的要求,于是又找到另外一种更简单好用的方法来实现,顿时感觉,做项目开发,找到一种合适的方法能够减少很多时间,(刚开始自己弄的时候还想着自己写手势识别的方法呢 ...

  5. Android setTag IllegalArgumentException

    E/AndroidRuntime(19480): java.lang.IllegalArgumentException: The key must be an application-specific ...

  6. PostgreSQL的存储系统二:REDOLOG文件存储结构二

    REDOLOG文件里的用户数据和数据文件里的用户数据存储结构相同 几个月前同事给台湾一家公司培训<pg9 ad admin>时,有个学员提及WAL里记录的内容为Query时的SQL语句(比 ...

  7. Android Resource介绍和使用

    1. 相关文件夹介绍 文件 取值方式 string.xml getResource().getString(resourceId)或者getResource().getText(resourceId) ...

  8. strtus2.3 java.lang.NoSuchFieldException: DEFAULT_PARAM>

    strtus2.3.15.1 的bug请下载 http://download.csdn.net/detail/livalue/6229373 或加群到群共享中下载.214579879

  9. HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  10. SQL练习之不破坏应用程序现有查询的修改模式

    当我还是一个菜鸟的时候,当然现在也是,当我的软件需求发生变化时,并且数据库设计同样要求发生变化,我通常会放弃原有的代码(或者对原有的代码进行大改),先在我知道了两个不破坏应用程序现有查询的修改模式,下 ...