SignUtil.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Newtonsoft.Json;
  6. using Newtonsoft.Json.Linq;
  7. using System.Collections;
  8. namespace SM2Crypto.Lib
  9. {
  10. class SignUtil
  11. {
  12. private static List<String> ignoreSign = new List<String>() { "signData", "encData", "extra" };
  13. public static String getSignText(JObject jsonObject, String appSecret)
  14. {
  15. SortedDictionary<String, String> signMap = new SortedDictionary<String, String>(StringComparer.Ordinal);
  16. foreach (var entry in jsonObject)
  17. {
  18. if (!String.IsNullOrEmpty(entry.Value.ToString()) && !ignoreSign.Contains(entry.Key))
  19. {
  20. signMap.Add(entry.Key, getValue(entry.Value));
  21. }
  22. }
  23. List<String> list = new List<String>();
  24. foreach (var entry in signMap)
  25. {
  26. if (!String.IsNullOrEmpty(getObjString(entry.Value)))
  27. {
  28. list.Add((String)entry.Key + "=" + (String)entry.Value + "&");
  29. }
  30. }
  31. int size = list.Count();
  32. String[] arrayToSort = (String[])list.ToArray();
  33. Array.Sort(arrayToSort, new CaseInsensitiveComparer());
  34. StringBuilder sb = new StringBuilder();
  35. for (int i = 0; i < size; ++i)
  36. {
  37. sb.Append(arrayToSort[i]);
  38. }
  39. String signText = sb.Append("key=").Append(appSecret).ToString();
  40. return signText;
  41. }
  42. public static String getObjString(Object obj)
  43. {
  44. return obj == null ? "" : (String)obj;
  45. }
  46. private static String getValue(Object value)
  47. {
  48. return value is String ? getObjString(value) : treeJsonParam(value);
  49. }
  50. private static String treeJsonParam(Object value)
  51. {
  52. String jsonParam = null;
  53. if (value is Dictionary<Object, Object>)
  54. {
  55. SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);
  56. Dictionary<Object, Object> nestedMap = (Dictionary<Object, Object>)value;
  57. foreach (var entry in nestedMap)
  58. {
  59. treeNestedMap.Add(entry.Key.ToString(), entry.Value);
  60. }
  61. jsonParam = JsonConvert.SerializeObject(treeParams(treeNestedMap), Formatting.None);
  62. }
  63. else if (value is List<Object>)
  64. {
  65. List<Object> ar = (List<Object>)value;
  66. if (ar != null && ar.Count() != 0)
  67. jsonParam = JsonConvert.SerializeObject(treeList(ar), Formatting.None);
  68. }
  69. else if (value is JObject)
  70. {
  71. SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);
  72. JObject nestedMap = (JObject)value;
  73. foreach (var entry in nestedMap)
  74. {
  75. treeNestedMap.Add(entry.Key.ToString(), entry.Value);
  76. }
  77. jsonParam = JsonConvert.SerializeObject(treeParams(treeNestedMap), Formatting.None);
  78. }
  79. else if (value is JArray)
  80. {
  81. JArray ar = (JArray)value;
  82. if (ar != null && ar.Count() != 0)
  83. jsonParam = JsonConvert.SerializeObject(treeJsonArray(ar), Formatting.None);
  84. }
  85. else if (value is JValue)
  86. {
  87. JValue jval = (JValue)value;
  88. if (jval != null && !String.IsNullOrEmpty(jval.ToString()))
  89. {
  90. if (jval.ToString().ToLower().Trim().Equals("true") || jval.ToString().ToLower().Trim().Equals("false"))
  91. jsonParam = jval.ToString().ToLower().Trim();
  92. else
  93. jsonParam = jval.Value.ToString();
  94. }
  95. }
  96. else if (value is JProperty)
  97. {
  98. SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);
  99. JProperty nestedMap = (JProperty)value;
  100. treeNestedMap.Add(nestedMap.Name, nestedMap.Value);
  101. jsonParam = JsonConvert.SerializeObject(treeParams(treeNestedMap), Formatting.None);
  102. }
  103. else
  104. {
  105. jsonParam = value.ToString();
  106. }
  107. return jsonParam;
  108. }
  109. private static SortedDictionary<String, Object> treeParams(SortedDictionary<String, Object> param)
  110. {
  111. if (param == null)
  112. {
  113. return new SortedDictionary<String, Object>(StringComparer.Ordinal);
  114. }
  115. else
  116. {
  117. SortedDictionary<String, Object> treeParam = new SortedDictionary<String, Object>(StringComparer.Ordinal);
  118. while (true)
  119. {
  120. foreach (var entry in param)
  121. {
  122. String key = (String)entry.Key;
  123. Object value = entry.Value;
  124. if (value is Dictionary<Object, Object>)
  125. {
  126. SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);
  127. Dictionary<Object, Object> nestedMap = (Dictionary<Object, Object>)value;
  128. foreach (var nestedEntry in nestedMap)
  129. {
  130. treeNestedMap.Add(nestedEntry.Key.ToString(), nestedEntry.Value);
  131. }
  132. treeParam.Add(key, treeParams(treeNestedMap));
  133. }
  134. else if (value is List<Object>)
  135. {
  136. List<Object> ar = (List<Object>)value;
  137. if (ar != null && ar.Count() != 0)
  138. treeParam.Add(key, treeList(ar));
  139. }
  140. else if (value is JArray)
  141. {
  142. JArray ar = (JArray)value;
  143. if (ar != null && ar.Count() != 0)
  144. treeParam.Add(key, treeJsonArray(ar));
  145. }
  146. else if (value is JObject)
  147. {
  148. SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);
  149. JObject nestedMap = (JObject)value;
  150. foreach (var nestedEntry in nestedMap)
  151. {
  152. treeNestedMap.Add(nestedEntry.Key.ToString(), nestedEntry.Value);
  153. }
  154. treeParam.Add(key, treeParams(treeNestedMap));
  155. }
  156. else if (value is JValue)
  157. {
  158. JValue jval = (JValue)value;
  159. if (jval != null && !String.IsNullOrEmpty(jval.ToString()))
  160. {
  161. if (jval.ToString().ToLower().Trim().Equals("true") || jval.ToString().ToLower().Trim().Equals("false"))
  162. treeParam.Add(key, jval.ToString().ToLower().Trim());
  163. else
  164. treeParam.Add(key, jval.ToString());
  165. }
  166. }
  167. else if (value is JProperty)
  168. {
  169. SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);
  170. JProperty nestedMap = (JProperty)value;
  171. treeNestedMap.Add(nestedMap.Name, nestedMap.Value);
  172. treeParam.Add(key, treeParams(treeNestedMap));
  173. }
  174. else if (!"".Equals(value) && value != null)
  175. {
  176. treeParam.Add(key, value.ToString());
  177. }
  178. }
  179. return treeParam;
  180. }
  181. }
  182. }
  183. private static List<Object> treeList(List<Object> list)
  184. {
  185. if (list != null && list.Count() != 0)
  186. {
  187. JArray jsonArray = new JArray();
  188. int size = list.Count();
  189. for (int i = 0; i < size; ++i)
  190. {
  191. jsonArray.Add(list[i]);
  192. }
  193. return treeJsonArray(jsonArray);
  194. }
  195. else
  196. {
  197. return null;
  198. }
  199. }
  200. private static List<Object> treeJsonArray(JArray jarr)
  201. {
  202. if (jarr != null && jarr.Count() != 0)
  203. {
  204. List<Object> jsonArray = new List<Object>();
  205. int size = jarr.Count();
  206. for (int i = 0; i < size; ++i)
  207. {
  208. Object value = jarr[i];
  209. if (value is List<Object>)
  210. {
  211. List<Object> ar = (List<Object>)value;
  212. if (ar != null && ar.Count() != 0)
  213. jsonArray.Add(treeList(ar));
  214. }
  215. else if (value is JArray)
  216. {
  217. JArray ar = (JArray)value;
  218. if (ar != null && ar.Count() != 0)
  219. jsonArray.Add(treeJsonArray(ar));
  220. }
  221. else if (value is JObject)
  222. {
  223. SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);
  224. JObject nestedMap = (JObject)value;
  225. foreach (var nestedEntry in nestedMap)
  226. {
  227. treeNestedMap.Add(nestedEntry.Key.ToString(), nestedEntry.Value);
  228. }
  229. jsonArray.Add(treeParams(treeNestedMap));
  230. }
  231. else if (value is JValue)
  232. {
  233. JValue jval = (JValue)value;
  234. if (jval != null && !String.IsNullOrEmpty(jval.ToString()))
  235. {
  236. if (jval.ToString().ToLower().Trim().Equals("true") || jval.ToString().ToLower().Trim().Equals("false"))
  237. jsonArray.Add(jval.ToString().ToLower().Trim());
  238. else
  239. jsonArray.Add(jval.ToString());
  240. }
  241. }
  242. else if (value is JProperty)
  243. {
  244. SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);
  245. JProperty nestedMap = (JProperty)value;
  246. treeNestedMap.Add(nestedMap.Name, nestedMap.Value);
  247. jsonArray.Add(treeParams(treeNestedMap));
  248. }
  249. else if (!"".Equals(value))
  250. {
  251. jsonArray.Add(value.ToString());
  252. }
  253. }
  254. return jsonArray;
  255. }
  256. else
  257. {
  258. return null;
  259. }
  260. }
  261. }
  262. }