buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

字符串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

 

posted on   buguge  阅读(10363)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
· 全程使用 AI 从 0 到 1 写了个小工具
历史上的今天:
2014-07-21 使用OData技术遇到的问题及解决办法
点击右上角即可分享
微信分享提示