架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 39914|回复: 3

[资料] c# 微信发送的token验证

[复制链接]
发表于 2016-8-23 15:49:49 | 显示全部楼层 |阅读模式
QQ截图20160823154155.jpg QQ截图20160823154410.jpg

这个token验证,我根本没有从微信官方找到相关文档,

我没找到文档,咋知道微信这个token验证到底是怎么验证的???

只能上网搜索,发现验证如下:

在Url对应的处理方法中,获取传递的参数,进行加密/校验
流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信


然后,知道这个玩意了,我就直接把微信get请求过来的url连接记录下来,方便自己调试。

最后,写了个加密方法如下:

  1. /// <summary>
  2.         /// sign签名
  3.         /// </summary>
  4.         /// <param name="dic"></param>
  5.         /// <returns></returns>
  6.         public static string Sign(string[] dic)
  7.         {
  8.             //将token、timestamp、nonce三个参数进行字典序排序
  9.             Array.Sort(dic);//字典排序
  10.             string tmpStr = string.Join("", dic);
  11.             return SHA1(tmpStr).ToLower();
  12.         }
复制代码


这里是直接把value进行排序,并不是根据key排序取value,我一开始犯了这个错误,

因为一般都是key排序,然后key加value一起加密,或者只把value加密。。。


最后把加密后的string和signture做比较,如果对,直接返回微信服务器发送给你的echostr参数。

如果,你偷懒的话,直接返回echostr参数值算了。




上一篇:c# 阿里大于发送短信demo源码下载
下一篇:xml反序列化XML 文档(1, 2)中有错误。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2016-8-23 15:53:51 | 显示全部楼层
  1. public void Auth()
  2.         {
  3.             string echoStr = HttpContext.Current.Request.QueryString["echostr"];
  4.             if (CheckSignature()) //校验签名是否正确
  5.             {
  6.                 if (!string.IsNullOrEmpty(echoStr))
  7.                 {
  8.                     HttpContext.Current.Response.Write(echoStr); //返回原值表示校验成功
  9.                     HttpContext.Current.Response.End();
  10.                 }
  11.             }
  12.         }

  13.         /// <summary>
  14.         /// 验证微信签名
  15.         /// * 将token、timestamp、nonce三个参数进行字典序排序
  16.         /// * 将三个参数字符串拼接成一个字符串进行sha1加密
  17.         /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
  18.         /// </summary>
  19.         /// <returns></returns>
  20.         private bool CheckSignature()
  21.         {
  22.             string signature = HttpContext.Current.Request.QueryString["signature"];
  23.             string timestamp = HttpContext.Current.Request.QueryString["timestamp"];
  24.             string nonce = HttpContext.Current.Request.QueryString["nonce"];
  25.             //加密/校验流程:
  26.             //1. 将token、timestamp、nonce三个参数进行字典序排序
  27.             string[] ArrTmp = { ConfigHelper.Token, timestamp, nonce };
  28.             Array.Sort(ArrTmp);//字典排序
  29.             //2.将三个参数字符串拼接成一个字符串进行sha1加密
  30.             string tmpStr = string.Join("", ArrTmp);
  31.             tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
  32.             tmpStr = tmpStr.ToLower();
  33.             //3.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
  34.             if (tmpStr == signature)
  35.             {
  36.                 return true;
  37.             }
  38.             else
  39.             {
  40.                 return false;
  41.             }
  42.         }
复制代码
  1.     public class HomeController :BaseController
  2.     {

  3.         private const string Token = "TokenWeiXin";

  4.         [HttpGet]
  5.         [ActionName("Index")]
  6.         public ActionResult Get(string signature, string timestamp, string nonce, string echostr)
  7.         {
  8.             if (CheckSignature.Check(signature, timestamp, nonce, Token))
  9.                 return Content(echostr);//返回随机字符串则表示验证通过
  10.             else
  11.                 //return Content("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token));
  12.                 return View();
  13.         }

  14.         [HttpPost]
  15.         [ActionName("Index")]
  16.         public ActionResult Post(string signature, string timestamp, string nonce, string echostr)
  17.         {
  18.             if (!CheckSignature.Check(signature, timestamp, nonce, Token))
  19.             {
  20.                 return Content("参数错误!");
  21.             }

  22.             var messageHandler = new CustomMessageHandler(Request.InputStream);//接收消息

  23.             messageHandler.Execute();//执行微信处理过程

  24.             return new WeixinResult(messageHandler);
  25.         }
  26.     }
复制代码


网上找的
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2016-8-24 13:06:07 | 显示全部楼层
http://mp.weixin.qq.com/wiki/4/2ccadaef44fe1e4b0322355c2312bfa8.html

找到文档了

在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。
此后,每次开发者接收用户消息的时候,微信也都会带上前面三个参数(signature、timestamp、nonce)访问开发者设置的URL,开发者依然通过对签名的效验判断此条消息的真实性。效验方式与首次提交验证申请一致。
参数描述
signature微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp时间戳
nonce随机数
echostr随机字符串
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
加密/校验流程如下:1. 将token、timestamp、nonce三个参数进行字典序排序2. 将三个参数字符串拼接成一个字符串进行sha1加密3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-10-7 20:56:07 | 显示全部楼层
  这些大公司  开放文档不友好
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-12-22 00:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表