using System;
|
using System.Collections.Generic;
|
using System.Security.Cryptography;
|
using System.Text;
|
|
namespace Top.Api.Util
|
{
|
public class DingTalkSignatureUtil
|
{
|
private static string DEFAULT_ENCODING = "UTF-8";
|
|
/* Signature method. */
|
private static string ALGORITHM = "HmacSHA256";
|
|
private static string NEW_LINE = "\n";
|
|
// 获取签名所需要的字符串
|
public static string GetCanonicalStringForIsv(long timestamp, string suiteTicket)
|
{
|
StringBuilder canonicalString = new StringBuilder();
|
canonicalString.Append(timestamp);
|
if (suiteTicket != null)
|
{
|
canonicalString.Append(NEW_LINE).Append(suiteTicket);
|
}
|
|
return canonicalString.ToString();
|
}
|
|
/**
|
* 计算签名
|
* @param canonicalString 签名
|
* @param secret 签名秘钥
|
* @return
|
*/
|
public static string ComputeSignature(string secret, string canonicalString)
|
{
|
byte[] signData = Sign(Encoding.UTF8.GetBytes(canonicalString), Encoding.UTF8.GetBytes(secret));
|
return Convert.ToBase64String(signData);
|
}
|
|
|
private static byte[] Sign(byte[] key, byte[] data)
|
{
|
HMACSHA256 sha256 = new HMACSHA256(data);
|
return sha256.ComputeHash(key);
|
}
|
|
// 拼接url参数
|
public static String ParamToQueryString(IDictionary<String, String> param, String charset)
|
{
|
|
if (param == null || param.Count == 0) {
|
return null;
|
}
|
|
StringBuilder paramString = new StringBuilder();
|
bool first = true;
|
foreach (string key in param.Keys)
|
{
|
string value = param[key];
|
|
|
if (!first)
|
{
|
paramString.Append("&");
|
}
|
|
// Urlencode each request parameter
|
paramString.Append(UrlEncode(key, charset));
|
if (value != null)
|
{
|
paramString.Append("=").Append(DingTalkSignatureUtil.UrlEncode(value, charset));
|
}
|
|
first = false;
|
}
|
|
return paramString.ToString();
|
}
|
|
/**
|
* Encode a URL segment with special chars replaced.
|
*/
|
public static String UrlEncode(String value, String encoding)
|
{
|
if (value == null)
|
{
|
return "";
|
}
|
|
|
String encoded = System.Web.HttpUtility.UrlEncode(value, System.Text.Encoding.UTF8);
|
return encoded.Replace("+", "%20").Replace("*", "%2A")
|
.Replace("~", "%7E").Replace("/", "%2F");
|
}
|
|
/**
|
* 生成随机数
|
* @return
|
*/
|
public static String GetRandomStr(int count)
|
{
|
String value = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
Random random = new Random();
|
StringBuilder sb = new StringBuilder();
|
for (int i = 0; i < count; i++)
|
{
|
int number = random.Next(value.Length);
|
sb.Append(CharAt(value, number));
|
}
|
return sb.ToString();
|
}
|
|
public static string CharAt(string value, int index)
|
{
|
if (index >= value.Length || index < 0)
|
{
|
return "";
|
}
|
return value.Substring(index, 1);
|
}
|
}
|
}
|