You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
2.4 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Ds.Module.WeChat.Models;
using System.Security.Cryptography;
using System.Text;
namespace Ds.Module.WeChat.Utilities
{ /// <summary>签名验证类</summary>
public class CheckSignature
{
/// <summary>在网站没有提供Token或传入为null的情况下的默认Token建议在网站中进行配置。</summary>
public const string Token = "weixin";
/// <summary>检查签名是否正确</summary>
/// <param name="signature"></param>
/// <param name="postModel">需要提供Timestamp、Nonce、Token</param>
/// <returns></returns>
public static bool Check(string signature, PostModel postModel) => CheckSignature.Check(signature, postModel.Timestamp, postModel.Nonce, postModel.Token);
/// <summary>检查签名是否正确</summary>
/// <param name="signature"></param>
/// <param name="timestamp"></param>
/// <param name="nonce"></param>
/// <param name="token"></param>
/// <returns></returns>
public static bool Check(string signature, string timestamp, string nonce, string token = null) => signature == CheckSignature.GetSignature(timestamp, nonce, token);
/// <summary>返回正确的签名</summary>
/// <param name="postModel">需要提供Timestamp、Nonce、Token</param>
/// <returns></returns>
public static string GetSignature(PostModel postModel) => CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, postModel.Token);
/// <summary>返回正确的签名</summary>
/// <param name="timestamp"></param>
/// <param name="nonce"></param>
/// <param name="token"></param>
/// <returns></returns>
public static string GetSignature(string timestamp, string nonce, string token = null)
{
token = token ?? "weixin";
string s = string.Join("", ((IEnumerable<string>)new string[3]
{
token,
timestamp,
nonce
}).OrderBy<string, string>((Func<string, string>)(z => z)).ToArray<string>());
byte[] hash = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(s));
StringBuilder stringBuilder = new StringBuilder();
foreach (byte num in hash)
stringBuilder.AppendFormat("{0:x2}", (object)num);
return stringBuilder.ToString();
}
}
}