首先,请允许我说一句: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. CC++初学者编程教程(3) 安装VS2010 boost标准库开发环境

    1.      BOOST编译过程非常复杂,目前为了学习BOOST,首先搭建基于VS2010的BOOST开发环境. Boost库 8 9. 10. 11 12 13 14 15. 16. 17. 18 ...

  2. [Leetcode][Python]32: Longest Valid Parentheses

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 32: Longest Valid Parentheseshttps://oj ...

  3. Swift 闭包表达式

    闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包的形式主要有三 ...

  4. 如何在MFC对话框之间自定义消息传递

    在MFC项目开发中,涉及到不同模块间数据信息的传递,如用户在登录界面成功登录后向系统管理模块发送用户名和密码等信息. 首先,需明确以下两点: 谁要发送这个消息--消息发送方 谁要接受这个消息--消息接 ...

  5. C++ 文件操作实例

    图1 文件个数及名称 图2 文件内容 背景:如图1所示,现有9个要处理的文件,每个文件的内容格式如图2所示,仅仅只是数值部分不同. 问题:如何提取每个文件中的相同属性的数值到同一个文件中? 输出示例: ...

  6. GridView中日期显示格式

    DataFormatString="{0:d}"

  7. Deep Learning(深度学习)学习笔记整理系列之(七)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  8. C# 创建文件时,文件夹不存在,如何自动创建文件夹

    c# 创建文件时怎么创建文件夹?strhtml=......StreamWriter sw=new StreamWriter("D:/test/1.aspx",false);sw. ...

  9. IOS开发——正则表达式验证手机号、密码

    App的实际应用中,用户登陆功能基本是每个App都有需求的一个功能.而当前我们很常规的做法,就是让用户把手机号作为自己的用户名,而在注册获取短信验证码的过程中,我们首先要完成的一个步骤,就是校验用户的 ...

  10. 搭建Hadoop集群 (三)

    通过 搭建Hadoop集群 (二), 我们已经可以顺利运行自带的wordcount程序. 下面学习如何创建自己的Java应用, 放到Hadoop集群上运行, 并且可以通过debug来调试. 有多少种D ...