🆕 #2586 【微信支付】支付证书支持base64编码配置

This commit is contained in:
猫九大大 2022-04-25 10:13:00 +08:00 committed by GitHub
parent 220e38d6c4
commit 1fc0da066b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 4 deletions

View File

@ -26,6 +26,7 @@ import java.nio.charset.StandardCharsets;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.Base64;
import java.util.Collections; import java.util.Collections;
/** /**
@ -101,15 +102,28 @@ public class WxPayConfig {
*/ */
private String signType; private String signType;
private SSLContext sslContext; private SSLContext sslContext;
/**
* p12证书base64编码
*/
private String keyString;
/** /**
* p12证书文件的绝对路径或者以classpath:开头的类路径. * p12证书文件的绝对路径或者以classpath:开头的类路径.
*/ */
private String keyPath; private String keyPath;
/**
* apiclient_key.pem证书base64编码
*/
private String privateKeyString;
/** /**
* apiclient_key.pem证书文件的绝对路径或者以classpath:开头的类路径. * apiclient_key.pem证书文件的绝对路径或者以classpath:开头的类路径.
*/ */
private String privateKeyPath; private String privateKeyPath;
/**
* apiclient_cert.pem证书base64编码
*/
private String privateCertString;
/** /**
* apiclient_cert.pem证书文件的绝对路径或者以classpath:开头的类路径. * apiclient_cert.pem证书文件的绝对路径或者以classpath:开头的类路径.
*/ */
@ -222,7 +236,7 @@ public class WxPayConfig {
throw new WxPayException("请确保商户号mchId已设置"); throw new WxPayException("请确保商户号mchId已设置");
} }
InputStream inputStream = this.loadConfigInputStream(this.getKeyPath(), this.keyContent, "p12证书"); InputStream inputStream = this.loadConfigInputStream(this.keyString, this.getKeyPath(), this.keyContent, "p12证书");
try { try {
KeyStore keystore = KeyStore.getInstance("PKCS12"); KeyStore keystore = KeyStore.getInstance("PKCS12");
@ -245,7 +259,9 @@ public class WxPayConfig {
* @author doger.wang * @author doger.wang
**/ **/
public CloseableHttpClient initApiV3HttpClient() throws WxPayException { public CloseableHttpClient initApiV3HttpClient() throws WxPayException {
val privateKeyString = this.getPrivateKeyString();
val privateKeyPath = this.getPrivateKeyPath(); val privateKeyPath = this.getPrivateKeyPath();
val privateCertString = this.getPrivateCertString();
val privateCertPath = this.getPrivateCertPath(); val privateCertPath = this.getPrivateCertPath();
val serialNo = this.getCertSerialNo(); val serialNo = this.getCertSerialNo();
val apiV3Key = this.getApiV3Key(); val apiV3Key = this.getApiV3Key();
@ -253,8 +269,8 @@ public class WxPayConfig {
throw new WxPayException("请确保apiV3Key值已设置"); throw new WxPayException("请确保apiV3Key值已设置");
} }
InputStream keyInputStream = this.loadConfigInputStream(privateKeyPath, this.privateKeyContent, "privateKeyPath"); InputStream keyInputStream = this.loadConfigInputStream(privateKeyString, privateKeyPath, this.privateKeyContent, "privateKeyPath");
InputStream certInputStream = this.loadConfigInputStream(privateCertPath, this.privateCertContent, "privateCertPath"); InputStream certInputStream = this.loadConfigInputStream(privateCertString, privateCertPath, this.privateCertContent, "privateCertPath");
try { try {
PrivateKey merchantPrivateKey = PemUtils.loadPrivateKey(keyInputStream); PrivateKey merchantPrivateKey = PemUtils.loadPrivateKey(keyInputStream);
X509Certificate certificate = PemUtils.loadCertificate(certInputStream); X509Certificate certificate = PemUtils.loadCertificate(certInputStream);
@ -298,10 +314,13 @@ public class WxPayConfig {
return null; return null;
} }
private InputStream loadConfigInputStream(String configPath, byte[] configContent, String fileName) throws WxPayException { private InputStream loadConfigInputStream(String configString, String configPath, byte[] configContent, String fileName) throws WxPayException {
InputStream inputStream; InputStream inputStream;
if (configContent != null) { if (configContent != null) {
inputStream = new ByteArrayInputStream(configContent); inputStream = new ByteArrayInputStream(configContent);
} else if(StringUtils.isNotEmpty(configString)) {
configContent = Base64.getDecoder().decode(configString);
inputStream = new ByteArrayInputStream(configContent);
} else { } else {
if (StringUtils.isBlank(configPath)) { if (StringUtils.isBlank(configPath)) {
throw new WxPayException("请确保证书文件地址【" + fileName + "】或者内容已配置"); throw new WxPayException("请确保证书文件地址【" + fileName + "】或者内容已配置");

View File

@ -37,4 +37,11 @@ public class WxPayConfigTest {
public void testHashCode() { public void testHashCode() {
payConfig.hashCode(); payConfig.hashCode();
} }
@Test
public void testInitSSLContext_base64() throws Exception {
payConfig.setMchId("123");
payConfig.setKeyString("MIIKmgIBAzCCCmQGCS...");
payConfig.initSSLContext();
}
} }