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

最新文章

  1. TCP那些事
  2. 移动APP的IM后台架构浅析
  3. iOS背景模糊效果3中方法总结
  4. netsh修改IP及DNS
  5. Plotting means and error bars (ggplot2)
  6. android布局中的divider(目前只知道TableLayout)
  7. [C语言 - 8] 枚举enum
  8. Linux内核ROP学习
  9. iOS_动态插入或删除行
  10. android网络编程之HttpUrlConnection的讲解--上传大文件
  11. JDBC Request
  12. 高DPI下界面错乱的解决方法和原理
  13. Linux sar工具安装使用
  14. 关于nginx报错/usr/share/nginx/html/jiankongshare&quot; failed (2: No such file or directory)的问题解决
  15. BZOJ.2109.[NOI2010]航空管制(拓扑 贪心)
  16. HDU 5836 Rubik&#39;s Cube BFS
  17. 你可能不知道UED和UCD
  18. C++ 的一个问题的理解(私有变量成员)
  19. 使用Sublime Text 3做Python开发
  20. [C#]浅谈协变与逆变

热门文章

  1. css学习_写法规范、选择器
  2. select cast(round(12.5,2) as numeric(5,2))
  3. HDU 1002 - A + B Problem II - [高精度]
  4. tensorflow模型在实际上线进行预测的时候,使用CPU工作
  5. iOS中UITableView的一些问题思考
  6. iOS 精简Controlelr代码的两个方法
  7. Improved SEO with mod_rewrite
  8. 用SignalTap进行硬件仿真
  9. Entity Framework 6如何进行导航属性的筛选(context.Msg.First(t=&gt;t.Id==1).Include(t=&gt;t.MsgDetail),筛选MsgDetail带条件)
  10. LeetCode 429 N-ary Tree Level Order Traversal 解题报告