From 9bb185286b4b2a6036b735f75f232bcb27acd7f9 Mon Sep 17 00:00:00 2001 From: egzosn Date: Wed, 6 Dec 2017 13:56:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/common/util/{sign/sm3 => }/Util.java | 6 +- .../pay/common/util/sign/SecureUtil.java | 2 +- .../pay/common/util/sign/SignUtils.java | 33 +++++++++++ .../util/sign/{ => encrypt}/sm3/SM3.java | 4 +- .../sign/{ => encrypt}/sm3/SM3Digest.java | 14 +---- .../com/egzosn/pay/union/SDK/CertUtil.java | 5 +- .../egzosn/pay/union/api/UnionPayService.java | 57 ++++++++++++++++++- .../pay/union/enums/UnionTransactionType.java | 4 +- 8 files changed, 104 insertions(+), 21 deletions(-) rename pay-java-common/src/main/java/com/egzosn/pay/common/util/{sign/sm3 => }/Util.java (99%) rename pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/{ => encrypt}/sm3/SM3.java (98%) rename pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/{ => encrypt}/sm3/SM3Digest.java (88%) diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/sm3/Util.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/Util.java similarity index 99% rename from pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/sm3/Util.java rename to pay-java-common/src/main/java/com/egzosn/pay/common/util/Util.java index cdbcacb..a033597 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/sm3/Util.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/Util.java @@ -1,8 +1,8 @@ -package com.egzosn.pay.common.util.sign.sm3; +package com.egzosn.pay.common.util; import java.math.BigInteger; -public class Util +public class Util { /** * 整形转换成网络传输的字节流(字节数组)型数据 @@ -226,7 +226,7 @@ public class Util * @return 十六进制char[] */ public static char[] encodeHex(byte[] data, boolean toLowerCase) { - return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); + return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); } /** diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SecureUtil.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SecureUtil.java index edccc34..5c9b23b 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SecureUtil.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SecureUtil.java @@ -1,6 +1,6 @@ package com.egzosn.pay.common.util.sign; -import com.egzosn.pay.common.util.sign.sm3.SM3Digest; +import com.egzosn.pay.common.util.sign.encrypt.sm3.SM3Digest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java index 6b4da14..22962ac 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java @@ -63,6 +63,39 @@ public enum SignUtils { return com.egzosn.pay.common.util.sign.encrypt.RSA2.sign(content, key, characterEncoding); } + @Override + public boolean verify(String text, String sign, String publicKey, String characterEncoding) { + return com.egzosn.pay.common.util.sign.encrypt.RSA2.verify(text, sign, publicKey, characterEncoding); + } + }, + SHA1 { + @Override + public String createSign(String content, String key, String characterEncoding) { + return com.egzosn.pay.common.util.sign.encrypt.SHA1.sign(content, key, characterEncoding); + } + + @Override + public boolean verify(String text, String sign, String publicKey, String characterEncoding) { + return com.egzosn.pay.common.util.sign.encrypt.SHA1.verify(text, sign, publicKey, characterEncoding); + } + }, + SHA256 { + @Override + public String createSign(String content, String key, String characterEncoding) { + return com.egzosn.pay.common.util.sign.encrypt.SHA256.sign(content, key, characterEncoding); + } + + @Override + public boolean verify(String text, String sign, String publicKey, String characterEncoding) { + return com.egzosn.pay.common.util.sign.encrypt.SHA256.verify(text, sign, publicKey, characterEncoding); + } + }, + SM3 { + @Override + public String createSign(String content, String key, String characterEncoding) { + return com.egzosn.pay.common.util.sign.encrypt.RSA2.sign(content, key, characterEncoding); + } + @Override public boolean verify(String text, String sign, String publicKey, String characterEncoding) { return com.egzosn.pay.common.util.sign.encrypt.RSA2.verify(text, sign, publicKey, characterEncoding); diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/sm3/SM3.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/sm3/SM3.java similarity index 98% rename from pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/sm3/SM3.java rename to pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/sm3/SM3.java index eba799e..1656c32 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/sm3/SM3.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/sm3/SM3.java @@ -1,4 +1,6 @@ -package com.egzosn.pay.common.util.sign.sm3; +package com.egzosn.pay.common.util.sign.encrypt.sm3; + +import com.egzosn.pay.common.util.Util; public class SM3 { diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/sm3/SM3Digest.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/sm3/SM3Digest.java similarity index 88% rename from pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/sm3/SM3Digest.java rename to pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/sm3/SM3Digest.java index cfacdd4..1d13245 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/sm3/SM3Digest.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/sm3/SM3Digest.java @@ -1,4 +1,4 @@ -package com.egzosn.pay.common.util.sign.sm3; +package com.egzosn.pay.common.util.sign.encrypt.sm3; public class SM3Digest { @@ -129,15 +129,5 @@ public class SM3Digest { return BYTE_LENGTH; } -// -// public static void main(String[] args) -// { -// byte[] md = new byte[32]; -// byte[] msg1 = "ererfeiisgod".getBytes(); -// SM3Digest sm3 = new SM3Digest(); -// sm3.update(msg1, 0, msg1.length); -// sm3.doFinal(md, 0); -// String s = new String(Hex.encode(md)); -// System.out.println(s.toUpperCase()); -// } + } \ No newline at end of file diff --git a/pay-java-union/src/main/java/com/egzosn/pay/union/SDK/CertUtil.java b/pay-java-union/src/main/java/com/egzosn/pay/union/SDK/CertUtil.java index 797db76..4d8bcaa 100644 --- a/pay-java-union/src/main/java/com/egzosn/pay/union/SDK/CertUtil.java +++ b/pay-java-union/src/main/java/com/egzosn/pay/union/SDK/CertUtil.java @@ -18,6 +18,7 @@ package com.egzosn.pay.union.SDK; import com.egzosn.pay.common.util.str.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.io.*; import java.math.BigInteger; @@ -34,7 +35,9 @@ import java.util.concurrent.ConcurrentHashMap; * */ public class CertUtil { - //日志 + /** + * 日志 + */ protected static final Log log = LogFactory.getLog(CertUtil.class); public static final String UNIONPAY_CNNAME = "中国银联股份有限公司"; diff --git a/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java b/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java index 3136169..9fe21e7 100644 --- a/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java +++ b/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java @@ -9,6 +9,7 @@ import com.egzosn.pay.common.bean.result.PayException; import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.common.util.MatrixToImageWriter; +import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; import com.egzosn.pay.union.SDK.CertUtil; import com.egzosn.pay.union.SDK.SDKConfig; @@ -47,6 +48,7 @@ public class UnionPayService extends BasePayService { SDKConfig.getConfig().loadPropertiesFromSrc(); } + /** * 银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改 * @return 返回参数集合 @@ -55,7 +57,7 @@ public class UnionPayService extends BasePayService { Map params = new HashMap<>(); params.put(SDKConstants.param_version, SDKConfig.getConfig().getVersion()); params.put(SDKConstants.param_encoding, payConfigStorage.getInputCharset().toUpperCase()); - params.put(SDKConstants.param_signMethod, SDKConfig.getConfig().getSignMethodByStr(payConfigStorage.getSignType())); + params.put(SDKConstants.param_merId, payConfigStorage.getPid()); //接入类型,商户接入填0 ,不需修改(0:直连商户, 1: 收单机构 2:平台商户) params.put(SDKConstants.param_accessType, "0"); @@ -130,6 +132,7 @@ public class UnionPayService extends BasePayService { @Override public Map orderInfo (PayOrder order) { Map params = this.getCommonParam(); + UnionTransactionType type = (UnionTransactionType)order.getTransactionType(); type.convertMap(params); switch (type){ @@ -153,6 +156,55 @@ public class UnionPayService extends BasePayService { } + /** + * 根据签名类型获取银联签名对应的参数 + * @param signType 签名类型 + * @return 签名参数 + */ + public String getSignMethod(SignUtils signType) { + switch (signType) { + case RSA: + case RSA2: + return SDKConstants.SIGNMETHOD_RSA; + case SHA256: + return SDKConstants.SIGNMETHOD_SHA256; + case SM3: + return SDKConstants.SIGNMETHOD_SM3; + default: + return SDKConstants.SIGNMETHOD_RSA; + } + } + + + + /** + * 创建签名 + * + * @param content 需要签名的内容 + * @param characterEncoding 字符编码 + * @return 签名 + */ + @Override + public String createSign(String content, String characterEncoding) { + + return SignUtils.valueOf(payConfigStorage.getSignType()).createSign(content, payConfigStorage.getKeyPrivate(),characterEncoding); + } + + /** + * 生成并设置签名 + * @param parameters 请求参数 + * @return 请求参数 + */ + private Map setSign(Map parameters){ + SignUtils signUtils = SignUtils.valueOf(payConfigStorage.getSignType()); + parameters.put(SDKConstants.param_signMethod, getSignMethod(signUtils)); + + String sign = createSign( SignUtils.parameterText(parameters, "&"), payConfigStorage.getInputCharset()); + + parameters.put("sign", sign); + return parameters; + } + /** * 获取输出二维码,用户返回给支付端, * @@ -162,6 +214,9 @@ public class UnionPayService extends BasePayService { @Override public BufferedImage genQrPay (PayOrder order) { Map params = orderInfo(order); + + + CertUtil.sign(params,payConfigStorage.getInputCharset().toUpperCase()); JSONObject response = getHttpRequestTemplate().postForObject(SDKConfig.getConfig().getBackRequestUrl(),params,JSONObject.class); if(SDKUtils.validate(response,payConfigStorage.getInputCharset().toUpperCase())){ diff --git a/pay-java-union/src/main/java/com/egzosn/pay/union/enums/UnionTransactionType.java b/pay-java-union/src/main/java/com/egzosn/pay/union/enums/UnionTransactionType.java index 19b2318..3c777f1 100644 --- a/pay-java-union/src/main/java/com/egzosn/pay/union/enums/UnionTransactionType.java +++ b/pay-java-union/src/main/java/com/egzosn/pay/union/enums/UnionTransactionType.java @@ -19,10 +19,10 @@ public enum UnionTransactionType implements TransactionType{ CONSUME("01","06","000000","08"), //消费撤销 CONSUME_UNDO("31","00","000000","08"), - //查询 - QUERY("00","00","000201",""), //退款 REFUND("04","00","000000","08"), + //查询 + QUERY("00","00","000201",""), //对账文件下载 File_Transfer("00","00","000201","") ;