using System.Collections.Generic; using System.Text; using System.Security.Cryptography; using System.Web; namespace Jd.ACES.Utils { public class WebUtils { /// /// 给Jd请求签名。 /// /// 所有字符型的Jd请求参数 /// 签名密钥 /// 是否前后都加密钥进行签名 /// 签名 public static string SignJdRequest(IDictionary parameters, string secret, bool qhs) { // 第一步:把字典按Key的字母顺序排序 IDictionary sortedParams = new SortedDictionary(parameters); IEnumerator> dem = sortedParams.GetEnumerator(); // 第二步:把所有参数名和参数值串在一起 StringBuilder query = new StringBuilder(secret); while (dem.MoveNext()) { string key = dem.Current.Key; string value = dem.Current.Value; if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value)) { query.Append(key).Append(value); } } if (qhs) { query.Append(secret); } // 第三步:使用MD5加密 MD5 md5 = MD5.Create(); byte[] 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(); } /// /// 组装普通文本请求参数。 /// /// Key-Value形式请求参数字典 /// URL编码后的请求数据 public static string BuildQuery(IDictionary parameters) { StringBuilder postData = new StringBuilder(); bool hasParam = false; IEnumerator> dem = parameters.GetEnumerator(); while (dem.MoveNext()) { string name = dem.Current.Key; string value = dem.Current.Value; // 忽略参数名或参数值为空的参数 if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(value)) { if (hasParam) { postData.Append("&"); } postData.Append(name); postData.Append("="); postData.Append(HttpUtility.UrlEncode(value, Encoding.UTF8)); hasParam = true; } } return postData.ToString(); } } }