在很多地方請求參數需要做處理例如:
步驟
1.參數字典排序。
2.拼接字符。
/// <summary> /// 生成簽名 /// </summary> /// <param name="paramlst">參數列表</param> /// <param name="IsToUpper">是否轉大寫</param> /// <param name="IsDirect">是否直接加上簽名Key</param> /// <returns></returns> public static string GenerateSign(List<KeyValuePair<string, string>> lst,string privateKey) { Comparison<KeyValuePair<string, string>> Comparer = new Comparison<KeyValuePair<string, string>>(CompareKeyValuepair); lst.Sort(Comparer); var paramlst = lst.Where(p => !string.IsNullOrEmpty(p.Value)).ToList(); string signstr = string.Join("&", paramlst.Select(p => p.Key + "=" + p.Value)) + privateKey; return Sign(signstr, "UTF-8"); }
/// <summary> /// 根據Key比較排序位置 /// </summary> private static int CompareKeyValuepair(KeyValuePair<string, string> p1, KeyValuePair<string, string> p2) { return string.Compare(p1.Key, p2.Key); }
3.MD5加密
/// <summary> /// 簽名字符串 /// </summary> /// <param name="prestr">需要簽名的字符串</param> /// <param name="key">密鑰</param> /// <param name="inputCharset">編碼格式</param> /// <returns>簽名結果</returns> public static string Sign(string prestr, string inputCharset) { StringBuilder sb = new StringBuilder(); MD5 md5 = new MD5CryptoServiceProvider(); byte[] t = md5.ComputeHash(Encoding.GetEncoding(inputCharset).GetBytes(prestr)); foreach (byte t1 in t) { sb.Append(t1.ToString("x2")); } return sb.ToString(); }
第二套加密、排序方法

public static bool IdentifySign<T>(T entity, string keys = "aiHpJWIlmXhb7JrwOCon", string charSet = "utf-8") where T : new() { if (entity == null) { entity = new T(); } StringBuilder sb = new StringBuilder(); Type type = typeof(T); PropertyInfo[] pi = type.GetProperties(); var tt = pi.OrderBy(t => t.Name); string sign = ""; foreach (var item in tt) { //參數為空不參與MD5計算 if (item.GetValue(entity, null) == null) continue; if (item.Name == "sign") { sign = item.GetValue(entity, null).ToString(); continue; } if (item.GetValue(entity, null) is ICollection) { sb.Append(item.Name + "=" + Newtonsoft.Json.JsonConvert.SerializeObject(item.GetValue(entity, null)) + "&"); continue; } sb.Append(item.Name + "=" + item.GetValue(entity, null) + "&"); } string signStr = sb.ToString().TrimEnd('&') + "&key=" + keys; var urlmd5 = DESEncrypt.MD5ToUpper(signStr, charSet); return urlmd5 == sign; }

public static string LuckDrawPostSign<T>(T entity, string keys = "aiHpJWIlmXhb7JrwOCon", string charSet = "gb2312") where T : new() { if (entity == null) { entity = new T(); } StringBuilder sb = new StringBuilder(); Type type = typeof(T); PropertyInfo[] pi = type.GetProperties(); var tt = pi.OrderBy(t => t.Name); var jo = new JObject(); foreach (var item in tt) { //參數為空不參與MD5計算 if (item.GetValue(entity, null) == null) continue; sb.Append(item.Name + "=" + item.GetValue(entity, null) + "&"); jo.Add(item.Name, item.GetValue(entity, null).ToString()); } var urlmd5 = DESEncrypt.MD5ToUpper(sb.ToString() + "key=" + keys, charSet); jo.Add("sign", urlmd5); return jo.ToString(); }