参数按照字段名的ASCII码从小到大排序

2018-04-27  本文已影响898人  小小蒜头

需求:无论是请求还是应答,签名原始串按以下方式组装成字符串:

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 ;
    }
上一篇下一篇

猜你喜欢

热点阅读