/// <summary> /// 使用UTF-8进行MD5签名 /// 忽略参数中存的_queue_sign和value为空的键值对 /// 最后&key={key} /// </summary> /// <param name="parameters"></param> /// <param name="key">签名密钥</param> /// <returns></returns> public static string Sign(IDictionary parameters, string key, MD5_Format format = MD5_Format.UPPER) { string str_sign = string.Empty; if (parameters != null && parameters.Count > 0) { Dictionary <string, string> parameters_temp = new Dictionary <string, string>(); foreach (DictionaryEntry item in parameters) { string val = (item.Value == null) ? string.Empty : item.Value.ToString(); parameters_temp.Add((string)item.Key, val); } str_sign = _Sign(parameters_temp, key, format); } return(str_sign); }
/// <summary> /// 给请求参数签名 /// </summary> /// <param name="parameters">所有字符型的请求参数,忽略参数中存的_queue_sign</param> /// <param name="key">签名密钥</param> /// <param name="qhs">是否前后都加密钥进行签名</param> /// <returns>签名</returns> private static string _Sign(IDictionary <string, string> parameters, string key, MD5_Format format) { // 第一步:把字典按Key的字母顺序排序 IDictionary <string, string> sortedParams = new SortedDictionary <string, string>(parameters); IEnumerator <KeyValuePair <string, string> > dem = sortedParams.GetEnumerator(); // 第二步:把所有参数名和参数值串在一起 StringBuilder query = new StringBuilder(); while (dem.MoveNext()) { string _key = dem.Current.Key; string value = dem.Current.Value; if (!string.IsNullOrWhiteSpace(_key) && !string.IsNullOrWhiteSpace(value)) { //忽略_queue_sign参数 if (_key.Equals("_queue_sign", StringComparison.OrdinalIgnoreCase)) { continue; } query.Append("&").Append(_key).Append("=").Append(value); } } query.Append("&key=").Append(key ?? string.Empty); StringBuilder result = new StringBuilder(); // 第三步:使用MD5加密 using (System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider()) //using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create()) { byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString().Trim('&'))); // 第四步:把二进制转化为大写的十六进制 for (int i = 0; i < bytes.Length; i++) { string hex = string.Empty; if (format == MD5_Format.UPPER) { hex = bytes[i].ToString("X2"); //大写 } else { hex = bytes[i].ToString("x2"); //小写 } result.Append(hex); } } return(result.ToString()); }