zoukankan      html  css  js  c++  java
  • 字符串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 + "	");
        }
    
        // Array.Sort
        Array.Sort(array, string.CompareOrdinal);
        
        Console.WriteLine();
        foreach (string s in array)
        {
            Console.Write(s + "	");
        }
    }

    测试结果:

    ref:http://www.cnblogs.com/similar/p/6739293.html

  • 相关阅读:
    用javascript实现html页面之间的参数传递
    个性的研究
    [luogu1967] 货车运输
    mscorwks.dll 没有被指定在Windows上运行,错误状态 0xc000012f
    dom4j解析xml时报:系统找不到指定路径
    The strip's most beautiful gril,rendezvous never a cover;
    无法在自定义编辑器中开发TransactSQL文件
    Default code generation is disabled for model。。。
    使用IE9艰辛历程之从什么网页都打不开到什么都秒开的传奇
    Metro IE10快捷方式 不小心删了
  • 原文地址:https://www.cnblogs.com/buguge/p/7219906.html
Copyright © 2011-2022 走看看