# 代码示例

签名方法

   TreeMap<String, String> map = Maps.newTreeMap();//所有参数放在次map中,进行排序
   map.put("pid", pid);//支付中心颁发的pid
   map.put("appId", appId);//支付中心颁发的appId
   map.put("apiName","/trade/create");//调用的方法uri,比如/trade/create
   map.put("time", String.valueOf(System.currentTimeMillis()));
   map.put("version", "1.0.0");

   map.put("XXX","XXX");//加入支付所需参数
   String signContent = getSignContent(map);
   //加签之后,除了sign,不可再放入参数
   map.put("sign", MD5.sign(signContent, secret, "UTF-8").toUpperCase());//secret就是颁发的密钥

   String postData = HttpClients.post(centerPlatformConfiguration.getUrl() + centerPlatformConfiguration.getTradeCreate(), map);

签名字符串生成方法

   //使用了TreeMap进行排序后的参数map
   public static String getSignContent(TreeMap<String, String> params) {
        if (MapUtils.isEmpty(params)) {
            return null;
        }

        StringBuilder content = new StringBuilder();
        boolean first = true;
        for (String key : params.keySet()) {
            String value = params.get(key);
            if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value) && !key.equalsIgnoreCase("sign")) {
                content.append((first ? "" : "&") + key + "=" + value);
                first = false;
            }
        }

        return content.toString();
    }

MD5类:

   public class MD5 {

        /**
         * 签名字符串
         * @param text 需要签名的字符串
         * @param key 密钥
         * @param input_charset 编码格式
         * @return 签名结果
         */
        public static String sign(String text, String key, String input_charset) {
            text = text + key;
            return DigestUtils.md5Hex(getContentBytes(text, input_charset));
        }

        /**
         * 签名字符串
         * @param text 需要签名的字符串
         * @param sign 签名结果
         * @param key 密钥
         * @param input_charset 编码格式
         * @return 签名结果
         */
        public static boolean verify(String text, String sign, String key, String input_charset) {
            text = text + key;
            String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset));
            if(mysign.equals(sign)) {
                return true;
            }
            else {
                return false;
            }
        }

        /**
         * @param content
         * @param charset
         * @return
         * @throws SignatureException
         * @throws UnsupportedEncodingException
         */
        private static byte[] getContentBytes(String content, String charset) {
            if (charset == null || "".equals(charset)) {
                return content.getBytes();
            }
            try {
                return content.getBytes(charset);
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
            }
        }
    }

Demo类: 以微企付为例:

   public class TestDemo {

        /**
         * 签名字符串
         * @param text 需要签名的字符串
         * @param key 密钥
         * @param input_charset 编码格式
         * @return 签名结果
         */

        public static void main(String args[]){
            System.out.println(create());
            System.out.println(query());
            System.out.println(refund());
            System.out.println(queryRefund());
        }

        private static String pid = "pidxxx";
        private static String appId = "appIdxxx";
        private static String secret = "secretxxx";
        private static String doamin = "domainxxx";
    
        private static String mid = "midxxx";
    
        /****
         * 下单
         * @return
         */
        public static String create(){
            String apiName = "/trade/create";
            TreeMap<String, String> map = getPublidParams(apiName);//所有参数放在次map中,进行排序
            map.put("mid", mid);
            map.put("sourceCode", "ENTPAY");
            map.put("body", "body");
            map.put("channelCode", "WX");
            map.put("expireTime", "5"); //1-30 的整数
            map.put("notifyUrl", "hnotifyUrl");
            map.put("splitBunch", "[{\"amount\":\"0.01\",\"entId\":\"entIdxxx\",\"entName\":\"XXXX有限公司\"}]");
            map.put("outTradeNo", "outTradeNo");
            map.put("returnUrl", "returnUrl");
            map.put("subject", "subject");
            map.put("tradeAmount", "0.01");
            map.put("ouid", "ouid");
            String signContent = getSignContent(map);
            //加签之后,除了sign,不可再放入参数
            map.put("sign", MD5.sign(signContent, secret, "UTF-8").toUpperCase());//secret就是颁发的密钥
    
            String postData = HttpClientUtils.post(doamin + apiName, map);
            return postData;
        }
    
    
        /****
         * 查询下单结果
         * @return
         */
        public static String query(){
            String apiName = "/trade/query";
            TreeMap<String, String> map = getPublidParams(apiName);//所有参数放在次map中,进行排序
            map.put("outTradeNo", "outTradeNo");
            String signContent = getSignContent(map);
            //加签之后,除了sign,不可再放入参数
            map.put("sign", MD5.sign(signContent, secret, "UTF-8").toUpperCase());//secret就是颁发的密钥
            String postData = HttpClientUtils.post(doamin + apiName, map);
            return postData;
        }
    
        /****
         * 退款
         * @return
         */
        public static String refund(){
            String apiName = "/trade/refund";
            TreeMap<String, String> map = getPublidParams(apiName);//所有参数放在次map中,进行排序
            map.put("outRefundNo", "outRefundNo");
            map.put("outTradeNo", "outTradeNo");
            map.put("refundAmount", "0.01");
            map.put("refundReason", "refundReason");
            map.put("deviceIp", "deviceIp");
    
            String signContent = getSignContent(map);
            //加签之后,除了sign,不可再放入参数
            map.put("sign", MD5.sign(signContent, secret, "UTF-8").toUpperCase());//secret就是颁发的密钥
            String postData = HttpClientUtils.post(doamin + apiName, map);
            return postData;
        }
    
    
        /****
         * 查询退款结果
         * @return
         */
        public static String queryRefund(){
            String apiName = "/trade/refund/result";
            TreeMap<String, String> map = getPublidParams(apiName);//所有参数放在次map中,进行排序
            map.put("outRefundNo", "outRefundNo");
            String signContent = getSignContent(map);
            //加签之后,除了sign,不可再放入参数
            map.put("sign", MD5.sign(signContent, secret, "UTF-8").toUpperCase());//secret就是颁发的密钥
            String postData = HttpClientUtils.post(doamin + apiName, map);
            return postData;
        }
    
        /****
         * 设置公共参数
         * @return
         */
        public static TreeMap<String, String> getPublidParams(String apiName){
            TreeMap<String, String> map = Maps.newTreeMap();//所有参数放在次map中,进行排序
            map.put("pid", pid);//支付中心颁发的pid
            map.put("appId", appId);//支付中心颁发的appId
            map.put("apiName",apiName);//调用的方法uri,比如/trade/create
            map.put("time", String.valueOf(System.currentTimeMillis()));
            map.put("version", "1.0.0");
            map.put("mid", mid);
            return map;
        }
    
        /****
         * 使用了TreeMap进行排序后的参数map
         * @return
         */
        public static String getSignContent(TreeMap<String, String> params) {
            if (MapUtils.isEmpty(params)) {
                return null;
            }
    
            StringBuilder content = new StringBuilder();
            boolean first = true;
            for (String key : params.keySet()) {
                String value = params.get(key);
                if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value) && !key.equalsIgnoreCase("sign")) {
                    content.append((first ? "" : "&") + key + "=" + value);
                    first = false;
                }
            }
    
            return content.toString();
        }
    }