字符串ASCII碼排序
阿新 • • 發佈:2017-07-22
end () reac 規則 ann eem 有序字典 字符串 public
在對接第三方支付渠道的時候,第三方會要求參數按照ASCII碼從小到大排序。
如下是渠道方有關生成簽名規則的java代碼示例:
//初始化0010merkey.private文件: String merchantprivatekey; merchantprivatekey=PayCfg.getValue("0010merchantprivatekey"); // 將要簽名的數據傳給map TreeMap map = new TreeMap(); StringBuffer sbf = new StringBuffer(); map.put(orderNo,’0010100000000011’); map.put(productId,’0010’); // 需要簽名值字符串 Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { Object key = iterator.next(); //並將獲得的值進行拼接 String value=(String)map.get(key); System.out.println("map:"+key+":======================="+value); sbf.append((String)map.get(key)); }//簽名signdata String signdata = SignAndVerify.sign_md(sbf.toString(), "",merchantprivatekey); }
(1)註釋:初始化私鑰,通過參數名稱,獲得相應的參數值,並encode成utf-8格式
(2)通過實例化map對象,TreeMap map = new TreeMap();
(3)TreeMap()會將數據名稱按照AscII碼值的大小進行排序
(4)循環map中的值,並將這些值拼接起來==》sbf
(5)調用jar包中的SignAndVerify的sign_md方法,對sbf進行加密。
我們的.NET程序對接時,首先想到的是用SortedDictionary<string,string>。對接過程中發現,有的接口生成的簽名是正確的,有的接口生成的簽名後調用得到的響應報文說驗簽失敗。
進一步排查,發現有序字典並不是按照ASCII碼排序的,用集合的OrderBy()方法、Array.Sort也是如此。此時,解決方案是在用Array.Sort時指定一個參數string.CompareOrdinal。string.CompareOrdinal會把每個字符先轉成相應的數值(如 a 轉為數值 97),然後再對數值進行比較。
[TestMethod] public void ASCIISort() { IDictionary<string, string> dics = new SortedDictionary<string, string>(); dics.Add("21amount", "amount"); dics.Add("2callback_url", " callback_url"); dics.Add("Agoodsname", "goodsname"); dics.Add("amerchno", "merchno"); dics.Add("bnotify_url", "notify_url"); dics.Add("Bordno", "ordno"); dics.Add("3organno", "organno"); dics.Add("version", "version"); dics.Add("paytype", "paytype"); var array = dics.Keys.ToArray(); Console.WriteLine(); foreach (string s in array) { Console.Write(s + "\t"); } // Array.Sort Array.Sort(array, string.CompareOrdinal); Console.WriteLine(); foreach (string s in array) { Console.Write(s + "\t"); } }
測試結果:
ref:http://www.cnblogs.com/similar/p/6739293.html
字符串ASCII碼排序