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}
+