| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- 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;
- }
- }
- }
|