对接第三方渠道的支付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

字符串ASCII码排序的更多相关文章

  1. C# 字符串按 ASCII码 排序,注意其中的小坑

    https://www.cnblogs.com/similar/p/6739293.html 在和银行做数据对接时,涉及到数据传输时的验签及加密.其中数据签名方案中就要求数据项根据属性名按 ASCII ...

  2. C# 参数签名字符串按 ASCII码排序,注意其中的坑

    参数签名中通常是按键值对中键名称的ASCII按从小到大的顺序排序后进行hash为签名字符串.不要直接使用 SortedDictionary<string, string> 有坑的,他是按数 ...

  3. ASCII码排序

    ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符.   输入 第一行输 ...

  4. ASCII码排序 南阳acm4

    ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符.   输入 第一行输 ...

  5. NYOJ4——ASCII码排序

    ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2  描述:输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符.  输入:第一行输入一 ...

  6. 杭电2000——ASCII码排序

    /* ASCII码排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  7. 2000 ASCII码排序

    声明:从今天开始每周至少做七道杭电ACM题,锻炼思考能力. 2000  ASCII码排序 Problem Description 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符. ...

  8. 【hdu2000】ASCII码排序

    题目来源:www.acm.hdu.edu.cn 题目编号:2000 ASCII码排序 /*----------------------------------------原题目------------ ...

  9. 难度2:ASCII码排序

    ASCII码排序 难度:2描述: 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入: 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据 ...

随机推荐

  1. stm32 硬件错误

    进入该模式,程序死机. 一般来说都是内存错误 1. 数组越界,装入数据溢出, 2. 堆和栈设置不当,这里面硬件的堆和栈在汇编文件中,如果有freertos等,重点检查,任务堆栈使用情况,一般任务堆栈溢 ...

  2. zookeeper的Java客户端API

    zookeeper作为一个分布式服务框架,主要用来解决分布式数据一致性问题,对多种语言提供了API.这里主要记录下JAVA客户端API的使用. 1.创建会话 客户端可以通过创建一个ZooKeeper实 ...

  3. nginx内置变量 大全

    nginx内置变量 内置变量存放在  ngx_http_core_module 模块中,变量的命名方式和apache 服务器变量是一致的.总而言之,这些变量代表着客户端请求头的内容,例如$http_u ...

  4. Arcengine 在SDE创建数据集提示应用程序未获得创建或修改此类型数据的方案的许可

    解决方案:将license Control的属性修改一下,ArcGIS Engine的√去掉,把第二个打√就可以了: 参考资料:http://www.docin.com/p-925448534.htm ...

  5. [dpdk] TSC , HPET, Timer, Event Timer,RDTSCP

    关于dpdk timer跨越CPU core调度的准确性问题 首先dpdk的timer接口里边使用 cpu cycle来比较时间.根据之前的内容 [dpdk] dpdk --lcores参数 当一个E ...

  6. [cloud][sdn] LBaaS/neutron / Octavia

    清晰/浅显: http://www.cnblogs.com/sammyliu/p/4656176.html IBM:写的一般般,价值不大 https://www.ibm.com/developerwo ...

  7. dp单调性优化

    跟着书上的思路学习dp的单调性优化觉得还是很容易想的. 数据范围: dp,数据范围是百万,这应该是O(n)的算法了. 首先不难想到设f[i]表示到第i个百米所能达到的最大能量,那么f[n]即为所求. ...

  8. 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈

    正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...

  9. 【数据可视化-pyecharts】pyecharts快速入门

    pyecharts快速开始 首先开始来绘制你的第一个图表 from pyecharts import Bar bar = Bar("我的第一个图表", "这里是副标题&q ...

  10. 第8章 用SQL语句操作数据

    SQL的组成: (1)DML(Data Manipiation Language ,数据操作语言,)用来插入,修改和删除数据库中的数据,如:INSERT,UPDATE,DELETE等. (2)DDL( ...