using FastJSON; using System; using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Security.Cryptography; using System.Text; using Top.Api.Parser; namespace Top.Api.Util { /// /// TOP系统工具类。 /// public abstract class TopUtils { private static readonly JSONParameters jp = new JSONParameters(); private static string intranetIp; static TopUtils() { jp.UseApiNamingStyle = true; jp.UseExtensions = false; jp.SerializeNullValues = false; } /// /// 给TOP请求签名。 /// /// 所有字符型的TOP请求参数 /// 签名密钥 /// 签名方法,可选值:md5, hmac /// 签名 public static string SignTopRequest(IDictionary parameters, string secret, string signMethod) { return SignTopRequest(parameters, null, secret, signMethod); } /// /// 给TOP请求签名。 /// /// 所有字符型的TOP请求参数 /// 请求主体内容 /// 签名密钥 /// 签名方法,可选值:md5, hmac /// 签名 public static string SignTopRequest(IDictionary parameters, string body, string secret, string signMethod) { // 第一步:把字典按Key的字母顺序排序 IDictionary sortedParams = new SortedDictionary(parameters, StringComparer.Ordinal); // 第二步:把所有参数名和参数值串在一起 StringBuilder query = new StringBuilder(); if (Constants.SIGN_METHOD_MD5.Equals(signMethod)) { query.Append(secret); } foreach (KeyValuePair kv in sortedParams) { if (!string.IsNullOrEmpty(kv.Key) && !string.IsNullOrEmpty(kv.Value)) { query.Append(kv.Key).Append(kv.Value); } } // 第三步:把请求主体拼接在参数后面 if (!string.IsNullOrEmpty(body)) { query.Append(body); } // 第四步:使用MD5/HMAC加密 byte[] bytes; if (Constants.SIGN_METHOD_HMAC.Equals(signMethod)) { HMACMD5 hmac = new HMACMD5(Encoding.UTF8.GetBytes(secret)); bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(query.ToString())); } else if (Constants.SIGN_METHOD_HMAC_SHA256.Equals(signMethod)) { HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret)); bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(query.ToString())); } else { query.Append(secret); MD5 md5 = MD5.Create(); bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString())); } // 第五步:把二进制转化为大写的十六进制 StringBuilder result = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { result.Append(bytes[i].ToString("X2")); } return result.ToString(); } /// /// 清除字典中值为空的项。 /// /// 待清除的字典 /// 清除后的字典 public static IDictionary CleanupDictionary(IDictionary dict) { IDictionary newDict = new Dictionary(dict.Count); foreach (KeyValuePair kv in dict) { if (kv.Value != null) { newDict.Add(kv.Key, kv.Value); } } return newDict; } /// /// 把对象转换为JSON字符串。 /// public static string ObjectToJson(object obj) { return JSON.ToJSON(obj, jp); } /// /// 把对象转换为JSON字符串。 /// public static string ObjectToJson(object obj, JSONParameters newjp) { return JSON.ToJSON(obj, newjp); } /// /// 把JSON字符串转换为对象。 /// public static object JsonToObject(string json) { return JSON.Parse(json); } /// /// 把JSON解释为API响应对象。 /// /// API响应类型 /// JSON字符串 /// API响应对象 public static T ParseResponse(string json) where T : TopResponse { TopJsonParser parser = new TopJsonParser(); return parser.Parse(json); } /// /// 获取从1970年1月1日到现在的毫秒总数。 /// /// 毫秒数 public static long GetCurrentTimeMillis() { return (long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds; } /// /// 获取本机的局域网IP。 /// public static string GetIntranetIp() { if (intranetIp == null) { NetworkInterface[] nis = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface ni in nis) { if (OperationalStatus.Up == ni.OperationalStatus && (NetworkInterfaceType.Ethernet == ni.NetworkInterfaceType || NetworkInterfaceType.Wireless80211 == ni.NetworkInterfaceType)) { foreach (UnicastIPAddressInformation info in ni.GetIPProperties().UnicastAddresses) { if (AddressFamily.InterNetwork == info.Address.AddressFamily) { intranetIp = info.Address.ToString(); break; } } if (intranetIp != null) break; } } } if (intranetIp == null) { intranetIp = "127.0.0.1"; } return intranetIp; } } }