字符串ASCII碼排序


對接第三方渠道的支付API時,三方給的數據簽名規則,其中一條是要求參數按照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(C#)程序對接時,map用的是有序字典SortedDictionary<string,string>。在后續的對接聯調過程中發現,有的接口請求可以正常返回,而有的接口請求收到的響應報文是驗簽失敗。

進一步排查,發現有序字典並不是按照ASCII碼排序的,用集合的OrderBy()方法、Array.Sort也是如此。此時,解決方案是在用Array.Sort時指定一個參數string.CompareOrdinal。string.CompareOrdinal先把每個字符轉成相應的十進制數值(如 a 對應97,b對應98,A對應65,B對應66),然后再對十進制數值進行比較。

[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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM