niuzinb 2025-11-05 18:39 采纳率: 0%
浏览 5

Asp.Net Core6.0接入企业微信

我使用的是asp.net core 6.0 webapi想接入企业微信api接收消息,写入了添加日志已经获取到了signature,timestamp,nonce。并且Token也是从网页上复制下来的。域名也没有问题,用过这个域名接入过其他api但是我得到的签名和signature(企业微信的签名还是不一样)

img


这是通过行为日志获取到的数据,generatedSignature为我的签名,signature为企业微信的签名

  [HttpGet("callback")]
  public IActionResult VerifyCallback()
  {
      var requestUrl = Request.GetDisplayUrl();

      string token = "3EaLwQCJdDx7n5wviXMd9VQyS".Trim('\r', '\n', '\t', ' ', ' ');

      var signature = Request.Query["msg_signature"].ToString().Trim('\r', '\n', '\t', ' ', ' ');
      var timestamp = Request.Query["timestamp"].ToString().Trim('\r', '\n', '\t', ' ', ' ');
      var nonce = Request.Query["nonce"].ToString().Trim('\r', '\n', '\t', ' ', ' ');

      _log_Service.Add_Action_Log(new Infrastructure.EFCore.Mysql.Actionlog()
      {
          Alid = Config.GUID2(),
          AlapiUrl = "VerifyCallback",
          AlcreateTime = DateTime.Now,
          AlresultMessage = $"收到回调验证请求:signature={signature}, timestamp={timestamp}, nonce={nonce}",
          Aldesc = requestUrl
      });

      var arr = new[] { token, timestamp, nonce };
      Array.Sort(arr, StringComparer.Ordinal); // 纯ASCII码排序,和企业微信完全一致
      string sortedStr = string.Join("", arr);
      _log_Service.Add_Action_Log(new Infrastructure.EFCore.Mysql.Actionlog()
      {
          Alid = Config.GUID2(),
          AlapiUrl = "VerifyCallback",
          AlcreateTime = DateTime.Now,
          AlresultMessage = $"排序后字符串: {sortedStr}"
      });

      using var sha1 = System.Security.Cryptography.SHA1.Create();
      var utf8NoBom = new UTF8Encoding(false); // 无BOM,和企业微信编码规则对齐
      byte[] hashBytes = sha1.ComputeHash(utf8NoBom.GetBytes(sortedStr));

      StringBuilder generatedSignatureSb = new StringBuilder();
      foreach (byte b in hashBytes)
      {
          generatedSignatureSb.Append(b.ToString("x2")); // 强制两位小写十六进制(如0a而非A)
      }
      string generatedSignature = generatedSignatureSb.ToString();

      _log_Service.Add_Action_Log(new Infrastructure.EFCore.Mysql.Actionlog()
      {
          Alid = Config.GUID2(),
          AlapiUrl = "VerifyCallback",
          AlcreateTime = DateTime.Now,
          AlresultMessage = $"generatedSignature:{generatedSignature}, signature:{signature}"
      });

      var isVerifySuccess = generatedSignature == signature;
      if (isVerifySuccess)
      {
          _log_Service.Add_Action_Log(new Infrastructure.EFCore.Mysql.Actionlog()
          {
              Alid = Config.GUID2(),
              AlapiUrl = "VerifyCallback",
              AlcreateTime = DateTime.Now,
              AlresultMessage = "回调验证通过",
              Aldesc = $"generatedSignature:{generatedSignature}, signature:{signature}"
          });
          Response.ContentType = "text/plain; charset=UTF-8"; // 显式指定响应格式
          return Content(Request.Query["echostr"].ToString().Trim('\r', '\n', '\t', ' ', ' '));
      }
      else
      {
          _log_Service.Add_Error(new Infrastructure.EFCore.Mysql.Errorlog()
          {
              Elapi = "VerifyCallback",
              Elid = Config.GUID2(),
              ElcreateTime = DateTime.Now,
              Elmessage = "回调验证失败(签名不匹配)"
          });
          return BadRequest("签名不匹配");
      }
  } 
  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-11-05 18:53
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解决方案

    首先,确保你已经正确获取了企业微信的 Token、Signature、Timestamp 和 Nonce。接下来,你需要使用这些信息来验证企业微信的消息是否合法。

    步骤 1:验证企业微信消息

    使用以下 C# 代码来验证企业微信的消息:

    using System;
    using System.Security.Cryptography;
    using System.Text;
    using System.Xml;
    
    public class WeChatValidator
    {
        public bool Validate(string signature, string timestamp, string nonce, string token, string xml)
        {
            // 1. 将 token、timestamp、nonce 三个参数进行字典序排序
            var sortedArray = new[] { token, timestamp, nonce }.OrderBy(x => x).ToArray();
    
            // 2. 将排序后的数组进行 SHA1 加密
            var sha1 = SHA1.Create();
            var bytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(string.Join("", sortedArray)));
    
            // 3. 将加密后的字节数组转换为 16 进制字符串
            var hash = BitConverter.ToString(bytes).Replace("-", "").ToLower();
    
            // 4. 将 hash 值与 signature 进行比较
            return hash == signature;
        }
    }
    

    步骤 2:解析企业微信消息

    使用以下 C# 代码来解析企业微信的消息:

    using System.Xml;
    
    public class WeChatMessageParser
    {
        public string GetMessageType(string xml)
        {
            var xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xml);
    
            // 1. 获取消息类型
            var messageType = xmlDoc.SelectSingleNode("//MsgType").InnerText;
    
            return messageType;
        }
    }
    

    步骤 3:处理企业微信消息

    根据消息类型进行相应处理:

    public class WeChatMessageHandler
    {
        public void HandleMessage(string messageType, string xml)
        {
            switch (messageType)
            {
                case "text":
                    // 处理文本消息
                    break;
                case "image":
                    // 处理图片消息
                    break;
                case "voice":
                    // 处理语音消息
                    break;
                case "video":
                    // 处理视频消息
                    break;
                case "location":
                    // 处理位置消息
                    break;
                case "link":
                    // 处理链接消息
                    break;
                default:
                    break;
            }
        }
    }
    

    总结

    以上是解决方案的基本步骤。具体的实现细节可能会根据你的需求进行调整。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月5日