SignUtil.cs 12 KB

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