| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using Newtonsoft.Json;using Newtonsoft.Json.Linq;using System.Collections;namespace SM2Crypto.Lib{    class SignUtil    {        private static List<String> ignoreSign = new List<String>() { "signData", "encData", "extra" };        public static string SortInput(JObject jsonObject)        {            SortedDictionary<String, String> signMap = new SortedDictionary<String, String>(StringComparer.Ordinal);            foreach (var entry in jsonObject)            {                if (!String.IsNullOrEmpty(entry.Value.ToString()) && !ignoreSign.Contains(entry.Key))                {                    signMap.Add(entry.Key, getValue(entry.Value));                }            }            return JsonConvert.SerializeObject(signMap);        }        public static String getSignText(JObject jsonObject, String appSecret)        {            SortedDictionary<String, String> signMap = new SortedDictionary<String, String>(StringComparer.Ordinal);            foreach (var entry in jsonObject)            {                if (!String.IsNullOrEmpty(entry.Value.ToString()) && !ignoreSign.Contains(entry.Key))                {                    signMap.Add(entry.Key, getValue(entry.Value));                }            }            List<String> list = new List<String>();            foreach (var entry in signMap)            {                if (!String.IsNullOrEmpty(getObjString(entry.Value)))                {                    list.Add((String)entry.Key + "=" + (String)entry.Value + "&");                }            }            int size = list.Count();            String[] arrayToSort = (String[])list.ToArray();            Array.Sort(arrayToSort, new CaseInsensitiveComparer());            StringBuilder sb = new StringBuilder();            for (int i = 0; i < size; ++i)            {                sb.Append(arrayToSort[i]);            }            String signText = sb.Append("key=").Append(appSecret).ToString();            return signText;        }        public static String getObjString(Object obj)        {            return obj == null ? "" : (String)obj;        }        private static String getValue(Object value)        {            return value is String ? getObjString(value) : treeJsonParam(value);        }        private static String treeJsonParam(Object value)        {            String jsonParam = null;            if (value is Dictionary<Object, Object>)            {                SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);                Dictionary<Object, Object> nestedMap = (Dictionary<Object, Object>)value;                foreach (var entry in nestedMap)                {                    treeNestedMap.Add(entry.Key.ToString(), entry.Value);                }                jsonParam = JsonConvert.SerializeObject(treeParams(treeNestedMap), Formatting.None);            }            else if (value is List<Object>)            {                List<Object> ar = (List<Object>)value;                if (ar != null && ar.Count() != 0)                    jsonParam = JsonConvert.SerializeObject(treeList(ar), Formatting.None);            }            else if (value is JObject)            {                SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);                JObject nestedMap = (JObject)value;                foreach (var entry in nestedMap)                {                    treeNestedMap.Add(entry.Key.ToString(), entry.Value);                }                jsonParam = JsonConvert.SerializeObject(treeParams(treeNestedMap), Formatting.None);            }            else if (value is JArray)            {                JArray ar = (JArray)value;                if (ar != null && ar.Count() != 0)                    jsonParam = JsonConvert.SerializeObject(treeJsonArray(ar), Formatting.None);            }            else if (value is JValue)            {                JValue jval = (JValue)value;                if (jval != null && !String.IsNullOrEmpty(jval.ToString()))                {                    if (jval.ToString().ToLower().Trim().Equals("true") || jval.ToString().ToLower().Trim().Equals("false"))                        jsonParam = jval.ToString().ToLower().Trim();                    else                        jsonParam = jval.Value.ToString();                }            }            else if (value is JProperty)            {                SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);                JProperty nestedMap = (JProperty)value;                treeNestedMap.Add(nestedMap.Name, nestedMap.Value);                jsonParam = JsonConvert.SerializeObject(treeParams(treeNestedMap), Formatting.None);            }            else            {                jsonParam = value.ToString();            }            return jsonParam;        }        private static SortedDictionary<String, Object> treeParams(SortedDictionary<String, Object> param)        {            if (param == null)            {                return new SortedDictionary<String, Object>(StringComparer.Ordinal);            }            else            {                SortedDictionary<String, Object> treeParam = new SortedDictionary<String, Object>(StringComparer.Ordinal);                while (true)                {                    foreach (var entry in param)                    {                        String key = (String)entry.Key;                        Object value = entry.Value;                        if (value is Dictionary<Object, Object>)                        {                            SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);                            Dictionary<Object, Object> nestedMap = (Dictionary<Object, Object>)value;                            foreach (var nestedEntry in nestedMap)                            {                                treeNestedMap.Add(nestedEntry.Key.ToString(), nestedEntry.Value);                            }                            treeParam.Add(key, treeParams(treeNestedMap));                        }                        else if (value is List<Object>)                        {                            List<Object> ar = (List<Object>)value;                            if (ar != null && ar.Count() != 0)                                treeParam.Add(key, treeList(ar));                        }                        else if (value is JArray)                        {                            JArray ar = (JArray)value;                            if (ar != null && ar.Count() != 0)                                treeParam.Add(key, treeJsonArray(ar));                        }                        else if (value is JObject)                        {                            SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);                            JObject nestedMap = (JObject)value;                            foreach (var nestedEntry in nestedMap)                            {                                treeNestedMap.Add(nestedEntry.Key.ToString(), nestedEntry.Value);                            }                            treeParam.Add(key, treeParams(treeNestedMap));                        }                        else if (value is JValue)                        {                            JValue jval = (JValue)value;                            if (jval != null && !String.IsNullOrEmpty(jval.ToString()))                            {                                if (jval.ToString().ToLower().Trim().Equals("true") || jval.ToString().ToLower().Trim().Equals("false"))                                    treeParam.Add(key, jval.ToString().ToLower().Trim());                                else                                    treeParam.Add(key, jval.ToString());                            }                        }                        else if (value is JProperty)                        {                            SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);                            JProperty nestedMap = (JProperty)value;                            treeNestedMap.Add(nestedMap.Name, nestedMap.Value);                            treeParam.Add(key, treeParams(treeNestedMap));                        }                        else if (!"".Equals(value) && value != null)                        {                            treeParam.Add(key, value.ToString());                        }                    }                    return treeParam;                }            }        }        private static List<Object> treeList(List<Object> list)        {            if (list != null && list.Count() != 0)            {                JArray jsonArray = new JArray();                int size = list.Count();                for (int i = 0; i < size; ++i)                {                    jsonArray.Add(list[i]);                }                return treeJsonArray(jsonArray);            }            else            {                return null;            }        }        private static List<Object> treeJsonArray(JArray jarr)        {            if (jarr != null && jarr.Count() != 0)            {                List<Object> jsonArray = new List<Object>();                int size = jarr.Count();                for (int i = 0; i < size; ++i)                {                    Object value = jarr[i];                    if (value is List<Object>)                    {                        List<Object> ar = (List<Object>)value;                        if (ar != null && ar.Count() != 0)                            jsonArray.Add(treeList(ar));                    }                    else if (value is JArray)                    {                        JArray ar = (JArray)value;                        if (ar != null && ar.Count() != 0)                            jsonArray.Add(treeJsonArray(ar));                    }                    else if (value is JObject)                    {                        SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);                        JObject nestedMap = (JObject)value;                        foreach (var nestedEntry in nestedMap)                        {                            treeNestedMap.Add(nestedEntry.Key.ToString(), nestedEntry.Value);                        }                        jsonArray.Add(treeParams(treeNestedMap));                    }                    else if (value is JValue)                    {                        JValue jval = (JValue)value;                        if (jval != null && !String.IsNullOrEmpty(jval.ToString()))                        {                            if (jval.ToString().ToLower().Trim().Equals("true") || jval.ToString().ToLower().Trim().Equals("false"))                                jsonArray.Add(jval.ToString().ToLower().Trim());                            else                                jsonArray.Add(jval.ToString());                        }                    }                    else if (value is JProperty)                    {                        SortedDictionary<String, Object> treeNestedMap = new SortedDictionary<String, Object>(StringComparer.Ordinal);                        JProperty nestedMap = (JProperty)value;                        treeNestedMap.Add(nestedMap.Name, nestedMap.Value);                        jsonArray.Add(treeParams(treeNestedMap));                    }                    else if (!"".Equals(value))                    {                        jsonArray.Add(value.ToString());                    }                }                return jsonArray;            }            else            {                return null;            }        }    }}
 |