diff --git a/pay-java-ali/README.md b/pay-java-ali/README.md
index a1ea919..d9e927b 100644
--- a/pay-java-ali/README.md
+++ b/pay-java-ali/README.md
@@ -9,7 +9,7 @@
AliPayConfigStorage aliPayConfigStorage = new AliPayConfigStorage();
aliPayConfigStorage.setPid("合作者id");
- aliPayConfigStorage.setAppId("应用id");
+ aliPayConfigStorage.setAppid("应用id");
aliPayConfigStorage.setKeyPublic("支付宝公钥");
aliPayConfigStorage.setKeyPrivate("应用私钥");
aliPayConfigStorage.setNotifyUrl("异步回调地址");
@@ -34,16 +34,19 @@
//代理端口
httpConfigStorage.setHttpProxyPort(3308);
//代理用户名
- httpConfigStorage.setHttpProxyUsername("user");
+ httpConfigStorage.setAuthUsername("user");
//代理密码
- httpConfigStorage.setHttpProxyPassword("password");
+ httpConfigStorage.setAuthPassword("password");
/* /网路代理配置 根据需求进行设置**/
/* 网络请求ssl证书 根据需求进行设置**/
- //设置ssl证书路径
- httpConfigStorage.setKeystorePath("证书绝对路径");
+ //设置ssl证书路径 跟着setCertStoreType 进行对应
+ httpConfigStorage.setKeystore("证书文件流,证书字符串信息或证书绝对地址");
//设置ssl证书对应的密码
httpConfigStorage.setStorePassword("证书对应的密码");
+ //设置ssl证书对应的存储方式
+ httpConfigStorage.setCertStoreType(CertStoreType.PATH);
+
/* /网络请求ssl证书**/
/* /网络请求连接池**/
diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayConfigStorage.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayConfigStorage.java
index 7286665..3eef8c4 100644
--- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayConfigStorage.java
+++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayConfigStorage.java
@@ -15,7 +15,7 @@ public class AliPayConfigStorage extends BasePayConfigStorage {
/**
* 商户应用id
*/
- private String appId;
+ private String appid;
/**
* 商户签约拿到的pid,partner_id的简称,合作伙伴身份等同于 partner
*/
@@ -27,13 +27,13 @@ public class AliPayConfigStorage extends BasePayConfigStorage {
private String seller;
- public void setAppId(String appId) {
- this.appId = appId;
+ public void setAppid(String appid) {
+ this.appid = appid;
}
@Override
public String getAppid() {
- return appId;
+ return appid;
}
diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayConfigStorage.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayConfigStorage.java
index 1d45348..3964139 100644
--- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayConfigStorage.java
+++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayConfigStorage.java
@@ -1,8 +1,7 @@
package com.egzosn.pay.common.api;
+import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.bean.MsgType;
-import com.egzosn.pay.common.bean.result.PayException;
-import com.egzosn.pay.common.exception.PayErrorException;
import com.egzosn.pay.common.util.sign.CertDescriptor;
import java.util.concurrent.locks.Lock;
@@ -19,61 +18,57 @@ import java.util.concurrent.locks.ReentrantLock;
*/
public abstract class BasePayConfigStorage implements PayConfigStorage {
- private Object attach;
- /**
- * 证书管理器
- */
- private CertDescriptor certDescriptor;
+ private Object attach;
/**
* 应用私钥,rsa_private pkcs8格式 生成签名时使用
*/
- private String keyPrivate;
+ private String keyPrivate;
/**
- * 应用私钥,rsa_private pkcs8格式 生成签名时使用
+ * 应用私钥证书,rsa_private pkcs8格式 生成签名时使用
*/
- private String keyPrivateCertPwd;
+ private String keyPrivateCertPwd;
/**
* 支付平台公钥(签名校验使用)
*/
- private String keyPublic;
+ private String keyPublic;
/**
* 异步回调地址
*/
- private String notifyUrl;
+ private String notifyUrl;
/**
* 同步回调地址,支付完成后展示的页面
*/
- private String returnUrl;
+ private String returnUrl;
/**
* 签名加密类型
*/
- private String signType;
+ private String signType;
/**
* 字符类型
*/
- private String inputCharset;
+ private String inputCharset;
/**
* 支付类型 aliPay 支付宝, wxPay微信..等等,扩展支付模块定义唯一。
*/
- private String payType;
+ private String payType;
/**
* 消息来源类型
*/
- private MsgType msgType;
+ private MsgType msgType;
/**
* 访问令牌 每次请求其他方法都要传入的值
*/
- private String accessToken;
+ private String accessToken;
/**
* access token 到期时间时间戳
*/
- private long expiresTime;
+ private long expiresTime;
/**
* 授权码锁
*/
@@ -88,10 +83,6 @@ public abstract class BasePayConfigStorage implements PayConfigStorage {
*/
private boolean isCertSign = false;
- /**
- * 支付回调消息
- */
- protected PayMessageHandler handler;
@Override
public Object getAttach() {
@@ -102,17 +93,6 @@ public abstract class BasePayConfigStorage implements PayConfigStorage {
this.attach = attach;
}
- @Override
- public CertDescriptor getCertDescriptor() {
- if (!isCertSign) {
- throw new PayErrorException(new PayException("certDescriptor fail", "isCertSign is false"));
- }
- if (null == certDescriptor) {
- certDescriptor = new CertDescriptor();
- }
- return certDescriptor;
- }
-
@Override
public String getKeyPrivate() {
return keyPrivate;
@@ -121,6 +101,7 @@ public abstract class BasePayConfigStorage implements PayConfigStorage {
public void setKeyPrivate(String keyPrivate) {
this.keyPrivate = keyPrivate;
}
+
@Override
public String getKeyPrivateCertPwd() {
return keyPrivateCertPwd;
@@ -148,7 +129,6 @@ public abstract class BasePayConfigStorage implements PayConfigStorage {
this.notifyUrl = notifyUrl;
}
-
@Override
public String getReturnUrl() {
return returnUrl;
@@ -264,9 +244,6 @@ public abstract class BasePayConfigStorage implements PayConfigStorage {
public void setCertSign(boolean certSign) {
isCertSign = certSign;
- if (certSign) {
- certDescriptor = new CertDescriptor();
- }
}
diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayConfigStorage.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayConfigStorage.java
index 30d9329..8abdb23 100644
--- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayConfigStorage.java
+++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayConfigStorage.java
@@ -20,11 +20,6 @@ import java.util.concurrent.locks.Lock;
* @return 附加信息
*/
Object getAttach();
- /**
- * 获取证书解释器
- * @return 证书解释器
- */
- CertDescriptor getCertDescriptor();
/**
* 获取私钥证书密码
diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/CertStoreType.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/CertStoreType.java
new file mode 100644
index 0000000..196892d
--- /dev/null
+++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/CertStoreType.java
@@ -0,0 +1,69 @@
+package com.egzosn.pay.common.bean;
+
+import java.io.*;
+
+/**
+ * 证书存储类型
+ *
+ * @author egan
+ * email egzosn@gmail.com
+ * date 2019/4/14.23:04
+ */
+public enum CertStoreType {
+
+ /**
+ * 路径,建议绝对路径
+ */
+ PATH {
+ /**
+ * 证书信息转化为对应的输入流
+ *
+ * @param cert 证书信息
+ * @return 输入流
+ */
+ @Override
+ public InputStream getInputStream(Object cert) throws IOException {
+ return new FileInputStream(new File((String) cert));
+ }
+ },
+ /**
+ * 文件流转化成字符串存储至文件或者数据库中
+ */
+ STR {
+ /**
+ * 证书信息转化为对应的输入流
+ *
+ * @param cert 证书信息
+ * @return 输入流
+ */
+ @Override
+ public InputStream getInputStream(Object cert) throws IOException {
+ return new ByteArrayInputStream(((String) cert).getBytes("ISO-8859-1"));
+ }
+ },
+
+ /**
+ * 文件流
+ */
+ INPUT_STREAM {
+ /**
+ * 证书信息转化为对应的输入流
+ *
+ * @param cert 证书信息
+ * @return 输入流
+ */
+ @Override
+ public InputStream getInputStream(Object cert) throws IOException {
+ return (InputStream) cert;
+ }
+ };
+
+ /**
+ * 证书信息转化为对应的输入流
+ *
+ * @param cert 证书信息
+ * @return 输入流
+ */
+ public abstract InputStream getInputStream(Object cert) throws IOException;
+
+}
diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/http/HttpConfigStorage.java b/pay-java-common/src/main/java/com/egzosn/pay/common/http/HttpConfigStorage.java
index f938035..4006a8a 100644
--- a/pay-java-common/src/main/java/com/egzosn/pay/common/http/HttpConfigStorage.java
+++ b/pay-java-common/src/main/java/com/egzosn/pay/common/http/HttpConfigStorage.java
@@ -1,6 +1,8 @@
package com.egzosn.pay.common.http;
+import com.egzosn.pay.common.bean.CertStoreType;
+
import java.io.*;
/**
@@ -29,10 +31,12 @@ public class HttpConfigStorage {
*/
private String authPassword;
+
/**
- * @see #keystore 是否为https请求所需的证书(PKCS12)的地址,默认为地址,否则为证书信息串
+ * 证书存储类型
+ * @see #keystore 是否为https请求所需的证书(PKCS12)的地址,默认为地址,否则为证书信息串,文件流
*/
- private boolean isPath = true;
+ private CertStoreType certStoreType = CertStoreType.PATH;
/**
* https请求所需的证书(PKCS12)
@@ -104,109 +108,35 @@ public class HttpConfigStorage {
this.authPassword = authPassword;
}
- /**
- * 代理用户名
- * @return 代理用户名
- * @see #getAuthUsername()
- */
- @Deprecated
- public String getHttpProxyUsername() {
- return authUsername;
+
+ public CertStoreType getCertStoreType() {
+ return certStoreType;
}
- /**
- * 设置代理用户名
- * @param httpProxyUsername 代理用户名
- * @see #setAuthUsername(String)
- */
- @Deprecated
- public void setHttpProxyUsername(String httpProxyUsername) {
- this.authUsername = httpProxyUsername;
- }
-
- /**
- * 代理密码
- * @return 代理密码
- * @see #getAuthPassword()
- */
- @Deprecated
- public String getHttpProxyPassword() {
- return authPassword;
- }
-
- /**
- * 设置代理密码
- * @param httpProxyPassword 代理密码
- * @see #setAuthPassword(String)
- */
- @Deprecated
- public void setHttpProxyPassword(String httpProxyPassword) {
- this.authPassword = httpProxyPassword;
- }
-
- /**
- * https请求所需的证书(PKCS12)地址,请使用绝对路径
- * @return 证书(PKCS12)地址
- * @see #getKeystore()
- */
- @Deprecated
- public String getKeystorePath() {
- return (String) keystore;
- }
-
- /**
- * 设置https请求所需的证书(PKCS12)地址,请使用绝对路径
- * @param keystorePath 证书(PKCS12)地址
- * @see #getKeystore()
- */
- @Deprecated
- public void setKeystorePath(String keystorePath) {
- this.keystore = keystorePath;
- }
-
-
- /**
- * 获取是否为证书地址
- * @return 是否为证书地址,配合 {@link #getKeystore()}使用
- */
- public boolean isPath() {
- return isPath;
- }
-
- /**
- * 设置是否为证书地址
- * @param path 是否为证书地址
- */
- public void setPath(boolean path) {
- isPath = path;
+ public void setCertStoreType(CertStoreType certStoreType) {
+ this.certStoreType = certStoreType;
}
/**
* 获取证书信息
- * @return 证书信息 根据 {@link #isPath()}进行区别地址与信息串
+ * @return 证书信息 根据 {@link #getCertStoreType()}进行区别地址与信息串
*/
- public InputStream getKeystoreInputStream() throws FileNotFoundException, UnsupportedEncodingException {
- if (null == keystore){
+ public InputStream getKeystoreInputStream() throws IOException {
+ if (null == keystore) {
return null;
}
- if(isPath()){
- return new FileInputStream(new File(getKeystoreStr()));
- }
- if(this.keystore instanceof String){
- return new ByteArrayInputStream(getKeystoreStr().getBytes("ISO-8859-1"));
- }
- return (InputStream) keystore;
+ return certStoreType.getInputStream(keystore);
}
/**
* 获取证书信息
- * @return 证书信息 根据 {@link #isPath()}进行区别地址与信息串
+ * @return 证书信息 根据 {@link #getCertStoreType()}进行区别地址与信息串
*/
public Object getKeystore() {
return keystore;
}
/**
* 获取证书信息 证书地址
- * @return 证书信息 根据 {@link #isPath()}进行区别地址与信息串
+ * @return 证书信息 根据 {@link #getCertStoreType()}进行区别地址与信息串
*/
public String getKeystoreStr() {
return (String) keystore;
diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/CertDescriptor.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/CertDescriptor.java
index c98a620..f16c7d3 100644
--- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/CertDescriptor.java
+++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/CertDescriptor.java
@@ -1,16 +1,15 @@
/**
- *
* Licensed Property to China UnionPay Co., Ltd.
- *
+ *
* (C) Copyright of China UnionPay Co., Ltd. 2010
- * All Rights Reserved.
- *
- *
+ * All Rights Reserved.
+ *
+ *
* Modification History:
* =============================================================================
- * Author Date Description
- * ------------ ---------- ---------------------------------------------------
- * xshu 2014-05-28 证书工具类.
+ * Author Date Description
+ * ------------ ---------- ---------------------------------------------------
+ * xshu 2014-05-28 证书工具类.
* =============================================================================
*/
package com.egzosn.pay.common.util.sign;
@@ -19,10 +18,15 @@ import com.egzosn.pay.common.util.str.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import java.io.*;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
import java.security.*;
-import java.security.cert.*;
-import java.util.*;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.Enumeration;
/**
@@ -31,227 +35,321 @@ import java.util.*;
* 声明:以下代码只是为了方便接入方测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码,性能,规范性等方面的保障
*/
public class CertDescriptor {
- protected static final Log LOG = LogFactory.getLog(CertDescriptor.class);
- /** 证书容器,存储对商户请求报文签名私钥证书. */
- private KeyStore keyStore = null;
+ protected static final Log LOG = LogFactory.getLog(CertDescriptor.class);
+ /**
+ * 证书容器,存储对商户请求报文签名私钥证书.
+ */
+ private KeyStore keyStore = null;
- /** 验签公钥/中级证书 */
- private X509Certificate publicKeyCert = null;
- /** 验签根证书 */
- private X509Certificate rootKeyCert = null;
+ /**
+ * 验签公钥/中级证书
+ */
+ private X509Certificate publicKeyCert = null;
+ /**
+ * 验签根证书
+ */
+ private X509Certificate rootKeyCert = null;
+ /**
+ * 通过证书路径初始化为公钥证书
+ *
+ * @param certIn 证书流
+ * @return X509 证书
+ */
+ private static X509Certificate initCert(InputStream certIn) {
+ X509Certificate encryptCertTemp = null;
+ CertificateFactory cf = null;
+ try {
+ cf = CertificateFactory.getInstance("X.509");
+ encryptCertTemp = (X509Certificate) cf.generateCertificate(certIn);
+ // 打印证书加载信息,供测试阶段调试
+ if (LOG.isWarnEnabled()) {
+ LOG.warn("[CertId=" + encryptCertTemp.getSerialNumber().toString() + "]");
+ }
+ } catch (CertificateException e) {
+ LOG.error("InitCert Error", e);
+ } finally {
+ if (null != certIn) {
+ try {
+ certIn.close();
+ } catch (IOException e) {
+ LOG.error(e.toString());
+ }
+ }
+ }
+ return encryptCertTemp;
+ }
- /**
- * 通过证书路径初始化为公钥证书
- * @param path 证书地址
- * @return X509 证书
- */
- private static X509Certificate initCert(String path) {
- X509Certificate encryptCertTemp = null;
- CertificateFactory cf = null;
- FileInputStream in = null;
- try {
- cf = CertificateFactory.getInstance("X.509");
- in = new FileInputStream(path);
- encryptCertTemp = (X509Certificate) cf.generateCertificate(in);
- // 打印证书加载信息,供测试阶段调试
- if (LOG.isWarnEnabled()) {
- LOG.warn("[" + path + "][CertId=" + encryptCertTemp.getSerialNumber().toString() + "]");
- }
- } catch (CertificateException e) {
- LOG.error("InitCert Error", e);
- } catch (FileNotFoundException e) {
- LOG.error("InitCert Error File Not Found", e);
- }finally {
- if (null != in) {
- try {
- in.close();
- } catch (IOException e) {
- LOG.error(e.toString());
- }
- }
- }
- return encryptCertTemp;
- }
+ /**
+ * 通过证书路径初始化为公钥证书
+ *
+ * @param path 证书地址
+ * @return X509 证书
+ */
+ private static X509Certificate initCert(String path) {
+ X509Certificate encryptCertTemp = null;
+ CertificateFactory cf = null;
+ FileInputStream in = null;
+ try {
+ in = new FileInputStream(path);
+ encryptCertTemp = initCert(in);
+ } catch (FileNotFoundException e) {
+ LOG.error("InitCert Error File Not Found", e);
+ }
+ return encryptCertTemp;
+ }
- /**
- * 通过keyStore 获取私钥签名证书PrivateKey对象
- *
- * @param pwd 证书对应密码
- * @return PrivateKey 私钥
- */
- public PrivateKey getSignCertPrivateKey(String pwd) {
- try {
- Enumeration aliasenum = keyStore.aliases();
- String keyAlias = null;
- if (aliasenum.hasMoreElements()) {
- keyAlias = aliasenum.nextElement();
- }
- PrivateKey privateKey = (PrivateKey) keyStore.getKey(keyAlias,
- pwd.toCharArray());
- return privateKey;
- } catch (KeyStoreException e) {
- LOG.error("getSignCertPrivateKey Error", e);
- return null;
- } catch (UnrecoverableKeyException e) {
- LOG.error("getSignCertPrivateKey Error", e);
- return null;
- } catch (NoSuchAlgorithmException e) {
- LOG.error("getSignCertPrivateKey Error", e);
- return null;
- }
- }
-
-
-
-
- /**
- * 配置的签名私钥证书certId
- *
- * @return 证书的物理编号
- */
- public String getSignCertId() {
- try {
- Enumeration aliasenum = keyStore.aliases();
- String keyAlias = null;
- if (aliasenum.hasMoreElements()) {
- keyAlias = aliasenum.nextElement();
- }
- X509Certificate cert = (X509Certificate) keyStore
- .getCertificate(keyAlias);
- return cert.getSerialNumber().toString();
- } catch (Exception e) {
- LOG.error("getSignCertId Error", e);
- return null;
- }
- }
+ /**
+ * 通过keyStore 获取私钥签名证书PrivateKey对象
+ *
+ * @param pwd 证书对应密码
+ * @return PrivateKey 私钥
+ */
+ public PrivateKey getSignCertPrivateKey(String pwd) {
+ try {
+ Enumeration aliasenum = keyStore.aliases();
+ String keyAlias = null;
+ if (aliasenum.hasMoreElements()) {
+ keyAlias = aliasenum.nextElement();
+ }
+ PrivateKey privateKey = (PrivateKey) keyStore.getKey(keyAlias,
+ pwd.toCharArray());
+ return privateKey;
+ } catch (KeyStoreException e) {
+ LOG.error("getSignCertPrivateKey Error", e);
+ return null;
+ } catch (UnrecoverableKeyException e) {
+ LOG.error("getSignCertPrivateKey Error", e);
+ return null;
+ } catch (NoSuchAlgorithmException e) {
+ LOG.error("getSignCertPrivateKey Error", e);
+ return null;
+ }
+ }
+ /**
+ * 配置的签名私钥证书certId
+ *
+ * @return 证书的物理编号
+ */
+ public String getSignCertId() {
+ try {
+ Enumeration aliasenum = keyStore.aliases();
+ String keyAlias = null;
+ if (aliasenum.hasMoreElements()) {
+ keyAlias = aliasenum.nextElement();
+ }
+ X509Certificate cert = (X509Certificate) keyStore.getCertificate(keyAlias);
+ return cert.getSerialNumber().toString();
+ } catch (Exception e) {
+ LOG.error("getSignCertId Error", e);
+ return null;
+ }
+ }
- /**
- * 将签名私钥证书文件读取为证书存储对象
- *
- * @param signCertPath 证书文件名
- * @param signCertPwd 证书密码
- * @param signCertType 证书类型
- */
- public void initPrivateSignCert(String signCertPath, String signCertPwd, String signCertType) {
+ /**
+ * 将签名私钥证书文件读取为证书存储对象
+ *
+ * @param signCertPath 证书文件名
+ * @param signCertPwd 证书密码
+ * @param signCertType 证书类型
+ */
+ public void initPrivateSignCert(String signCertPath, String signCertPwd, String signCertType) {
+ if (null != keyStore) {
+ keyStore = null;
+ }
+ try {
+ keyStore = getKeyInfo(signCertPath, signCertPwd, signCertType);
+ if (LOG.isInfoEnabled()) {
+ LOG.info("InitSignCert Successful. CertId=[" + getSignCertId() + "]");
+ }
+ } catch (IOException e) {
+ LOG.error("InitSignCert Error", e);
+ }
+ }
- if (null != keyStore) {
- keyStore = null;
- }
- try {
- keyStore = getKeyInfo(signCertPath, signCertPwd,signCertType);
- if (LOG.isInfoEnabled()) {
- LOG.info("InitSignCert Successful. CertId=[" + getSignCertId() + "]");
- }
- } catch (IOException e) {
- LOG.error("InitSignCert Error", e);
- }
- }
+ /**
+ * 将签名私钥证书文件读取为证书存储对象
+ *
+ * @param signCert 证书文件
+ * @param signCertPwd 证书密码
+ * @param signCertType 证书类型
+ */
+ public void initPrivateSignCert(InputStream signCert, String signCertPwd, String signCertType) {
- /**
- * 将签名私钥证书文件读取为证书存储对象
- *
- * @param pfxkeyfile 证书文件名
- * @param keypwd 证书密码
- * @param type 证书类型
- * @return 证书对象
- * @throws IOException
- */
- private KeyStore getKeyInfo(String pfxkeyfile, String keypwd, String type) throws IOException {
- if (LOG.isWarnEnabled()) {
- LOG.warn("加载签名证书==>" + pfxkeyfile);
- }
- try(FileInputStream fis = new FileInputStream(pfxkeyfile);) {
- KeyStore ks = KeyStore.getInstance(type);
- if (LOG.isWarnEnabled()) {
- LOG.warn("Load RSA CertPath=[" + pfxkeyfile + "],Pwd=["+ keypwd + "],type=["+type+"]");
- }
+ if (null != keyStore) {
+ keyStore = null;
+ }
+ keyStore = getKeyInfo(signCert, signCertPwd, signCertType);
+ if (LOG.isInfoEnabled()) {
+ LOG.info("InitSignCert Successful. CertId=[" + getSignCertId() + "]");
+ }
+ }
- char[] nPassword = null;
- nPassword = null == keypwd || "".equals(keypwd.trim()) ? null: keypwd.toCharArray();
- if (null != ks) {
- ks.load(fis, nPassword);
- }
- return ks;
- } catch (Exception e) {
- LOG.error("getKeyInfo Error", e);
- return null;
- }
- }
+ /**
+ * 将签名私钥证书文件读取为证书存储对象
+ *
+ * @param fxKeyFile 证书文件名
+ * @param keyPwd 证书密码
+ * @param type 证书类型
+ * @return 证书对象
+ * @throws IOException
+ */
+ private KeyStore getKeyInfo(String fxKeyFile, String keyPwd, String type) throws IOException {
+ if (LOG.isWarnEnabled()) {
+ LOG.warn("加载签名证书==>" + fxKeyFile);
+ }
+ FileInputStream fis = new FileInputStream(fxKeyFile);
+ return getKeyInfo(fis, keyPwd, type);
-
- /**
- * 通过keystore获取私钥证书的certId值
- * @param keyStore
- * @return
- */
- private String getCertIdIdByStore(KeyStore keyStore) {
- Enumeration aliasenum = null;
- try {
- aliasenum = keyStore.aliases();
- String keyAlias = null;
- if (aliasenum.hasMoreElements()) {
- keyAlias = aliasenum.nextElement();
- }
- X509Certificate cert = (X509Certificate) keyStore
- .getCertificate(keyAlias);
- return cert.getSerialNumber().toString();
- } catch (KeyStoreException e) {
- LOG.error("getCertIdIdByStore Error", e);
- return null;
- }
- }
+ }
+
+ /**
+ * 将签名私钥证书文件读取为证书存储对象
+ *
+ * @param fxKeyFile 证书文件
+ * @param keyPwd 证书密码
+ * @param type 证书类型
+ * @return 证书对象
+ * @throws IOException
+ */
+ public KeyStore getKeyInfo(InputStream fxKeyFile, String keyPwd, String type) {
+
+ try {
+ KeyStore ks = KeyStore.getInstance(type);
+ if (LOG.isWarnEnabled()) {
+ LOG.warn("Load RSA CertPath,Pwd=[" + keyPwd + "],type=[" + type + "]");
+ }
+
+ char[] nPassword = null;
+ nPassword = null == keyPwd || "".equals(keyPwd.trim()) ? null : keyPwd.toCharArray();
+ if (null != ks) {
+ ks.load(fxKeyFile, nPassword);
+ }
+ return ks;
+ } catch (Exception e) {
+ LOG.error("getKeyInfo Error", e);
+ return null;
+ } finally {
+ if (null != fxKeyFile) {
+ try {
+ fxKeyFile.close();
+ } catch (IOException e) {
+ LOG.error("getKeyInfo Error", e);
+ }
+ }
+ }
+ }
+ /**
+ * 通过keystore获取私钥证书的certId值
+ *
+ * @param keyStore
+ * @return
+ */
+ private String getCertIdIdByStore(KeyStore keyStore) {
+ Enumeration aliasenum = null;
+ try {
+ aliasenum = keyStore.aliases();
+ String keyAlias = null;
+ if (aliasenum.hasMoreElements()) {
+ keyAlias = aliasenum.nextElement();
+ }
+ X509Certificate cert = (X509Certificate) keyStore
+ .getCertificate(keyAlias);
+ return cert.getSerialNumber().toString();
+ } catch (KeyStoreException e) {
+ LOG.error("getCertIdIdByStore Error", e);
+ return null;
+ }
+ }
- /**
- * 加载中级证书
- * @param certPath 证书地址
- */
- public void initPublicCert(String certPath) {
- if (!StringUtils.isEmpty(certPath)) {
- publicKeyCert = initCert(certPath);
- if (LOG.isInfoEnabled()) {
- LOG.info("Load PublicKeyCert Successful");
- }
- } else if (LOG.isInfoEnabled()) {
- LOG.info("PublicKeyCert is empty");
- }
- }
- /**
- * 加载根证书
- * @param certPath 证书地址
- */
- public void initRootCert(String certPath) {
- if (!StringUtils.isEmpty(certPath)) {
- rootKeyCert = initCert(certPath);
- if (LOG.isInfoEnabled()) {
- LOG.info("Load RootCert Successful");
- }
- } else if (LOG.isInfoEnabled()) {
- LOG.info("RootCert is empty");
- }
- }
+ /**
+ * 加载中级证书
+ *
+ * @param certPath 证书地址
+ */
+ public void initPublicCert(String certPath) {
+ if (!StringUtils.isEmpty(certPath)) {
+ publicKeyCert = initCert(certPath);
+ if (LOG.isInfoEnabled()) {
+ LOG.info("Load PublicKeyCert Successful");
+ }
+ } else if (LOG.isInfoEnabled()) {
+ LOG.info("PublicKeyCert is empty");
+ }
+ }
- /**
- * 获取公钥/中级证书
- * @return X509Certificate
- */
- public X509Certificate getPublicCert() {
- return publicKeyCert;
- }
+ /**
+ * 加载中级证书
+ *
+ * @param cert 证书文件
+ */
+ public void initPublicCert(InputStream cert) {
+ if (null != cert) {
+ publicKeyCert = initCert(cert);
+ if (LOG.isInfoEnabled()) {
+ LOG.info("Load PublicKeyCert Successful");
+ }
+ } else if (LOG.isInfoEnabled()) {
+ LOG.info("PublicKeyCert is empty");
+ }
+ }
+
+ /**
+ * 加载根证书
+ *
+ * @param certPath 证书地址
+ */
+ public void initRootCert(String certPath) {
+ if (!StringUtils.isEmpty(certPath)) {
+ try {
+ initRootCert(new FileInputStream(certPath));
+ } catch (FileNotFoundException e) {
+ LOG.info("RootCert is empty");
+ }
+
+ } else if (LOG.isInfoEnabled()) {
+ LOG.info("RootCert is empty");
+ }
+ }
+ /**
+ * 加载根证书
+ *
+ * @param cert 证书文件
+ */
+ public void initRootCert(InputStream cert) {
+ if (null != cert) {
+ rootKeyCert = initCert(cert);
+ if (LOG.isInfoEnabled()) {
+ LOG.info("Load RootCert Successful");
+ }
+ } else if (LOG.isInfoEnabled()) {
+ LOG.info("RootCert is empty");
+ }
+ }
+
+ /**
+ * 获取公钥/中级证书
+ *
+ * @return X509Certificate
+ */
+ public X509Certificate getPublicCert() {
+ return publicKeyCert;
+ }
+
+ /**
+ * 获取中级证书
+ *
+ * @return X509Certificate
+ */
+ public X509Certificate getRootCert() {
+ return rootKeyCert;
+ }
- /**
- * 获取中级证书
- * @return X509Certificate
- */
- public X509Certificate getRootCert() {
- return rootKeyCert;
- }
-
}
diff --git a/pay-java-demo/README.md b/pay-java-demo/README.md
index 27793b7..b066e05 100644
--- a/pay-java-demo/README.md
+++ b/pay-java-demo/README.md
@@ -22,7 +22,7 @@ public enum PayType implements BasePayType {
public PayService getPayService(ApyAccount apyAccount) {
AliPayConfigStorage aliPayConfigStorage = new AliPayConfigStorage();
aliPayConfigStorage.setPid(apyAccount.getPartner());
- aliPayConfigStorage.setAppId(apyAccount.getAppid());
+ aliPayConfigStorage.setAppid(apyAccount.getAppid());
aliPayConfigStorage.setKeyPublic(apyAccount.getPublicKey());
aliPayConfigStorage.setKeyPrivate(apyAccount.getPrivateKey());
aliPayConfigStorage.setNotifyUrl(apyAccount.getNotifyUrl());
@@ -153,9 +153,9 @@ public class PayResponse {
//代理端口
httpConfigStorage.setHttpProxyPort(3308);
//代理用户名
- httpConfigStorage.setHttpProxyUsername("user");
+ httpConfigStorage.setAuthUsername("user");
//代理密码
- httpConfigStorage.setHttpProxyPassword("password");
+ httpConfigStorage.setAuthPassword("password");
*/
//设置ssl证书路径
diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java
index 60794cb..38a58f8 100644
--- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java
+++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java
@@ -48,7 +48,7 @@ public class AliPayController {
public void init() {
AliPayConfigStorage aliPayConfigStorage = new AliPayConfigStorage();
aliPayConfigStorage.setPid("2088102169916436");
- aliPayConfigStorage.setAppId("2016080400165436");
+ aliPayConfigStorage.setAppid("2016080400165436");
aliPayConfigStorage.setKeyPublic("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIgHnOn7LLILlKETd6BFRJ0GqgS2Y3mn1wMQmyh9zEyWlz5p1zrahRahbXAfCfSqshSNfqOmAQzSHRVjCqjsAw1jyqrXaPdKBmr90DIpIxmIyKXv4GGAkPyJ/6FTFY99uhpiq0qadD/uSzQsefWo0aTvP/65zi3eof7TcZ32oWpwIDAQAB");
aliPayConfigStorage.setKeyPrivate("MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKroe/8h5vC4L6T+B2WdXiVwGsMvUKgb2XsKix6VY3m2wcf6tyzpNRDCNykbIwGtaeo7FshN+qZxdXHLiIam9goYncBit/8ojfLGy2gLxO/PXfzGxYGs0KsDZ+ryVPPmE34ZZ8jiJpR0ygzCFl8pN3QJPJRGTJn5+FTT9EF/9zyZAgMBAAECgYAktngcYC35u7cQXDk+jMVyiVhWYU2ULxdSpPspgLGzrZyG1saOcTIi/XVX8Spd6+B6nmLQeF/FbU3rOeuD8U2clzul2Z2YMbJ0FYay9oVZFfp5gTEFpFRTVfzqUaZQBIjJe/xHL9kQVqc5xHlE/LVA27/Kx3dbC35Y7B4EVBDYAQJBAOhsX8ZreWLKPhXiXHTyLmNKhOHJc+0tFH7Ktise/0rNspojU7o9prOatKpNylp9v6kux7migcMRdVUWWiVe+4ECQQC8PqsuEz7B0yqirQchRg1DbHjh64bw9Kj82EN1/NzOUd53tP9tg+SO97EzsibK1F7tOcuwqsa7n2aY48mQ+y0ZAkBndA2xcRcnvOOjtAz5VO8G7R12rse181HjGfG6AeMadbKg30aeaGCyIxN1loiSfNR5xsPJwibGIBg81mUrqzqBAkB+K6rkaPXJR9XtzvdWb/N3235yPkDlw7Z4MiOVM3RzvR/VMDV7m8lXoeDde2zQyeMOMYy6ztwA6WgE1bhGOnQRAkEAouUBv1sVdSBlsexX15qphOmAevzYrpufKgJIRLFWQxroXMS7FTesj+f+FmGrpPCxIde1dqJ8lqYLTyJmbzMPYw==");
aliPayConfigStorage.setNotifyUrl("http://pay.egzosn.com/payBack.json");
diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java
index 67792e4..12508da 100644
--- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java
+++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java
@@ -3,6 +3,7 @@ package com.egzosn.pay.demo.controller;
import com.egzosn.pay.common.api.PayService;
+import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.RefundOrder;
@@ -44,20 +45,22 @@ public class UnionPayController {
public void init() {
UnionPayConfigStorage unionPayConfigStorage = new UnionPayConfigStorage();
unionPayConfigStorage.setMerId("700000000000001");
- //设置CertSign必须在设置证书前
+ //是否为证书签名
unionPayConfigStorage.setCertSign(true);
- //公钥,验签证书链格式: 中级证书路径;根证书路径
-// unionPayConfigStorage.setKeyPublic("D:/certs/acp_test_middle.cer;D:/certs/acp_test_root.cer");
//中级证书路径
unionPayConfigStorage.setAcpMiddleCert("D:/certs/acp_test_middle.cer");
//根证书路径
unionPayConfigStorage.setAcpRootCert("D:/certs/acp_test_root.cer");
- //私钥, 私钥证书格式: 私钥证书路径;私钥证书对应的密码
-// unionPayConfigStorage.setKeyPrivate("D:/certs/acp_test_sign.pfx;000000");
// 私钥证书路径
unionPayConfigStorage.setKeyPrivateCert("D:/certs/acp_test_sign.pfx");
//私钥证书对应的密码
unionPayConfigStorage.setKeyPrivateCertPwd("000000");
+ //设置证书对应的存储方式,这里默认为文件地址
+ unionPayConfigStorage.setCertStoreType(CertStoreType.PATH);
+
+
+
+
//前台通知网址 即SDKConstants.param_frontUrl
unionPayConfigStorage.setReturnUrl("http://www.pay.egzosn.com/payBack.json");
//后台通知地址 即SDKConstants.param_backUrl
diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java
index 34c90a1..0e5b377 100644
--- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java
+++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java
@@ -79,7 +79,8 @@ public class WxPayController {
// httpConfigStorage.setKeystore(WxPayController.class.getResourceAsStream("/证书文件"));
httpConfigStorage.setKeystore(KEYSTORE);
httpConfigStorage.setStorePassword(STORE_PASSWORD);
- httpConfigStorage.setPath(true);
+ //设置ssl证书对应的存储方式,这里默认为文件地址
+ httpConfigStorage.setCertStoreType(CertStoreType.PATH);
}
diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/dao/ApyAccountRepository.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/dao/ApyAccountRepository.java
index 3bbae60..ca0c1e9 100644
--- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/dao/ApyAccountRepository.java
+++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/dao/ApyAccountRepository.java
@@ -34,9 +34,9 @@ public class ApyAccountRepository {
// TODO 2017/2/9 16:20 author: egan sign_type只有单一key时public_key与private_key相等,比如sign_type=MD5的情况
apyAccount1.setPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIgHnOn7LLILlKETd6BFRJ0GqgS2Y3mn1wMQmyh9zEyWlz5p1zrahRahbXAfCfSqshSNfqOmAQzSHRVjCqjsAw1jyqrXaPdKBmr90DIpIxmIyKXv4GGAkPyJ/6FTFY99uhpiq0qadD/uSzQsefWo0aTvP/65zi3eof7TcZ32oWpwIDAQAB");
apyAccount1.setPrivateKey("MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKroe/8h5vC4L6T+B2WdXiVwGsMvUKgb2XsKix6VY3m2wcf6tyzpNRDCNykbIwGtaeo7FshN+qZxdXHLiIam9goYncBit/8ojfLGy2gLxO/PXfzGxYGs0KsDZ+ryVPPmE34ZZ8jiJpR0ygzCFl8pN3QJPJRGTJn5+FTT9EF/9zyZAgMBAAECgYAktngcYC35u7cQXDk+jMVyiVhWYU2ULxdSpPspgLGzrZyG1saOcTIi/XVX8Spd6+B6nmLQeF/FbU3rOeuD8U2clzul2Z2YMbJ0FYay9oVZFfp5gTEFpFRTVfzqUaZQBIjJe/xHL9kQVqc5xHlE/LVA27/Kx3dbC35Y7B4EVBDYAQJBAOhsX8ZreWLKPhXiXHTyLmNKhOHJc+0tFH7Ktise/0rNspojU7o9prOatKpNylp9v6kux7migcMRdVUWWiVe+4ECQQC8PqsuEz7B0yqirQchRg1DbHjh64bw9Kj82EN1/NzOUd53tP9tg+SO97EzsibK1F7tOcuwqsa7n2aY48mQ+y0ZAkBndA2xcRcnvOOjtAz5VO8G7R12rse181HjGfG6AeMadbKg30aeaGCyIxN1loiSfNR5xsPJwibGIBg81mUrqzqBAkB+K6rkaPXJR9XtzvdWb/N3235yPkDlw7Z4MiOVM3RzvR/VMDV7m8lXoeDde2zQyeMOMYy6ztwA6WgE1bhGOnQRAkEAouUBv1sVdSBlsexX15qphOmAevzYrpufKgJIRLFWQxroXMS7FTesj+f+FmGrpPCxIde1dqJ8lqYLTyJmbzMPYw==\n");
- apyAccount1.setNotifyUrl("http://pay.egan.in/payBack1.json");
+ apyAccount1.setNotifyUrl("http://pay.egzosn.com/payBack1.json");
// 无需同步回调可不填
- apyAccount1.setReturnUrl("http://pay.egan.in/payBack1.json");
+ apyAccount1.setReturnUrl("http://pay.egzosn.com/payBack1.json");
apyAccount1.setInputCharset("UTF-8");
apyAccount1.setSeller("2088102169916436");
apyAccount1.setSignType(SignUtils.RSA.name());
diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/entity/PayType.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/entity/PayType.java
index 2f1e868..7525fb2 100644
--- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/entity/PayType.java
+++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/entity/PayType.java
@@ -5,6 +5,7 @@ import com.egzosn.pay.ali.api.AliPayService;
import com.egzosn.pay.ali.bean.AliTransactionType;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.BasePayType;
+import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.bean.MsgType;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.HttpConfigStorage;
@@ -51,7 +52,7 @@ public enum PayType implements BasePayType {
//配置的附加参数的使用
configStorage.setAttach(apyAccount.getPayId());
configStorage.setPid(apyAccount.getPartner());
- configStorage.setAppId(apyAccount.getAppid());
+ configStorage.setAppid(apyAccount.getAppid());
configStorage.setKeyPublic(apyAccount.getPublicKey());
configStorage.setKeyPrivate(apyAccount.getPrivateKey());
configStorage.setNotifyUrl(apyAccount.getNotifyUrl());
@@ -103,8 +104,8 @@ public enum PayType implements BasePayType {
// httpConfigStorage.setKeystore(PayType.class.getResourceAsStream("/证书文件"));
httpConfigStorage.setKeystore("证书信息串");
httpConfigStorage.setStorePassword("证书密码");
- //是否为证书地址
- httpConfigStorage.setPath(false);
+ //设置ssl证书对应的存储方式,这里默认为文件地址
+ httpConfigStorage.setCertStoreType(CertStoreType.PATH);
return new WxPayService(wxPayConfigStorage, httpConfigStorage);*/
return new WxPayService(wxPayConfigStorage);
}
@@ -179,8 +180,20 @@ public enum PayType implements BasePayType {
UnionPayConfigStorage unionPayConfigStorage = new UnionPayConfigStorage();
unionPayConfigStorage.setMerId(apyAccount.getPartner());
unionPayConfigStorage.setCertSign(true);
- unionPayConfigStorage.setKeyPublic(apyAccount.getPublicKey());
- unionPayConfigStorage.setKeyPrivate(apyAccount.getPrivateKey());
+// unionPayConfigStorage.setKeyPublic(apyAccount.getPublicKey());
+// unionPayConfigStorage.setKeyPrivate(apyAccount.getPrivateKey());
+
+ //中级证书路径
+ unionPayConfigStorage.setAcpMiddleCert("D:/certs/acp_test_middle.cer");
+ //根证书路径
+ unionPayConfigStorage.setAcpRootCert("D:/certs/acp_test_root.cer");
+ // 私钥证书路径
+ unionPayConfigStorage.setKeyPrivateCert("D:/certs/acp_test_sign.pfx");
+ //私钥证书对应的密码
+ unionPayConfigStorage.setKeyPrivateCertPwd("000000");
+ //设置证书对应的存储方式,这里默认为文件地址
+ unionPayConfigStorage.setCertStoreType(CertStoreType.PATH);
+
unionPayConfigStorage.setNotifyUrl(apyAccount.getNotifyUrl());
unionPayConfigStorage.setReturnUrl(apyAccount.getReturnUrl());
unionPayConfigStorage.setSignType(apyAccount.getSignType());
diff --git a/pay-java-union/README.md b/pay-java-union/README.md
index 779c9b9..177c585 100644
--- a/pay-java-union/README.md
+++ b/pay-java-union/README.md
@@ -8,22 +8,23 @@
UnionPayConfigStorage unionPayConfigStorage = new UnionPayConfigStorage();
unionPayConfigStorage.setMerId("700000000000001");
- //设置CertSign必须在设置证书前
+ //是否为证书签名
unionPayConfigStorage.setCertSign(true);
- //公钥,验签证书链格式: 中级证书路径;根证书路径
-// unionPayConfigStorage.setKeyPublic("D:/certs/acp_test_middle.cer;D:/certs/acp_test_root.cer");
+
//中级证书路径
- unionPayConfigStorage.setAcpMiddleCert("D:/certs/acp_test_middle.cer");
+ unionPayConfigStorage.setAcpMiddleCert("证书文件流,证书字符串信息或证书绝对地址");
//根证书路径
- unionPayConfigStorage.setAcpRootCert("D:/certs/acp_test_root.cer");
-
- //私钥, 私钥证书格式: 私钥证书路径;私钥证书对应的密码
-// unionPayConfigStorage.setKeyPrivate("D:/certs/acp_test_sign.pfx;000000");
+ unionPayConfigStorage.setAcpRootCert("证书文件流,证书字符串信息或证书绝对地址");
// 私钥证书路径
- unionPayConfigStorage.setKeyPrivateCert("D:/certs/acp_test_sign.pfx");
+ unionPayConfigStorage.setKeyPrivateCert("证书文件流,证书字符串信息或证书绝对地址");
//私钥证书对应的密码
- unionPayConfigStorage.setKeyPrivateCertPwd("000000");
-
+ unionPayConfigStorage.setKeyPrivateCertPwd("私钥证书对应的密码");
+ //设置证书对应的存储方式,这里默认为文件地址
+ httpConfigStorage.setCertStoreType(CertStoreType.PATH);
+
+
+
+
unionPayConfigStorage.setNotifyUrl("http://www.pay.egzosn.com/payBack.json");
// 无需同步回调可不填 app填这个就可以
unionPayConfigStorage.setReturnUrl("http://www.pay.egzosn.com/payBack.json");
@@ -48,9 +49,9 @@
//代理端口
httpConfigStorage.setHttpProxyPort(3308);
//代理用户名
- httpConfigStorage.setHttpProxyUsername("user");
+ httpConfigStorage.setAuthUsername("user");
//代理密码
- httpConfigStorage.setHttpProxyPassword("password");
+ httpConfigStorage.setAuthPassword("password");
/* /网路代理配置 根据需求进行设置**/
/* /网络请求连接池**/
diff --git a/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayConfigStorage.java b/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayConfigStorage.java
index 5ae5003..24864d3 100644
--- a/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayConfigStorage.java
+++ b/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayConfigStorage.java
@@ -1,6 +1,10 @@
package com.egzosn.pay.union.api;
import com.egzosn.pay.common.api.BasePayConfigStorage;
+import com.egzosn.pay.common.bean.CertStoreType;
+
+import java.io.IOException;
+import java.io.InputStream;
/**
@@ -32,104 +36,100 @@ public class UnionPayConfigStorage extends BasePayConfigStorage {
*/
private String accessType = "0";
- /**
- * 中级证书路径
- */
- private String acpMiddleCert;
- /**
- * 根证书路径
- */
- private String acpRootCert;
/**
- * 私钥证书是否已经初始化
- * 默认没有
+ * 应用私钥证书
*/
- private boolean keyPrivateInit = false;
+ private Object keyPrivateCert;
/**
- * 公钥证书是否已经初始化
- * 默认没有
+ * 中级证书
*/
- private boolean keyPublicInit = false;
-
+ private Object acpMiddleCert;
+ /**
+ * 根证书
+ */
+ private Object acpRootCert;
+ /**
+ * 证书存储类型
+ */
+ private CertStoreType certStoreType;
/**
* 设置私钥证书
*
- * @param certificatePath 私钥证书地址
+ * @param certificate 私钥证书地址 或者证书内容字符串
* 私钥证书密码 {@link #setKeyPrivateCertPwd(String)}
*/
- public void setKeyPrivateCert(String certificatePath) {
- super.setKeyPrivate(certificatePath);
+ public void setKeyPrivateCert(String certificate) {
+ super.setKeyPrivate(certificate);
+ this.keyPrivateCert = certificate;
+ }
+ /**
+ * 设置私钥证书
+ *
+ * @param keyPrivateCert 私钥证书信息流
+ * 私钥证书密码 {@link #setKeyPrivateCertPwd(String)}
+ */
+ public void setKeyPrivateCert(InputStream keyPrivateCert) {
+ this.keyPrivateCert = keyPrivateCert;
+ }
+
+ public InputStream getKeyPrivateCertInputStream() throws IOException {
+ return certStoreType.getInputStream(keyPrivateCert);
}
/**
* 设置中级证书
*
- * @param certificatePath 证书地址
+ * @param acpMiddleCert 证书信息或者证书路径
*/
- public void setAcpMiddleCert(String certificatePath) {
- this.acpMiddleCert = certificatePath;
+ public void setAcpMiddleCert(String acpMiddleCert) {
+ this.acpMiddleCert = acpMiddleCert;
+ }
+ /**
+ * 设置中级证书
+ *
+ * @param acpMiddleCert 证书文件
+ */
+ public void setAcpMiddleCert(InputStream acpMiddleCert) {
+ this.acpMiddleCert = acpMiddleCert;
}
/**
- * 设置根证书路径
+ * 设置根证书
*
- * @param certificatePath 证书路径
+ * @param acpRootCert 证书路径或者证书信息字符串
*/
- public void setAcpRootCert(String certificatePath) {
- this.acpRootCert = certificatePath;
+ public void setAcpRootCert(String acpRootCert) {
+ this.acpRootCert = acpRootCert;
+ }
+ /**
+ * 设置根证书
+ *
+ * @param acpRootCert 证书文件流
+ */
+ public void setAcpRootCert(InputStream acpRootCert) {
+ this.acpRootCert = acpRootCert;
}
public String getAcpMiddleCert() {
- return acpMiddleCert;
+ return (String) acpMiddleCert;
}
public String getAcpRootCert() {
- return acpRootCert;
+ return (String) acpRootCert;
+ }
+ public InputStream getAcpMiddleCertInputStream() throws IOException {
+ return certStoreType.getInputStream(acpMiddleCert);
}
- /**
- * 设置私钥证书与证书密码
- *
- * @param keyPrivate 私钥证书与证书对应的密码 格式: D:/certs/acp_test_sign.pfx;000000
- * 替代方法
- * {@link #setKeyPrivateCert(String)}
- * {@link #setKeyPrivateCertPwd(String)}
- */
- @Deprecated
- @Override
- public void setKeyPrivate(String keyPrivate) {
- super.setKeyPrivate(keyPrivate);
- if (isCertSign() && keyPrivate.length() < 1024 && keyPrivate.contains(";")) {
- String[] split = keyPrivate.split(";");
- super.setKeyPrivateCertPwd(split[1]);
- super.setKeyPrivate(split[0]);
- getCertDescriptor().initPrivateSignCert(getKeyPrivate(), getKeyPrivateCertPwd(), "PKCS12");
- keyPrivateInit = true;
- }
+ public InputStream getAcpRootCertInputStream() throws IOException {
+ return certStoreType.getInputStream(acpRootCert);
}
- /**
- * 设置中级证书与根证书 格式:D:/certs/acp_test_middle.cer;D:/certs/acp_test_root.cer
- *
- * @param keyPublic 中级证书与根证书
- * 替代方法
- * {@link #setAcpRootCert(String)}
- * {@link #setAcpMiddleCert(String)}
- */
- @Deprecated
- @Override
- public void setKeyPublic(String keyPublic) {
- super.setKeyPublic(keyPublic);
- if (isCertSign() && keyPublic.length() < 1024) {
- String[] split = keyPublic.split(";");
- getCertDescriptor().initPublicCert(split[0]);
- getCertDescriptor().initRootCert(split[1]);
- keyPublicInit = true;
- }
- }
+
+
@Override
public String getAppid() {
@@ -199,11 +199,15 @@ public class UnionPayConfigStorage extends BasePayConfigStorage {
this.accessType = accessType;
}
- public boolean isKeyPrivateInit() {
- return keyPrivateInit;
+ /**
+ * 证书存储类型
+ * @return 证书存储类型
+ */
+ public CertStoreType getCertStoreType() {
+ return certStoreType;
}
- public boolean isKeyPublicInit() {
- return keyPublicInit;
+ public void setCertStoreType(CertStoreType certStoreType) {
+ this.certStoreType = certStoreType;
}
}
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 dab9c79..f44d12f 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
@@ -21,6 +21,7 @@ import com.egzosn.pay.union.bean.UnionTransactionType;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
+import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.security.cert.*;
@@ -55,7 +56,10 @@ public class UnionPayService extends BasePayService {
private static final String FILE_TRANS_URL = "https://filedownload.%s/";
private static final String APP_TRANS_URL = "https://gateway.%s/gateway/api/appTransReq.do";
private static final String CARD_TRANS_URL = "https://gateway.%s/gateway/api/cardTransReq.do";
-
+ /**
+ * 证书解释器
+ */
+ private CertDescriptor certDescriptor = new CertDescriptor();
/**
* 构造函数
*
@@ -81,15 +85,15 @@ public class UnionPayService extends BasePayService {
if (!payConfigStorage.isCertSign()) {
return this;
}
- CertDescriptor certDescriptor = payConfigStorage.getCertDescriptor();
- if (!payConfigStorage.isKeyPrivateInit()) {
- certDescriptor.initPrivateSignCert(payConfigStorage.getKeyPrivate(), payConfigStorage.getKeyPrivateCertPwd(), "PKCS12");
- }
- if (!payConfigStorage.isKeyPublicInit()) {
- certDescriptor.initPublicCert(payConfigStorage.getAcpMiddleCert());
- certDescriptor.initRootCert(payConfigStorage.getAcpRootCert());
+ try {
+ certDescriptor.initPrivateSignCert(payConfigStorage.getKeyPrivateCertInputStream(), payConfigStorage.getKeyPrivateCertPwd(), "PKCS12");
+ certDescriptor.initPublicCert(payConfigStorage.getAcpMiddleCertInputStream());
+ certDescriptor.initRootCert(payConfigStorage.getAcpRootCertInputStream());
+ } catch (IOException e) {
+ LOG.error(e);
}
+
return this;
}
@@ -127,7 +131,7 @@ public class UnionPayService extends BasePayService {
*/
private Map getCommonParam() {
Map params = new TreeMap<>();
- UnionPayConfigStorage configStorage = (UnionPayConfigStorage) payConfigStorage;
+ UnionPayConfigStorage configStorage = payConfigStorage;
//银联接口版本
params.put(SDKConstants.param_version, configStorage.getVersion());
//编码方式
@@ -291,15 +295,15 @@ public class UnionPayService extends BasePayService {
switch (signUtils) {
case RSA:
parameters.put(SDKConstants.param_signMethod, SDKConstants.SIGNMETHOD_RSA);
- parameters.put(SDKConstants.param_certId, payConfigStorage.getCertDescriptor().getSignCertId());
+ parameters.put(SDKConstants.param_certId, certDescriptor.getSignCertId());
signStr = SignUtils.SHA1.createSign(SignUtils.parameterText(parameters, "&", "signature"), "", payConfigStorage.getInputCharset());
- parameters.put(SDKConstants.param_signature, RSA.sign(signStr, payConfigStorage.getCertDescriptor().getSignCertPrivateKey(payConfigStorage.getKeyPrivateCertPwd()), payConfigStorage.getInputCharset()));
+ parameters.put(SDKConstants.param_signature, RSA.sign(signStr, certDescriptor.getSignCertPrivateKey(payConfigStorage.getKeyPrivateCertPwd()), payConfigStorage.getInputCharset()));
break;
case RSA2:
parameters.put(SDKConstants.param_signMethod, SDKConstants.SIGNMETHOD_RSA);
- parameters.put(SDKConstants.param_certId, payConfigStorage.getCertDescriptor().getSignCertId());
+ parameters.put(SDKConstants.param_certId, certDescriptor.getSignCertId());
signStr = SignUtils.SHA256.createSign(SignUtils.parameterText(parameters, "&", "signature"), "", payConfigStorage.getInputCharset());
- parameters.put(SDKConstants.param_signature, RSA2.sign(signStr, payConfigStorage.getCertDescriptor().getSignCertPrivateKey(payConfigStorage.getKeyPrivateCertPwd()), payConfigStorage.getInputCharset()));
+ parameters.put(SDKConstants.param_signature, RSA2.sign(signStr, certDescriptor.getSignCertPrivateKey(payConfigStorage.getKeyPrivateCertPwd()), payConfigStorage.getInputCharset()));
break;
case SHA1:
case SHA256:
@@ -326,8 +330,8 @@ public class UnionPayService extends BasePayService {
private X509Certificate verifyCertificate(X509Certificate cert) {
try {
cert.checkValidity();//验证有效期
- X509Certificate middleCert = payConfigStorage.getCertDescriptor().getPublicCert();
- X509Certificate rootCert = payConfigStorage.getCertDescriptor().getRootCert();
+ X509Certificate middleCert = certDescriptor.getPublicCert();
+ X509Certificate rootCert = certDescriptor.getRootCert();
X509CertSelector selector = new X509CertSelector();
selector.setCertificate(cert);
diff --git a/pay-java-wx/README.md b/pay-java-wx/README.md
index 7ac3b85..3603cf1 100644
--- a/pay-java-wx/README.md
+++ b/pay-java-wx/README.md
@@ -29,9 +29,9 @@
//代理端口
httpConfigStorage.setHttpProxyPort(3308);
//代理用户名
- httpConfigStorage.setHttpProxyUsername("user");
+ httpConfigStorage.setAuthUsername("user");
//代理密码
- httpConfigStorage.setHttpProxyPassword("password");
+ httpConfigStorage.setAuthPassword("password");
/* /网路代理配置 根据需求进行设置**/
//退款使用
@@ -39,9 +39,12 @@
//设置ssl证书路径
//TODO 这里也支持输入流的入参。
// httpConfigStorage.setKeystore(this.getClass()..getResourceAsStream("/证书文件"));
- httpConfigStorage.setKeystorePath("证书绝对路径");
+ //设置ssl证书路径 跟着setCertStoreType 进行对应
+ httpConfigStorage.setKeystore("证书文件流,证书字符串信息或证书绝对地址");
//设置ssl证书对应的密码
httpConfigStorage.setStorePassword("证书对应的密码");
+ //设置ssl证书对应的存储方式
+ httpConfigStorage.setCertStoreType(CertStoreType.PATH);
/* /网络请求ssl证书**/
/* /网络请求连接池**/
//最大连接数