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 
 | 
{ 
 | 
    /// <summary> 
 | 
    /// TOP系统工具类。 
 | 
    /// </summary> 
 | 
    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; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 给TOP请求签名。 
 | 
        /// </summary> 
 | 
        /// <param name="parameters">所有字符型的TOP请求参数</param> 
 | 
        /// <param name="secret">签名密钥</param> 
 | 
        /// <param name="signMethod">签名方法,可选值:md5, hmac</param> 
 | 
        /// <returns>签名</returns> 
 | 
        public static string SignTopRequest(IDictionary<string, string> parameters, string secret, string signMethod) 
 | 
        { 
 | 
            return SignTopRequest(parameters, null, secret, signMethod); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 给TOP请求签名。 
 | 
        /// </summary> 
 | 
        /// <param name="parameters">所有字符型的TOP请求参数</param> 
 | 
        /// <param name="body">请求主体内容</param> 
 | 
        /// <param name="secret">签名密钥</param> 
 | 
        /// <param name="signMethod">签名方法,可选值:md5, hmac</param> 
 | 
        /// <returns>签名</returns> 
 | 
        public static string SignTopRequest(IDictionary<string, string> parameters, string body, string secret, string signMethod) 
 | 
        { 
 | 
            // 第一步:把字典按Key的字母顺序排序 
 | 
            IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters, StringComparer.Ordinal); 
 | 
  
 | 
            // 第二步:把所有参数名和参数值串在一起 
 | 
            StringBuilder query = new StringBuilder(); 
 | 
            if (Constants.SIGN_METHOD_MD5.Equals(signMethod)) 
 | 
            { 
 | 
                query.Append(secret); 
 | 
            } 
 | 
            foreach (KeyValuePair<string, string> 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(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 清除字典中值为空的项。 
 | 
        /// </summary> 
 | 
        /// <param name="dict">待清除的字典</param> 
 | 
        /// <returns>清除后的字典</returns> 
 | 
        public static IDictionary<string, T> CleanupDictionary<T>(IDictionary<string, T> dict) 
 | 
        { 
 | 
            IDictionary<string, T> newDict = new Dictionary<string, T>(dict.Count); 
 | 
  
 | 
            foreach (KeyValuePair<string, T> kv in dict) 
 | 
            { 
 | 
                if (kv.Value != null) 
 | 
                { 
 | 
                    newDict.Add(kv.Key, kv.Value); 
 | 
                } 
 | 
            } 
 | 
  
 | 
            return newDict; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 把对象转换为JSON字符串。 
 | 
        /// </summary> 
 | 
        public static string ObjectToJson(object obj) 
 | 
        { 
 | 
            return JSON.ToJSON(obj, jp); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 把对象转换为JSON字符串。 
 | 
        /// </summary> 
 | 
        public static string ObjectToJson(object obj, JSONParameters newjp) 
 | 
        { 
 | 
            return JSON.ToJSON(obj, newjp); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 把JSON字符串转换为对象。 
 | 
        /// </summary> 
 | 
        public static object JsonToObject(string json) 
 | 
        { 
 | 
            return JSON.Parse(json); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 把JSON解释为API响应对象。 
 | 
        /// </summary> 
 | 
        /// <typeparam name="T">API响应类型</typeparam> 
 | 
        /// <param name="json">JSON字符串</param> 
 | 
        /// <returns>API响应对象</returns> 
 | 
        public static T ParseResponse<T>(string json) where T : TopResponse 
 | 
        { 
 | 
            TopJsonParser<T> parser = new TopJsonParser<T>(); 
 | 
            return parser.Parse(json); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 获取从1970年1月1日到现在的毫秒总数。 
 | 
        /// </summary> 
 | 
        /// <returns>毫秒数</returns> 
 | 
        public static long GetCurrentTimeMillis() 
 | 
        { 
 | 
            return (long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 获取本机的局域网IP。 
 | 
        /// </summary> 
 | 
        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; 
 | 
        } 
 | 
    } 
 | 
} 
 |