[原创] ASP.NET WEBAPI 接入微信公众平台 总结,Token验证失败解决办法
首先,请允许我说一句: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验证失败解决办法的更多相关文章
- JAVA折腾微信公众平台(Token验证)[转]
JAVA折腾微信公众平台(Token验证) BAE的JAVA还在内测的时候,抱着好奇的态度发邮件申请了内测权限,当时折腾了一天,然后就没折腾了.现在BAE的JAVA都已经正式开放使用了,我又蛋疼的想写 ...
- java微信公众号开发token验证失败的问题及解决办法
本文引自http://m.blog.csdn.net/qq_32331997/article/details/72885424 微信公众平台服务器配置时,需要引入token,但是提交的时候总是提示to ...
- 微信公众号 报token验证失败
最近两天一直碰到token验证失败的问题,如下图所示 然后上网疯狂的搜索答案,碰到的人还真不少,原因大概有这几个: 1)服务器URL未实名认证 2)token重名(基本不可能) 3)服务器部署的项目 ...
- 微信公众账号 token 验证失败 解决办法
问题:微信公众账号 开发过程中配置 token 提示 验证失败 如下图: 点击修改配置: 填写相关url与token(自定义):点击提交,会出现 出现这种情况,主要是对相关参数不熟悉,要了解url与 ...
- 【微信Java开发 --2】接入微信公众平台开发,配置自己的服务器,验证过程
接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑好我们就开始:1.填写好我们的URL和Token[此处是已经通过验证的] ...
- 第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发
第一部分:微信公众号对接的基本介绍 一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击“修改配置”按钮,填写服务器地址( ...
- 第三方平台正式支持接入微信公众平台JS-SDK
之前微信公众平台面向开发者开放微信内网页开发工具包,现在第三方平台也能正式支持接入微信公众平台JS-SDK了,第三方平台可以在获得公众号的授权后,通过JS-SDK帮助公众号开发和实现网页业务. 公众号 ...
- 1.Node.js 接入微信公众平台开发
一.写在前面的话 Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...
- nodeJS接入微信公众平台开发
一.写在前面的话 Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...
随机推荐
- OSG坐标系统
1.世界坐标 世界坐标系描述的是整个场景中所有的对象,可以理解为绝对坐标系,所有对象的位置都是绝对坐标.从整体上考虑,它为所有对象的位置提供一个绝对的参考标准,从而避免了物体之间由于独 ...
- SQL Server 查看对象的权限
例子 1. 查看登录名 loginA的权限: create login loginA with password = '123456'; go use studio; create user logi ...
- 减小Delphi的Exe文件大小(11种方法)
一般来说,由Delphi生成的EXE文件,要比其由它编程语言生成的体积大一些.这主要是由于使用VCL的原因(当然,VCL是有许多优点的!) 以下是减小EXE文件大小的几种途径: 01) 使用加壳工具( ...
- Android切换页面效果的实现二:WebView+ViewPager
前言: 由于第一种切换页面的效果不能满足项目的要求,于是又找到另外一种更简单好用的方法来实现,顿时感觉,做项目开发,找到一种合适的方法能够减少很多时间,(刚开始自己弄的时候还想着自己写手势识别的方法呢 ...
- Android setTag IllegalArgumentException
E/AndroidRuntime(19480): java.lang.IllegalArgumentException: The key must be an application-specific ...
- PostgreSQL的存储系统二:REDOLOG文件存储结构二
REDOLOG文件里的用户数据和数据文件里的用户数据存储结构相同 几个月前同事给台湾一家公司培训<pg9 ad admin>时,有个学员提及WAL里记录的内容为Query时的SQL语句(比 ...
- Android Resource介绍和使用
1. 相关文件夹介绍 文件 取值方式 string.xml getResource().getString(resourceId)或者getResource().getText(resourceId) ...
- strtus2.3 java.lang.NoSuchFieldException: DEFAULT_PARAM>
strtus2.3.15.1 的bug请下载 http://download.csdn.net/detail/livalue/6229373 或加群到群共享中下载.214579879
- HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))
继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- SQL练习之不破坏应用程序现有查询的修改模式
当我还是一个菜鸟的时候,当然现在也是,当我的软件需求发生变化时,并且数据库设计同样要求发生变化,我通常会放弃原有的代码(或者对原有的代码进行大改),先在我知道了两个不破坏应用程序现有查询的修改模式,下 ...