Maison  >  Article  >  Applet WeChat  >  Explication détaillée d'exemples de développement de messages de vérification WeChat avec asp.net

Explication détaillée d'exemples de développement de messages de vérification WeChat avec asp.net

Y2J
Y2Joriginal
2017-04-25 11:28:171727parcourir

Vérifiez l'authenticité du message

Ajoutez un filtre dans le projet où se trouve le contrôleur MVC, et réécrivez-le dans le filtre

public override void OnActionExecuting( ActionExecutingContext filterContext) méthode

Nouveau modèle de données

Remarque : lorsque le serveur reçoit le message, ce n'est pas le cas. signature plus longue mais msg_signature

Exemple de message de requête HTTP du serveur WeChat pour envoyer le message au serveur

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

Hôte : qy. weixin.qq.com

réécriture de la méthode pour implémenter la vérification des messages

La méthode de vérification lors de l'appel de l'accès WeChat, mais les paramètres doivent être légèrement modifiés, en utilisant le nouveau modèle de données

Ajouter un attribut de filtre dans la méthode Action ou sur le contrôleur

Exemple de code

Modèle


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

Filtre

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;
      }
    }
  }

Code du contrôleur

/// <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, 0, (int)stream.Length);
              string postString = System.Text.Encoding.UTF8.GetString(postBytes);
              Handle(postString,model);
            }
          }
        }
        catch (Exception ex)
        {
          logger.Error("发生异常,异常信息:" + ex.Message + ex.StackTrace);
        }
      }
    }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn