diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayService.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayService.java index 187cbed..cc7213b 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayService.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayService.java @@ -17,7 +17,10 @@ import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSON; import com.egzosn.pay.common.bean.BillType; import com.egzosn.pay.common.bean.MethodType; +import com.egzosn.pay.common.bean.NoticeParams; +import com.egzosn.pay.common.bean.NoticeRequest; import com.egzosn.pay.common.bean.Order; +import com.egzosn.pay.common.bean.OrderParaStructure; import com.egzosn.pay.common.bean.PayMessage; import com.egzosn.pay.common.bean.PayOrder; import com.egzosn.pay.common.bean.PayOutMessage; @@ -119,6 +122,7 @@ public abstract class BasePayService implements Pay return base64ClientID; } + /** * 创建签名 * @@ -395,6 +399,17 @@ public abstract class BasePayService implements Pay interceptors.add(interceptor); } + /** + * 将请求参数或者请求流转化为 Map + * + * @param request 通知请求 + * @return 获得回调的请求参数 + */ + @Override + public NoticeParams getNoticeParams(NoticeRequest request) { + return null; + } + /** * 将请求参数或者请求流转化为 Map * @@ -469,20 +484,26 @@ public abstract class BasePayService implements Pay return orderInfo; } + /** + * 过时 + * @param parameters 参数map + * @param key key + * @param value 值 + * @return 返回订单参数 + */ + @Deprecated protected Map setParameters(Map parameters, String key, String value) { - if (StringUtils.isNotEmpty(value)) { - parameters.put(key, value); - } - return parameters; + return OrderParaStructure.loadParameters(parameters, key, value); } - + /** + * 过时 + * @param parameters 参数map + * @param key key + * @param order 订单对象 + * @return 返回订单参数 + */ protected Map setParameters(Map parameters, String key, Order order) { - Object attr = order.getAttr(key); - if (null != attr && !"".equals(attr)) { - order.getAttrs().remove(key); - parameters.put(key, attr); - } - return parameters; + return OrderParaStructure.loadParameters(parameters, key, order); } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayService.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayService.java index bf5256f..178d69c 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayService.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayService.java @@ -7,6 +7,8 @@ import java.util.Map; import com.egzosn.pay.common.bean.BillType; import com.egzosn.pay.common.bean.MethodType; +import com.egzosn.pay.common.bean.NoticeParams; +import com.egzosn.pay.common.bean.NoticeRequest; import com.egzosn.pay.common.bean.PayMessage; import com.egzosn.pay.common.bean.PayOrder; import com.egzosn.pay.common.bean.PayOutMessage; @@ -59,14 +61,22 @@ public interface PayService { */ PayService setRequestTemplateConfigStorage(HttpConfigStorage configStorage); + /** + * 回调校验 + * 已过时方法,详情{@link #verify(NoticeParams)} + * @param params 回调回来的参数集 + * @return 签名校验 true通过 + */ + @Deprecated + boolean verify(Map params); + /** * 回调校验 * * @param params 回调回来的参数集 * @return 签名校验 true通过 */ - - boolean verify(Map params); + boolean verify(NoticeParams params); /** @@ -114,8 +124,17 @@ public interface PayService { * @param is 请求流 * @return 获得回调的请求参数 */ + @Deprecated Map getParameter2Map(Map parameterMap, InputStream is); + /** + * 将请求参数或者请求流转化为 Map + * + * @param request 通知请求 + * @return 获得回调的请求参数 + */ + NoticeParams getNoticeParams(NoticeRequest request); + /** * 获取输出消息,用户返回给支付端 * diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/NoticeParams.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/NoticeParams.java index 71880b0..f89ac97 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/NoticeParams.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/NoticeParams.java @@ -42,6 +42,11 @@ public class NoticeParams { */ private Map> headers; + /** + * 附加属性 + */ + private Map attr; + public NoticeParams(Map body) { this.body = body; @@ -82,4 +87,12 @@ public class NoticeParams { public void setHeaders(Map> headers) { this.headers = headers; } + + public Map getAttr() { + return attr; + } + + public void setAttr(Map attr) { + this.attr = attr; + } } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/OrderParaStructure.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/OrderParaStructure.java new file mode 100644 index 0000000..c651b25 --- /dev/null +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/OrderParaStructure.java @@ -0,0 +1,35 @@ +package com.egzosn.pay.common.bean; + +import java.util.Map; + +import com.egzosn.pay.common.util.str.StringUtils; + +/** + * 订单参数构造器 + * @author Egan + *
+ * email egzosn@gmail.com
+ * date 2021/8/16
+ * 
+ */ +public final class OrderParaStructure { + private OrderParaStructure() { + } + + public static Map loadParameters(Map parameters, String key, String value) { + if (StringUtils.isNotEmpty(value)) { + parameters.put(key, value); + } + return parameters; + } + + public static Map loadParameters(Map parameters, String key, Order order) { + Object attr = order.getAttr(key); + if (null != attr && !"".equals(attr)) { + order.getAttrs().remove(key); + parameters.put(key, attr); + } + return parameters; + } + +} diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA.java index ec060ac..4911def 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA.java @@ -12,6 +12,7 @@ import java.security.GeneralSecurityException; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; +import java.security.cert.Certificate; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; @@ -136,10 +137,7 @@ public class RSA { public static boolean verify(String content, String sign, String publicKey, String signAlgorithms, String characterEncoding) { try { PublicKey pubKey = getPublicKey(publicKey, ALGORITHM); - java.security.Signature signature = java.security.Signature.getInstance(signAlgorithms); - signature.initVerify(pubKey); - signature.update(content.getBytes(characterEncoding)); - return signature.verify(Base64.decode(sign)); + return verify(content, sign, pubKey, signAlgorithms, characterEncoding); } catch (GeneralSecurityException e) { LOG.error("", e); @@ -176,6 +174,7 @@ public class RSA { return false; } + /** * RSA验签名检查 * @@ -204,6 +203,20 @@ public class RSA { return verify(content, sign, publicKey, SIGN_ALGORITHMS, characterEncoding); } + + /** + * RSA验签名检查 + * + * @param content 待签名数据 + * @param sign 签名值 + * @param publicKey 公钥 + * @param characterEncoding 编码格式 + * @return 布尔值 + */ + public static boolean verify(String content, String sign, Certificate publicKey, String characterEncoding) { + final PublicKey pubKey = publicKey.getPublicKey(); + return verify(content, sign, pubKey, SIGN_ALGORITHMS, characterEncoding); + } /** * 解密 * diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA2.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA2.java index 46cae1c..d25251c 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA2.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/RSA2.java @@ -5,93 +5,109 @@ import java.io.IOException; import java.security.GeneralSecurityException; import java.security.PrivateKey; import java.security.PublicKey; +import java.security.cert.Certificate; public class RSA2 { - private static final String SIGN_SHA256RSA_ALGORITHMS = "SHA256WithRSA"; + private static final String SIGN_SHA256RSA_ALGORITHMS = "SHA256WithRSA"; + public static String sign(String content, String privateKey, String characterEncoding) { - public static String sign(String content, String privateKey, String characterEncoding) { - - return RSA.sign(content, privateKey, SIGN_SHA256RSA_ALGORITHMS, characterEncoding); - } + return RSA.sign(content, privateKey, SIGN_SHA256RSA_ALGORITHMS, characterEncoding); + } + /** + * RSA签名 + * + * @param content 待签名数据 + * @param privateKey 私钥 + * @param characterEncoding 编码格式 + * @return 签名值 + */ + public static String sign(String content, PrivateKey privateKey, String characterEncoding) { + return RSA.sign(content, privateKey, SIGN_SHA256RSA_ALGORITHMS, characterEncoding); + } - /** - * RSA签名 - * @param content 待签名数据 - * @param privateKey 私钥 - * @param characterEncoding 编码格式 - * @return 签名值 - */ - public static String sign(String content, PrivateKey privateKey ,String characterEncoding){ - return RSA.sign(content, privateKey, SIGN_SHA256RSA_ALGORITHMS, characterEncoding); - } + /** + * RSA验签名检查 + * + * @param content 待签名数据 + * @param sign 签名值 + * @param publicKey 公钥 + * @param characterEncoding 编码格式 + * @return 布尔值 + */ + public static boolean verify(String content, String sign, String publicKey, String characterEncoding) { - /** - * RSA验签名检查 - * @param content 待签名数据 - * @param sign 签名值 - * @param publicKey 公钥 - * @param characterEncoding 编码格式 - * @return 布尔值 - */ - public static boolean verify(String content, String sign, String publicKey, String characterEncoding){ - - return RSA.verify(content, sign, publicKey, SIGN_SHA256RSA_ALGORITHMS, characterEncoding ); - } + return RSA.verify(content, sign, publicKey, SIGN_SHA256RSA_ALGORITHMS, characterEncoding); + } + /** + * RSA验签名检查 + * + * @param content 待签名数据 + * @param sign 签名值 + * @param publicKey 公钥 + * @param characterEncoding 编码格式 + * @return 布尔值 + */ + public static boolean verify(String content, String sign, PublicKey publicKey, String characterEncoding) { + return RSA.verify(content, sign, publicKey, SIGN_SHA256RSA_ALGORITHMS, characterEncoding); + } - /** - * RSA验签名检查 - * @param content 待签名数据 - * @param sign 签名值 - * @param publicKey 公钥 - * @param characterEncoding 编码格式 - * @return 布尔值 - */ - public static boolean verify(String content, String sign, PublicKey publicKey, String characterEncoding){ - return RSA.verify(content, sign, publicKey, SIGN_SHA256RSA_ALGORITHMS, characterEncoding); - } + /** + * RSA验签名检查 + * + * @param content 待签名数据 + * @param sign 签名值 + * @param publicKey 公钥 + * @param characterEncoding 编码格式 + * @return 布尔值 + */ + public static boolean verify(String content, String sign, Certificate publicKey, String characterEncoding) { + PublicKey pubKey = publicKey.getPublicKey(); + return verify(content, sign, pubKey, characterEncoding); + } - /** - * 解密 - * @param content 密文 - * @param privateKey 商户私钥 - * @param characterEncoding 编码格式 - * @return 解密后的字符串 - * @throws GeneralSecurityException 解密异常 - * @throws IOException 解密异常 - */ - public static String decrypt(String content, String privateKey, String characterEncoding) throws GeneralSecurityException, IOException { + /** + * 解密 + * + * @param content 密文 + * @param privateKey 商户私钥 + * @param characterEncoding 编码格式 + * @return 解密后的字符串 + * @throws GeneralSecurityException 解密异常 + * @throws IOException 解密异常 + */ + public static String decrypt(String content, String privateKey, String characterEncoding) throws GeneralSecurityException, IOException { return RSA.decrypt(content, privateKey, characterEncoding); } - /** - * 得到私钥 - * @param key 密钥字符串(经过base64编码) - * @throws GeneralSecurityException 加密异常 - * @return 私钥 - */ - public static PrivateKey getPrivateKey(String key) throws GeneralSecurityException { - return RSA.getPrivateKey(key); - } + /** + * 得到私钥 + * + * @param key 密钥字符串(经过base64编码) + * @return 私钥 + * @throws GeneralSecurityException 加密异常 + */ + public static PrivateKey getPrivateKey(String key) throws GeneralSecurityException { + return RSA.getPrivateKey(key); + } - /** - * - * @param content 加密文本 - * @param publicKey 公钥 - * @param cipherAlgorithm 算法 - * @param characterEncoding 编码类型 - * @return 加密后文本 - * @throws GeneralSecurityException 加密异常 - * @throws IOException IOException - */ - public static String encrypt(String content, String publicKey, String cipherAlgorithm, String characterEncoding ) throws GeneralSecurityException, IOException { - return Base64.encode(RSA.encrypt(content.getBytes(characterEncoding), RSA.getPublicKey(publicKey), 2048, 11, cipherAlgorithm)); - } + /** + * @param content 加密文本 + * @param publicKey 公钥 + * @param cipherAlgorithm 算法 + * @param characterEncoding 编码类型 + * @return 加密后文本 + * @throws GeneralSecurityException 加密异常 + * @throws IOException IOException + */ + public static String encrypt(String content, String publicKey, String cipherAlgorithm, String characterEncoding) throws GeneralSecurityException, IOException { + return Base64.encode(RSA.encrypt(content.getBytes(characterEncoding), RSA.getPublicKey(publicKey), 2048, 11, cipherAlgorithm)); + } }