需求:无论是请求还是应答,签名原始串按以下方式组装成字符串:
1、除SIGN字段外,所有参数按照字段名的ascii码从小到大排序后使用QueryString的格式(即KEY1=value1&KEY2=value2…)拼接而成,空值不传递,不参与签名组串。
2、签名原始串中,字段名和字段值都采用原始值,不进行URL Encode。
3、返回的应答或通知消息可能会由于升级增加参数,请验证应答签名时注意允许这种情况。
传参数:
SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
String COM_ID = json.getString("COM_ID");//合作公司ID
String BANK_ACCOUNT = json.getString("BANK_ACCOUNT");// 收款账户
String ACCOUNT_NAME = json.getString("ACCOUNT_NAME");// 收款账户名
String AMOUNT = json.getString("AMOUNT");// 代付订单金额,不包含手续费。手续费从账户余额扣除,单位为元
String AGENT_ORDER_ID = json.getString("AGENT_ORDER_ID");// 代理订单号,用于查询
String NONCE_STR = json.getString("NONCE_STR");// 随机字符串
parameters.put("COM_ID", COM_ID);//合作公司ID
parameters.put("BANK_ACCOUNT", BANK_ACCOUNT);//收款账户
parameters.put("ACCOUNT_NAME", ACCOUNT_NAME);//收款账户名
parameters.put("AMOUNT", AMOUNT);//代付订单金额,不包含手续费。手续费从账户余额扣除
parameters.put("NONCE_STR", NONCE_STR);
//按照ASCII码排序
public static String createSign(SortedMap<Object, Object> parameters, String key) {
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet(); //所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
//空值不传递,不参与签名组串
if (null != v && !"".equals(v)) {
sb.append(k + "=" + v + "&");
}
}
String result = sb.toString().substring(0,sb.toString().length()-1);
//排序后的字符串
System.out.println("待签名字符串:" + result);
return result ;
}
网友评论