ASP.NET MVC 微信公共平台开发

验证消息的真实性

  1. 在MVC Controller所在项目中添加过滤器,在过滤器中重写

    public override void OnActionExecuting(ActionExecutingContext filterContext)方法

  1. 新建数据模型

    注:服务器接收消息时,不再是signature而是msg_signature

    微信服务器推送消息到服务器的HTTP请求报文示例

    POST /cgi-bin/wxpush? msg_signature=477715d11cdb4164915debcba66cb864d751f3e6&timestamp=1409659813&nonce=1372623149 HTTP/1.1

    Host: qy.weixin.qq.com

  2. 方法重写,实现对消息的验证

    调用微信接入时验证的方法,不过参数需要小改动一下,采用新建的数据模型

  3. 在Action方法或在Controller上添加过滤器属性

  4. 代码示例
         /// <summary>
    /// 微信推送消息模型
    /// </summary>
    public class WeChatMsgRequestModel
    {
    public string timestamp { get; set; }
    public string nonce { get; set; } public string msg_signature { get; set; }
    }

    Model

     public class WeChatRequestValidAttribute : ActionFilterAttribute
    {
    private const string Token = "StupidMe"; public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
    //参数适配
    Model.FormatModel.WeChatMsgRequestModel model = new Model.FormatModel.WeChatMsgRequestModel() { nonce= filterContext.HttpContext.Request.QueryString["nonce"],msg_signature= filterContext.HttpContext.Request.QueryString["msg_signature"],timestamp= filterContext.HttpContext.Request.QueryString["timestamp"] };
    //验证
    if (CheckSignature(model))
    {
    base.OnActionExecuting(filterContext);
    }
    } private bool CheckSignature(Model.FormatModel.WeChatMsgRequestModel model)
    {
    string signature, timestamp, nonce, tempStr;
    //获取请求来的参数
    signature = model.msg_signature;
    timestamp = model.timestamp;
    nonce = model.nonce;
    //创建数组,将 Token, timestamp, nonce 三个参数加入数组
    string[] array = { Token, timestamp, nonce };
    //进行排序
    Array.Sort(array);
    //拼接为一个字符串
    tempStr = String.Join("", array);
    //对字符串进行 SHA1加密
    tempStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tempStr, "SHA1").ToLower();
    //判断signature 是否正确
    if (tempStr.Equals(signature))
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    }

    Filter

             /// <summary>
    /// 日志助手
    /// </summary>
    private static Common.LogHelper logger = new Common.LogHelper(typeof(HomeController)); [Filters.WeChatRequestValid]
    public void Valid(Model.FormatModel.WeChatMsgRequestModel model)
    {
    if (ModelState.IsValid)
    {
    try
    {
    //判断是否是POST请求
    if (HttpContext.Request.HttpMethod.ToUpper() == "POST")
    {
    //从请求的数据流中获取请求信息
    using (Stream stream = HttpContext.Request.InputStream)
    {
    byte[] postBytes = new byte[stream.Length];
    stream.Read(postBytes, , (int)stream.Length);
    string postString = System.Text.Encoding.UTF8.GetString(postBytes);
    Handle(postString,model);
    }
    }
    }
    catch (Exception ex)
    {
    logger.Error("发生异常,异常信息:" + ex.Message + ex.StackTrace);
    }
    }
    }

    Controller Code

