From 6ab618ca44bd460ae18f1e152f7943c292698d12 Mon Sep 17 00:00:00 2001 From: egzosn Date: Sat, 20 Nov 2021 23:49:58 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=83=A8=E5=88=86jdk=E6=97=A0=E6=B3=95=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E8=AF=81=E4=B9=A6=E9=97=AE=E9=A2=98=202.=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E4=B8=8B=E8=BD=BD=E5=AF=B9=E8=B4=A6=E5=8D=95=E6=8A=A5?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2=E9=97=AE?= =?UTF-8?q?=E9=A2=98=203.=E5=BE=AE=E4=BF=A1=E9=80=80=E6=AC=BE=E9=9D=9E?= =?UTF-8?q?=E5=BF=85=E5=A1=AB=E5=8F=82=E6=95=B0=E5=BF=BD=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pay-java-ali/pom.xml | 1 - .../pay/ali/utils/AntCertificationUtil.java | 32 +++++----- .../pay/common/http/ClientHttpRequest.java | 61 ++++++++++--------- .../controller/WxV3CombinePayController.java | 2 +- .../demo/controller/WxV3PayController.java | 12 ++-- .../WxV3ProfitSharingController.java | 2 +- pay-java-wx/pom.xml | 2 +- .../wx/v3/api/DefaultWxPayAssistService.java | 3 +- .../egzosn/pay/wx/v3/api/WxPayService.java | 4 +- .../pay/wx/v3/utils/AntCertificationUtil.java | 11 +++- pom.xml | 6 +- 11 files changed, 76 insertions(+), 60 deletions(-) diff --git a/pay-java-ali/pom.xml b/pay-java-ali/pom.xml index 566487f..9014156 100644 --- a/pay-java-ali/pom.xml +++ b/pay-java-ali/pom.xml @@ -22,7 +22,6 @@ org.bouncycastle bcprov-jdk15on - ${bcprov-jdk15on.version} diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/utils/AntCertificationUtil.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/utils/AntCertificationUtil.java index b3057cd..e21af86 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/utils/AntCertificationUtil.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/utils/AntCertificationUtil.java @@ -24,9 +24,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.bouncycastle.jce.provider.BouncyCastleProvider; import com.egzosn.pay.common.bean.result.PayException; import com.egzosn.pay.common.exception.PayErrorException; @@ -38,17 +38,19 @@ import com.egzosn.pay.common.util.str.StringUtils; * 证书文件可信校验 * * @author junying.wjy - * @version $Id: AntCertificationUtil.java, v 0.1 2019-07-29 下午04:46 junying.wjy Exp $ - * * @author egan update 2020/10/12 - * + * @version $Id: AntCertificationUtil.java, v 0.1 2019-07-29 下午04:46 junying.wjy Exp $ */ public class AntCertificationUtil { private static final Logger LOGGER = LoggerFactory.getLogger(AntCertificationUtil.class); + static { - Security.removeProvider("SunEC"); - Security.addProvider(new BouncyCastleProvider()); + if (null == Security.getProvider("BC")) { + Security.removeProvider("SunEC"); + Security.addProvider(new BouncyCastleProvider()); + } } + /** * 验证证书是否可信 * @@ -141,7 +143,7 @@ public class AntCertificationUtil { //验证证书链 for (int i = 1; i < certs.length; i++) { X509Certificate cert = certs[i]; - if (!checkValidity(cert)){ + if (!checkValidity(cert)) { return false; } verifySignature(prev.getPublicKey(), cert); @@ -155,7 +157,7 @@ public class AntCertificationUtil { /** * 验证证书链是否是信任证书库中证书签发的 * - * @param cert 目标验证证书 + * @param cert 目标验证证书 * @return 验证结果 */ private static boolean checkValidity(X509Certificate cert) { @@ -172,13 +174,11 @@ public class AntCertificationUtil { } - - private static void verifySignature(PublicKey publicKey, X509Certificate cert){ + private static void verifySignature(PublicKey publicKey, X509Certificate cert) { try { cert.verify(publicKey); - } - catch (GeneralSecurityException e) { - throw new PayErrorException(new PayException("证书校验失败", e.getMessage())); + } catch (GeneralSecurityException e) { + throw new PayErrorException(new PayException("证书校验失败", e.getMessage())); } } @@ -281,7 +281,7 @@ public class AntCertificationUtil { addressingDown(issuerMap, certChain, subject); } - private static X509Certificate[] readPemCertChain(String cert){ + private static X509Certificate[] readPemCertChain(String cert) { ByteArrayInputStream inputStream = new ByteArrayInputStream(cert.getBytes()); CertificateFactory factory = null; try { @@ -305,7 +305,7 @@ public class AntCertificationUtil { String rootCertSN = null; try { X509Certificate[] x509Certificates = readPemCertChain(rootCertContent); - if (null == x509Certificates){ + if (null == x509Certificates) { return null; } MessageDigest md = MessageDigest.getInstance("MD5"); @@ -383,8 +383,6 @@ public class AntCertificationUtil { } - - public static String readFromInputStream(InputStream cert) { try { return new String(IOUtils.toByteArray(cert), StandardCharsets.UTF_8); diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java b/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java index 49681ed..99ec689 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java @@ -317,6 +317,38 @@ public class ClientHttpRequest extends HttpEntityEnclosingRequestBase impleme * @throws IOException 响应类型文本转换时抛出异常 */ private T toBean(HttpEntity entity, String[] contentType) throws IOException { + + + //是否为 输入流 + if (InputStream.class.isAssignableFrom(responseType)) { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + entity.writeTo(os); + return (T) new ByteArrayInputStream(os.toByteArray()); + } + //是否为 字节数数组 + if (byte[].class.isAssignableFrom(responseType)) { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + entity.writeTo(os); + return (T) os.toByteArray(); + } + //输出流 + if (OutputStream.class.isAssignableFrom(responseType)) { + try { + OutputStream t; + if (responseType == OutputStream.class){ + t= new ByteArrayOutputStream(); + }else { + t = (OutputStream) responseType.newInstance(); + } + entity.writeTo( t); + return (T) t; + } catch (InstantiationException e) { + throw new PayErrorException(new PayException("InstantiationException", e.getMessage())); + } catch (IllegalAccessException e) { + throw new PayErrorException(new PayException("IllegalAccessException", e.getMessage())); + } + } + //判断内容类型是否为文本类型 if (isText(contentType[0])) { /* String charset = "UTF-8"; @@ -359,35 +391,6 @@ public class ClientHttpRequest extends HttpEntityEnclosingRequestBase impleme throw new PayErrorException(new PayException("failure", "类型转化异常,contentType:" + entity.getContentType().getValue(), result)); } - //是否为 输入流 - if (InputStream.class.isAssignableFrom(responseType)) { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - entity.writeTo(os); - return (T) new ByteArrayInputStream(os.toByteArray()); - } - //是否为 字节数数组 - if (byte[].class.isAssignableFrom(responseType)) { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - entity.writeTo(os); - return (T) os.toByteArray(); - } - //输出流 - if (OutputStream.class.isAssignableFrom(responseType)) { - try { - OutputStream t; - if (responseType == OutputStream.class){ - t= new ByteArrayOutputStream(); - }else { - t = (OutputStream) responseType.newInstance(); - } - entity.writeTo( t); - return (T) t; - } catch (InstantiationException e) { - throw new PayErrorException(new PayException("InstantiationException", e.getMessage())); - } catch (IllegalAccessException e) { - throw new PayErrorException(new PayException("IllegalAccessException", e.getMessage())); - } - } throw new PayErrorException(new PayException("failure", "类型转化异常,contentType:" + entity.getContentType().getValue())); } diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxV3CombinePayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxV3CombinePayController.java index ce65d86..2724601 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxV3CombinePayController.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxV3CombinePayController.java @@ -46,7 +46,7 @@ public class WxV3CombinePayController { private WxCombinePayService service = null; - @PostConstruct //没有证书的情况下注释掉,避免启动报错 +// @PostConstruct //没有证书的情况下注释掉,避免启动报错 public void init() { WxPayConfigStorage wxPayConfigStorage = new WxPayConfigStorage(); wxPayConfigStorage.setAppId("wxc7b993ff15a9f26c"); diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxV3PayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxV3PayController.java index 621c83f..e9fbd6f 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxV3PayController.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxV3PayController.java @@ -27,6 +27,9 @@ import com.egzosn.pay.web.support.HttpRequestNoticeParams; import com.egzosn.pay.wx.v3.api.WxPayConfigStorage; import com.egzosn.pay.wx.v3.api.WxPayService; import com.egzosn.pay.wx.v3.bean.WxTransactionType; +import com.egzosn.pay.wx.v3.bean.order.H5Info; +import com.egzosn.pay.wx.v3.bean.order.SceneInfo; +import com.egzosn.pay.wx.v3.utils.WxConst; /** * 微信V3发起支付入口 @@ -75,12 +78,11 @@ public class WxV3PayController { @RequestMapping(value = "toPay.html", produces = "text/html;charset=UTF-8") public String toPay(HttpServletRequest request, BigDecimal price) { PayOrder order = new PayOrder("订单title", "摘要", null == price ? BigDecimal.valueOf(0.01) : price, UUID.randomUUID().toString().replace("-", ""), WxTransactionType.H5); - order.setSpbillCreateIp(request.getHeader("X-Real-IP")); StringBuffer requestURL = request.getRequestURL(); - //设置网页地址 - order.setWapUrl(requestURL.substring(0, requestURL.indexOf("/") > 0 ? requestURL.indexOf("/") : requestURL.length())); - //设置网页名称 - order.setWapName("在线充值"); + SceneInfo sceneInfo = new SceneInfo(); + sceneInfo.setPayerClientIp(request.getHeader("X-Real-IP")); + sceneInfo.setH5Info(new H5Info("在线充值", requestURL.substring(0, requestURL.indexOf("/") > 0 ? requestURL.indexOf("/") : requestURL.length()))); + order.addAttr(WxConst.SCENE_INFO, sceneInfo); // Map orderInfo = service.orderInfo(order); // return service.buildRequest(orderInfo, MethodType.POST); diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxV3ProfitSharingController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxV3ProfitSharingController.java index 299fea1..793864d 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxV3ProfitSharingController.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxV3ProfitSharingController.java @@ -44,7 +44,7 @@ public class WxV3ProfitSharingController { private WxProfitSharingService service = null; - @PostConstruct //没有证书的情况下注释掉,避免启动报错 +// @PostConstruct //没有证书的情况下注释掉,避免启动报错 public void init() { WxPayConfigStorage wxPayConfigStorage = new WxPayConfigStorage(); wxPayConfigStorage.setAppId("wxc7b993ff15a9f26c"); diff --git a/pay-java-wx/pom.xml b/pay-java-wx/pom.xml index e6dd416..b4ecdce 100644 --- a/pay-java-wx/pom.xml +++ b/pay-java-wx/pom.xml @@ -23,7 +23,7 @@ org.bouncycastle bcprov-jdk15on - ${bcprov-jdk15on.version} + diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/v3/api/DefaultWxPayAssistService.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/v3/api/DefaultWxPayAssistService.java index 906a529..9d6ab0d 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/v3/api/DefaultWxPayAssistService.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/v3/api/DefaultWxPayAssistService.java @@ -70,7 +70,8 @@ public class DefaultWxPayAssistService implements WxPayAssistService { * @return 响应内容体 */ public JSONObject doExecute(Map parameters, TransactionType transactionType) { - String requestBody = JSON.toJSONString(parameters, SerializerFeature.WriteMapNullValue); +// String requestBody = JSON.toJSONString(parameters, SerializerFeature.WriteMapNullValue); + String requestBody = JSON.toJSONString(parameters); return doExecute(requestBody, transactionType); } diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/v3/api/WxPayService.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/v3/api/WxPayService.java index 75d5f99..be3e5e1 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/v3/api/WxPayService.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/v3/api/WxPayService.java @@ -302,7 +302,7 @@ public class WxPayService extends BasePayService { params.put("prepayid", prepayId); params.put("package", "Sign=WXPay"); } - String signText = StringUtils.joining("\n", appId, timeStamp, prepayId); + String signText = StringUtils.joining("\n", appId, timeStamp, randomStr, prepayId); String paySign = createSign(signText, payConfigStorage.getInputCharset()); params.put(WxTransactionType.JSAPI.equals(order.getTransactionType()) ? "paySign" : "sign", paySign); return params; @@ -525,6 +525,8 @@ public class WxPayService extends BasePayService { } + + /** * 查询退款 * diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/v3/utils/AntCertificationUtil.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/v3/utils/AntCertificationUtil.java index 2c4cedb..46c5bfc 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/v3/utils/AntCertificationUtil.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/v3/utils/AntCertificationUtil.java @@ -10,6 +10,7 @@ import java.security.KeyStoreException; import java.security.NoSuchProviderException; import java.security.PrivateKey; import java.security.PublicKey; +import java.security.Security; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; @@ -21,6 +22,8 @@ import javax.crypto.Cipher; import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.SecretKeySpec; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.util.sign.encrypt.Base64; import com.egzosn.pay.wx.bean.WxPayError; @@ -49,6 +52,10 @@ public final class AntCertificationUtil { static { try { + if (null == Security.getProvider("BC")) { + Security.removeProvider("SunEC"); + Security.addProvider(new BouncyCastleProvider()); + } PKCS12_KEY_STORE = KeyStore.getInstance("PKCS12"); } catch (KeyStoreException e) { @@ -133,7 +140,7 @@ public final class AntCertificationUtil { * @param cipherText 需要解密的文本 * @param secretKey 密钥 * @param characterEncoding 编码类型 - * @return 解密后的信息 + * @return 解密后的信息 */ public static String decryptToString(String associatedData, String nonce, String cipherText, String secretKey, String characterEncoding) { @@ -156,7 +163,7 @@ public final class AntCertificationUtil { * * @param message the message * @param certificate the certificate - * @return 加密后的内容 + * @return 加密后的内容 */ public static String encryptToString(String message, Certificate certificate) { try { diff --git a/pom.xml b/pom.xml index 3c1d50c..0cca8c9 100644 --- a/pom.xml +++ b/pom.xml @@ -106,7 +106,11 @@ fastjson 1.2.73 - + + org.bouncycastle + bcprov-jdk15on + ${bcprov-jdk15on.version} +