# 代码示例
签名方法
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();
}
}