ASP.NET MVC 微信公共平台开发之验证消息的真实性的更多相关文章

  1. ASP.NET MVC 微信公共平台开发之获取用户消息并处理

    ASP.NET MVC 微信公共平台开发 获取用户消息并处理 获取用户消息 用户发送的消息是在微信服务器发送的一个HTTP POST请求中包含的,获取用户发送的消息要从POST请求的数据流中获取 微信 ...

  2. ASP.NET MVC 微信公共平台开发之 微信接入

    ASP.NET MVC 接入微信公共平台 申请微信公共账号 既然要接入微信公共平台,微信公共号是必须的(当然如果只是测试的话也可以申请微信公共平台接口测试账号),来这里微信公共平台 申请微信公共号(注 ...

  3. 微信公众平台开发,模板消息,网页授权,微信JS-SDK,二维码生成(4)

    微信公众平台开发,模板消息,什么是模板消息,模板消息接口指的是向用户发送重要的服务通知,只能用于符合场景的要求中去,如信用卡刷卡通知,购物成功通知等等.不支持广告营销,打扰用户的消息,模板消息类有固定 ...

  4. php版微信公众平台开发之验证步骤实例详解

    本文实例讲述了php版微信公众平台开发之验证步骤.分享给大家供大家参考,具体如下: 微信公众平台开发我们现在做得比较多了,这里给各位介绍的是一个入门级别的微信公众平台验证基础知识了,有兴趣的和小编来看 ...

  5. [ASP.NET MVC]如何定制Numeric属性/字段验证消息

    原文:[ASP.NET MVC]如何定制Numeric属性/字段验证消息 对于一个Numeric属性/字段,ASP.NET MVC会自动进行数据类型的验证(客户端验证),以确保输入的是一个有效的数字, ...

  6. [转][ASP.NET MVC]如何定制Numeric属性/字段验证消息

    本文转自:http://www.cnblogs.com/artech/archive/2012/02/13/NumericPropertyValidation.html 对于一个Numeric属性/字 ...

  7. 微信公共平台开发-(.net实现)1--成为开发者

    刚换了个新环境,哎这都快一个月了,还没适应过来,还是怀念老地方呀.老板让开发一个基于微信平台的开发项目,而且是用net实现.当时就蒙了,微信就用了一会个人赶脚不好,所以果断不用,现在让开发,而且查了一 ...

  8. 微信公共平台开发1 .net

    如果想通过微信去开发(当然,指的是开发模式下),首先 建议先申请一个服务号,因为服务号的功能与接口也多,有些功能订阅号是实现不了的.另外申请过以后必须得通过微信 认证才能开发,好像是得付300大洋,高 ...

  9. 微信公共平台开发-(.net实现)5--access_token过期的问题

    每次在于微信交互时,都要用到access_token,但是这个值限制的是有时间的,但是access_token,在以后的高级功能里面会经常用到,所以这里不得不这里对前面所讲解的access_token ...

随机推荐

  1. python高效解析日志入库

    python脚本解析日志文件入库一般有三个重要的步骤:读文件.解析文件.入库.在这三个方面下功夫,可确保我们获得最优的性能(这里不讨论并发) 1 读文件:一次读一行,磁盘IO太多,效率低下:一次性读如 ...

  2. Ruby on Rails 和 J2EE:两者能否共存?

    http://www.ibm.com/developerworks/cn/java/wa-rubyonrails/

  3. codeforces B. Design Tutorial: Learn from Life

    题意:有一个电梯,每一个人都想乘电梯到达自己想要到达的楼层!从a层到b层的时间是|a-b|, 乘客上下电梯的时间忽略不计!问最少需要多少的时间....     这是一道神题啊,自己的思路不知不觉的就按 ...

  4. 【转载】Grunt常用插件介绍

    项目名称 grunt-contrib v0.8.0 项目地址 https://github.com/gruntjs/grunt-contrib 项目介绍 此项目是对grunt常用插件的集合,刚接触gr ...

  5. eclispe使用外部tomcat总结

    1. 配置tomcat Servers-->new 配置tomcat的路径,即可 2. 增加/移除application 注意:移除application时请使用"clean" ...

  6. js-条件语句、循环语句

    一. 常见条件语句 if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if... ...

  7. 微软IIS对http keep-alive的“霸道”处理

    大家都知道在IIS中有个HTTP keep-alive设置,见下图: 很多人可能和我们一样,以为这样设置后,IIS会就在发送响应内容时加上这个http header——Connection: keep ...

  8. ActiveMQ学习(三)——MQ的通讯模式

    1) 点对点通讯:点对点方式是最为传统和常见的通讯方式,它支持一对一.一对多.多对多.多对一等多种配置方式,支持树状.网状等多种拓扑结构. 2) 多点广播:MQ适用于不同类型的应用.其中重要的,也是正 ...

  9. R语言简单实现聚类分析计算与分析(基于系统聚类法)

    聚类分析计算与分析(基于系统聚类法) 下面以一个具体的例子来实现实证分析.2008年我国其中31个省.市和自治区的农村居民家庭平均每人全年消费性支出. 根据原始数据对我国省份进行归类统计. 原始数据如 ...

  10. Visual Studio Code初探

    作者:Grey 本文的GIF动画均使用ScreenToGif进行录制. 摘要 微软今年发布了一款运行于 OS X,Windows 和 Linux 之上的免费跨平台编辑器: Visual Studio ...