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. java之多态(Polymorphic)、动态绑定(Dynamic Binding)、迟绑定(Late Binding)

    今天,我们来说说java面向对象最核心的东西,多态.通过多态可以使我们的程序可复用性达到极致,这就是我们为什么要学多态的原因. “多态”(Polymorphic)也叫“动态绑定”(Dynamic Bi ...

  2. Can't get WebApplicationContext object from ContextRegistry.GetContext(): Resource handler for the 'web' protocol is not defined

    I'm stucked in configuring my web.config file under a web forms project in order to get an instance ...

  3. make no mistake, we are the last line of defense.

    make no mistake, we are the last line of defense.

  4. 【MongoDB】windows平台搭建Mongo数据库复制集(类似集群)(转)

    原文链接:[MongoDB]windows平台搭建Mongo数据库复制集(类似集群)(一) Replica  Sets(复制集)是在mongodDB1.6版本开始新增的功能,它可以实现故障自动切换和自 ...

  5. spring 启动流程

    AbstractApplicationContext 分析 启动流程 // Prepare this context for refreshing.prepareRefresh(); 1. // In ...

  6. 从头学Qt Quick(1) --体验快速构建动态效果界面

    自2005年Qt4发布以来,Qt已经为成千上万的应用程序提供了框架服务,现在Qt已经基本上支持所有的开发平台了,这里面既包含了桌面.嵌入式领域,也包括了Android.IOS.WP等移动操作平台,甚至 ...

  7. MyBatis知多少(2)

    MyBatis从目前最流行的关系数据库访问方法中吸收了大量的优秀特征和思想,并找出其中的协同增效作用.下图展示了MyBatis框架是如何吸收我们在多年使用不同方式进行数据库集成的 开发过程中所学到的知 ...

  8. Physical Based Shading in Unreal Engine 3

    Roughness = 0.1roughness = 0.4roughness = 0.7roughness = 0.999 以上的Fresnel 0° = {1.0,0.86.0.57}(PS: 近 ...

  9. 事务复制中的snapshot

        Snapshot agent读取article的信息,将article的内容和脚本放置到snapshot文件夹中: 接下来distribution agent会读取这些快照文件,传输到订阅,完 ...

  10. java中图片文件的判断

    javax.imageio 类 ImageIO BufferedImage bi = ImageIO.read(resFile);//resFile --- InputStream if(bi == ...