字符串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
字符串ASCII码排序的更多相关文章
- C# 字符串按 ASCII码 排序,注意其中的小坑
https://www.cnblogs.com/similar/p/6739293.html 在和银行做数据对接时,涉及到数据传输时的验签及加密.其中数据签名方案中就要求数据项根据属性名按 ASCII ...
- C# 参数签名字符串按 ASCII码排序,注意其中的坑
参数签名中通常是按键值对中键名称的ASCII按从小到大的顺序排序后进行hash为签名字符串.不要直接使用 SortedDictionary<string, string> 有坑的,他是按数 ...
- ASCII码排序
ASCII码排序 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输 ...
- ASCII码排序 南阳acm4
ASCII码排序 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输 ...
- NYOJ4——ASCII码排序
ASCII码排序 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述:输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入:第一行输入一 ...
- 杭电2000——ASCII码排序
/* ASCII码排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- 2000 ASCII码排序
声明:从今天开始每周至少做七道杭电ACM题,锻炼思考能力. 2000 ASCII码排序 Problem Description 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符. ...
- 【hdu2000】ASCII码排序
题目来源:www.acm.hdu.edu.cn 题目编号:2000 ASCII码排序 /*----------------------------------------原题目------------ ...
- 难度2:ASCII码排序
ASCII码排序 难度:2描述: 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入: 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据 ...
随机推荐
- .NET Core 2.0 单元测试中初识 IOptionsMonitor<T>
在针对下面设置 CookieAuthenticationOptions 的扩展方法写单元测试时遇到了问题. public static IServiceCollection AddCnblogsAut ...
- TinyMind 多标签图像分类竞赛 之路
竞赛传送门:https://www.tinymind.cn/competitions/42 我们就是傻狗天仙配啦~ 决赛排行榜: 这次比赛感谢第一名的 baseline:https://blog.cs ...
- 解决GP服务产生的结果无法自动发布为地图服务的问题
在ArcGIS for Javascript API或REST API调用GP服务时,常常会遇到这样一种情况:GP服务运行以后,执行成功,也能够生成结果,然而结果并没有直接产生动态的地图服务供API调 ...
- 关于ionic2 更新到ionic3 后组件不能用的解决方案
错误代码就不贴出来了,直接上代码吧! 首先在xx.module.ts添加 1.import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; 2.添加 ...
- HTML基础标签大全
HTML 标签大全及属性 常用的块级元素有 :div , from , table, p ,pre,h1-h5,dl,ol,ul 常用的内联元素:span ,a ,strong,em ,label , ...
- iOS - 常用的CG结构体
CGPoint.CGSize.CGRect.CGRectEdge实际上都是结构体 一,几个常用的结构体 CGPoint 定义一个点,设置x坐标和y坐标 struct CGPoint { CGFlo ...
- delphi加载ADOQUERY
CxgridDBTableView3.ClearItems;//这里是cxgrid的表层,先清除之前的列再创建 for I:=0 to adoquery1.FieldCount-1 do begi ...
- 运行Maven工程中修改tomcat端口
Maven 运行:clean tomcat7:run 若需要修改端口,则用clean -Dmaven.tomcat.port=8082 tomcat7:run
- python练习题-day3
1.有变量name="aleX leNb" 1)移除 name 变量对应的值两边的空格,并输出处理结果 print(name.strip()) 2)移除name变量左边的" ...
- ul+li水平居中的几种方法
一.posotion:relative; 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF- ...