From ecb82d98e523ffa025286ffa617096dfe18c0398 Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期一, 19 八月 2024 21:00:51 +0800
Subject: [PATCH] 把微信证书文件放入resources/wxCert文件夹中,读取证书文件类是pipIrrGlobal模块的WxCertUtil类。

---
 pipIrr-platform/pipIrr-global/src/main/resources/wxCert/wxp_cert.pem                                                |   24 ++++
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateWechatCertConfig.java |   14 +
 pipIrr-platform/pipIrr-global/src/main/resources/wxCert/apiclient_key.pem                                           |   28 ++++
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PayInfo.java                   |    7 -
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/ClientCtrl.java               |    1 
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/util/PayHelper.java                  |   50 ++++++--
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/PayHelper.java                      |   80 +++++++++++--
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java           |   23 ++-
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/cert/WxCertUtil.java                                |   32 +++++
 pipIrr-platform/pipIrr-global/src/main/resources/wxCert/apiclient_cert.pem                                          |   25 ++++
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PayInfo.java               |    8 -
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java               |   22 ++-
 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/PayInfo.java                  |    7 -
 pipIrr-platform/pipIrr-global/src/main/resources/wxCert/apiclient_cert.p12                                          |    0 
 14 files changed, 252 insertions(+), 69 deletions(-)

diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/cert/WxCertUtil.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/cert/WxCertUtil.java
new file mode 100644
index 0000000..c399d3c
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/cert/WxCertUtil.java
@@ -0,0 +1,32 @@
+package com.dy.pipIrrGlobal.cert;
+
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
+import java.io.InputStream;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/8/19 19:58
+ * @Description
+ */
+public class WxCertUtil {
+
+    public static final String cert_p12 = "classpath:wxCert/apiclient_cert.p12" ;//璇佷功pkcs12鏍煎紡
+    public static final String cert_pem = "classpath:wxCert/apiclient_cert.pem" ;//璇佷功pem鏍煎紡
+    public static final String key_pem = "classpath:wxCert/apiclient_key.pem" ;//璇佷功瀵嗛挜pem鏍煎紡
+    public static final String wxp_cert_pem = "classpath:wxCert/wxp_cert.pem" ;
+
+    public static InputStream getCert_p12InputStream(ResourceLoader resourceLoader) throws Exception{
+        Resource resource = resourceLoader.getResource(cert_p12);
+        InputStream in = resource.getInputStream() ;
+        return in ;
+    }
+
+    public static byte[] getKey_pemBytes(ResourceLoader resourceLoader) throws Exception{
+        Resource resource = resourceLoader.getResource(key_pem);
+        InputStream in = resource.getInputStream() ;
+        byte[] bs = new byte[in.available()] ;
+        return bs ;
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/wxCert/apiclient_cert.p12 b/pipIrr-platform/pipIrr-global/src/main/resources/wxCert/apiclient_cert.p12
new file mode 100644
index 0000000..51169eb
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/wxCert/apiclient_cert.p12
Binary files differ
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/wxCert/apiclient_cert.pem b/pipIrr-platform/pipIrr-global/src/main/resources/wxCert/apiclient_cert.pem
new file mode 100644
index 0000000..c140e35
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/wxCert/apiclient_cert.pem
@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIEKDCCAxCgAwIBAgIUUtZapmQFxzhnA3f0ZxePTJUOFgYwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjMwNDEyMDgzNjQ1WhcNMjgwNDEwMDgzNjQ1WjCBgTETMBEGA1UEAwwK
+MTY0MDcyMTUyMDEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMS0wKwYDVQQL
+DCTlpKfnprnoioLmsLTnp5HmioDnoJTnqbbmnInpmZDlhazlj7gxCzAJBgNVBAYM
+AkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAL+whdzpweaD3UKZaPpz1mJg29sPrf7+m/DCQpKlVpryEQ15dkBtvugV
+mhzGNoYHZK7Xw55WKhdPMheGWNeeqRSZIPLdz99jTCYKtFjtXyMqB9laod/I4fT1
+zd+sOPnehaFoMKSsJ3+vNIVlgmN27/EUbbGGgupT8AcrhO9KkrRF+dd5LZMyDfcB
+ad8VHzt6nw+MP5LSAUQxWN/Up1/MvTbveAyaokH+p3dRQSB0nhWKq+Br8Vy+mWzk
+qwnqlNoQwYyq5tLGuNMipGUaIKRBTp/zXaF29GL69PYLxsgpvwA/ZtGG1ooKtQAI
+DG/6VrErkzkonxpfb23clwW3CHf0dGsCAwEAAaOBuTCBtjAJBgNVHRMEAjAAMAsG
+A1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGEaHR0cDovL2V2Y2Eu
+aXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRC
+MDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJFMTJCMjdB
+OUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IBAQCpCiju
+jkR5m9DJcu0sqzguxyIgoMLDNTTnNkTumEvXs0Pc3lQyP5P4UhqZ0DGkc6n/YuJi
++cB3aFLbl/aGqflfZTB4l+xdo3ZnAsfr6SIQllJCjPlujPtKb5JxOr4z6KwMnEXR
+yh6V6zohZZ4BhSgMmQ1JFaArmYe5BCuXY8vaweNNarpnAxVLNYI3bF+0nn3Fd2k7
+GK6niXfCsCZySwWfXGPcqsHvPB5WZUXWfgJtt8LOnpDDBYw4DN0XJd3Qmu+RZpsd
+N1bdIWeWF/4zFKbfsiJ2nSznBVuoTsvbCXlZ+2Xi0RVUeVvnVusJrK9TpL88iAa9
+Dfoi2opn4mIKVVKe
+-----END CERTIFICATE-----
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/wxCert/apiclient_key.pem b/pipIrr-platform/pipIrr-global/src/main/resources/wxCert/apiclient_key.pem
new file mode 100644
index 0000000..f56647f
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/wxCert/apiclient_key.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC/sIXc6cHmg91C
+mWj6c9ZiYNvbD63+/pvwwkKSpVaa8hENeXZAbb7oFZocxjaGB2Su18OeVioXTzIX
+hljXnqkUmSDy3c/fY0wmCrRY7V8jKgfZWqHfyOH09c3frDj53oWhaDCkrCd/rzSF
+ZYJjdu/xFG2xhoLqU/AHK4TvSpK0RfnXeS2TMg33AWnfFR87ep8PjD+S0gFEMVjf
+1KdfzL0273gMmqJB/qd3UUEgdJ4Viqvga/Fcvpls5KsJ6pTaEMGMqubSxrjTIqRl
+GiCkQU6f812hdvRi+vT2C8bIKb8AP2bRhtaKCrUACAxv+laxK5M5KJ8aX29t3JcF
+twh39HRrAgMBAAECggEATS3yx96qfnirVoxUEzsen1+mRc5LXTcAbHCaw1akxyAd
+s5IrBYfqbKF9+oXoIBDL/gXLsm245sexQH2MOcydATkiZgbfEm91kn+O25s/SfY7
+UM1IDcVhDPMHID7Edf6dST6dD0BtauCNQgR7+jZCJ4v1GpwxC84d/5ULIhmhdclg
+hoiD3PuAlhA3Phwv61fgDgpmPyDbVBEOy8GcFHbb7S4ZkLPPkZhZOUu+XG9bzz8Q
+txhkk6unOV0gyu9aBqVdbg0XUxWKZ0YZf3utgiUo6j2KEVtQAMRw0QD7W2aXfiJC
+MMCTpfljS0dLJgjekjQW1ad+ZOMkszLCrNvwEJLAgQKBgQDgtpdDMgw+pmolE6yW
+oD21SjbZ3XpCXh86LiTgd3E+VCZyNtuhj4b0ydRpZbNJUjW8pS64Gzz7KR3rnlBT
+CxaoK6VebLv5t2QhDmojmmWrktS5hbPFnDOkfXwU/KTG3yTUZeGprXvjYUWccUoV
+vIbnVyQn+UCTrlGjoGP8arSbwQKBgQDaYN/zsrJw2mV8cMyvOVH4x76ygJVqT1c3
+kjhNMtGjxYPLKSOAICqAvwnXbVGODj/4KkeKL+8pYzxXUekzV91kFBJut2R2qs+c
+F4IKgZmipkvRsDIKhTDByHUH1gleulrhtnekHC580gcNxW25FPuC6jZU9MTFn/qA
+r5/HaC0LKwKBgHrsJu6BECWtTt8dVgnHejoTcNHYz6pCZn6jA1UuwWnBCo7r51UH
+eGGrjmBhW6O+LtsU2OupKsCRi2Z6YaIrrKctyPZQMLu3UDSs9+6l5PvoBCnAM8jj
+W3SdmCS610BajIELglgZKG4HpdagOlCNopYmGwcq1+JxNwN1F3zauhWBAoGAFQTm
+CWrVyg77XbLtwJ/fx/ZR4JSHzSe92Vd1m9icXQsR2GgpRpfR/3pj1BxtkSLF/Xj0
+UdSzTGSE1lLIA20dnhhgfc+hF9rxCLEqjyBSTVl8Sr6O0nxnaP+GZC6x0DBXtwn9
+Egq0XsdIbobmPL5MRxmMCTlWBz+SuPguhN7+FukCgYBgix+SSUqn+8ZfrBQGk3vG
+E3XJ43Q6sAKNUSibv5cGaYPu58hPTIMQ2bqBk+tcMzZcnFVlv5yuTvBQFBpNEFVE
+FXVFO+oRZEiCYiNxJBYfAuXRQuPvqtBpDmD12vwPlctqu4/XBsYGMnQg5+LCKsYH
+nT+8fuGVLh21vzZelPXaNA==
+-----END PRIVATE KEY-----
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/wxCert/wxp_cert.pem b/pipIrr-platform/pipIrr-global/src/main/resources/wxCert/wxp_cert.pem
new file mode 100644
index 0000000..459f3b5
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/wxCert/wxp_cert.pem
@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIIEFDCCAvygAwIBAgIUaIg43HtGZi3HO77mPqwzd6yjzIMwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjMwNDEyMDgzNjQ1WhcNMjgwNDEwMDgzNjQ1WjBuMRgwFgYDVQQDDA9U
+ZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl
+bnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpo
+ZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCuUv41FcXIwC2nEMC4
+V791Dn4ZTRuSUA0bcGZcPpHudDoqYLbZWcoQ+rYf0l4GKueLNxGAHcr/Lufbq79M
+2MTLllJUm20XWWp1iGxJs+p2xGDEIc9udQpkGwwoMz9/+dvaEEZjhhAo/esoO2mN
+DbJQ2H0K1LwAxro+TNfmu65p37KQYP5lIbhjwXaCBQp9RCh/xLmJHN6Rj0fuHqBl
+fhV/8iZMh7/diHUth7JyrllEVvfDy74jnmX1pFzFHw+sBk9NAxKjh81qAUNypLx8
+d4xgJBbzdBp5Vm4gb4ie/XMZmwoFIeiLwt8zkTjIN3ZW+YOicSh4u3jvDMkcrRVw
+S+O5AgMBAAGjgbkwgbYwCQYDVR0TBAIwADALBgNVHQ8EBAMCA/gwgZsGA1UdHwSB
+kzCBkDCBjaCBiqCBh4aBhGh0dHA6Ly9ldmNhLml0cnVzLmNvbS5jbi9wdWJsaWMv
+aXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0QjA2QUQzOTc1NDk4NDZDMDFDM0U4
+RUJEMiZzZz1IQUNDNDcxQjY1NDIyRTEyQjI3QTlEMzNBODdBRDFDREY1OTI2RTE0
+MDM3MTANBgkqhkiG9w0BAQsFAAOCAQEAPLa6Qqk3gIZZgo7t9NfiKpjjh/Vnw+lD
+M3tdAfZKRn7uSmGfLQ3RbM62VZ7O9S4EgAwY16UN+XZVqwRsjNyv/gn886VgIgsX
+CHg1VcWX597w0x+nrwBxj4Mt9INDwpW3t4wzLWcM7kEB+fUIBKB/L8+5atGOMhZt
+cI5K+WLAMRHk1XcBGMSY4nYGI7smBAI/FIshmHqmgkkcynpstqmroF79QJA1wiFJ
+bRjdmgVqBn4lqzzb4x6tOtnNRrGq0IDqtrywkz9xkt+KCKHeUbSY4YbpvYvkSDki
+/Ej/iy6DPzmg5+pHFVENCijEchBhvElmGyfYR5jTI+/0+Yz8ftBWwg==
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateWechatCertConfig.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateWechatCertConfig.java
index 5a3c7d4..2f7c259 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateWechatCertConfig.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateWechatCertConfig.java
@@ -1,10 +1,13 @@
 package com.dy.pipIrrSell.config;
 
+import com.dy.pipIrrGlobal.cert.WxCertUtil;
 import com.dy.pipIrrSell.wechatpay.PayInfo;
 import okhttp3.OkHttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ResourceLoader;
 import org.springframework.http.client.ClientHttpRequestFactory;
 import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
 
@@ -12,8 +15,7 @@
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.TrustManagerFactory;
 import javax.net.ssl.X509TrustManager;
-import java.io.File;
-import java.io.FileInputStream;
+import java.io.InputStream;
 import java.security.KeyStore;
 
 /**
@@ -25,16 +27,18 @@
 
 @Configuration
 public class RestTemplateWechatCertConfig {
+
     String mchid = PayInfo.mchid;
+    @Autowired
+    private ResourceLoader resourceLoader;
 
     @Bean
     @ConfigurationProperties(prefix = "org.liurb.core.rest-template.config.connection")
     public ClientHttpRequestFactory wechatHttpRequestFactory() throws Exception {
 
         KeyStore keyStore = KeyStore.getInstance("PKCS12");
-        //InputStream cp = this.getClass().getResourceAsStream("apiclient_cert.p12");
-        FileInputStream instream = new FileInputStream(new File("C:\\webchat\\apiclient_cert.p12"));
-        keyStore.load(instream, mchid.toCharArray());
+        InputStream in = WxCertUtil.getCert_p12InputStream(resourceLoader);
+        keyStore.load(in, mchid.toCharArray());
 
         KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
         keyManagerFactory.init(keyStore, mchid.toCharArray());
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/PayHelper.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/PayHelper.java
index 6385700..c001dc1 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/PayHelper.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/PayHelper.java
@@ -5,6 +5,7 @@
 import com.alibaba.fastjson2.JSONObject;
 import com.dy.common.webUtil.BaseResponse;
 import com.dy.common.webUtil.BaseResponseUtils;
+import com.dy.pipIrrGlobal.cert.WxCertUtil;
 import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
 import com.dy.pipIrrGlobal.voSe.VoOrders;
 import com.dy.pipIrrSell.result.SellResultCode;
@@ -15,14 +16,13 @@
 import com.dy.pipIrrSell.wechatpay.dto.RefundResponse;
 import com.dy.pipIrrSell.wechatpay.dto.ToRefund;
 import lombok.RequiredArgsConstructor;
+import org.springframework.core.io.ResourceLoader;
 import org.springframework.stereotype.Component;
 
 import javax.crypto.NoSuchPaddingException;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
 import java.security.*;
 import java.security.cert.Certificate;
 import java.security.cert.CertificateException;
@@ -50,7 +50,6 @@
     private String resetUserSessionKeyUrl = PayInfo.resetUserSessionKeyUrl;
     private String notifyUrl = PayInfo.notifyUrl;
     private String schema = PayInfo.schema;
-    private String privateCertFileName = PayInfo.privateCertFileName;
     private String refundUrl = PayInfo.refundUrl;
 
     // 骞冲彴璇佷功鍏挜
@@ -75,9 +74,31 @@
      * @param filename 绉侀挜鏂囦欢璺緞
      * @return 绉侀挜瀵硅薄
      * @throws IOException
-     */
+
     public PrivateKey getPrivateKey(String filename) throws IOException {
         String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");
+        try {
+            String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "")
+                    .replace("-----END PRIVATE KEY-----", "")
+                    .replaceAll("\\s+", "");
+            KeyFactory kf = KeyFactory.getInstance("RSA");
+            return kf.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("褰撳墠Java鐜涓嶆敮鎸丷SA", e);
+        } catch (InvalidKeySpecException e) {
+            throw new RuntimeException("鏃犳晥鐨勫瘑閽ユ牸寮�");
+        }
+    }
+     */
+
+    /**
+     * 鑾峰彇鍟嗘埛璇佷功绉侀挜瀵硅薄
+     * @param bs 绉侀挜鏂囦欢鍐呭
+     * @return 绉侀挜瀵硅薄
+     * @throws IOException
+     */
+    public PrivateKey getPrivateKey(byte[] bs) throws IOException {
+        String content = new String(bs, "utf-8");
         try {
             String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "")
                     .replace("-----END PRIVATE KEY-----", "")
@@ -213,10 +234,25 @@
      * @throws InvalidKeyException
      * @throws SignatureException
      * @throws IOException
-     */
     public String sign(byte[] message, String certFileName) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, IOException {
         Signature sign = Signature.getInstance("SHA256withRSA");
         sign.initSign(getPrivateKey(certFileName));
+        sign.update(message);
+        return Base64.getEncoder().encodeToString(sign.sign());
+    }*/
+   /**
+     * 绛惧悕
+     * @param message 琚鍚嶄俊鎭�
+     * @param certFileBs 绉侀挜璇佷功鏂囦欢鍐呭
+     * @return signature绛惧悕鍊硷紝绛惧悕淇℃伅涓殑涓�椤癸紝鍙備笌鐢熸垚绛惧悕淇℃伅
+     * @throws NoSuchAlgorithmException
+     * @throws InvalidKeyException
+     * @throws SignatureException
+     * @throws IOException
+     */
+    public String sign(byte[] message, byte[] certFileBs) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, IOException {
+        Signature sign = Signature.getInstance("SHA256withRSA");
+        sign.initSign(getPrivateKey(certFileBs));
         sign.update(message);
         return Base64.getEncoder().encodeToString(sign.sign());
     }
@@ -229,10 +265,30 @@
      * @return 绛惧悕淇℃伅锛孒TTP澶翠腑鐨勭鍚嶄俊鎭�
      * HTTP澶达細Authorization: 璁よ瘉绫诲瀷 绛惧悕淇℃伅
      * 璁よ瘉绫诲瀷锛學ECHATPAY2-SHA256-RSA2048
-     */
     public String getToken(String method, String url, String body, String nonceStr, Long timestamp, String certFileName) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, NoSuchPaddingException {
         String message = buildMessage_order(method, url, timestamp, nonceStr, body);
         String signature = sign(message.getBytes("utf-8"), certFileName);
+
+        return "mchid=\"" + PayInfo.mchid + "\","
+                + "nonce_str=\"" + nonceStr + "\","
+                + "timestamp=\"" + timestamp + "\","
+                + "serial_no=\"" + PayInfo.serial_no + "\","
+                + "signature=\"" + signature + "\"";
+    }
+    */
+
+    /**
+     * 鑾峰彇绛惧悕淇℃伅
+     * @param method
+     * @param url
+     * @param body
+     * @return 绛惧悕淇℃伅锛孒TTP澶翠腑鐨勭鍚嶄俊鎭�
+     * HTTP澶达細Authorization: 璁よ瘉绫诲瀷 绛惧悕淇℃伅
+     * 璁よ瘉绫诲瀷锛學ECHATPAY2-SHA256-RSA2048
+     */
+    public String getToken(String method, String url, String body, String nonceStr, Long timestamp, byte[] certFileBs) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, NoSuchPaddingException {
+        String message = buildMessage_order(method, url, timestamp, nonceStr, body);
+        String signature = sign(message.getBytes("utf-8"), certFileBs);
 
         return "mchid=\"" + PayInfo.mchid + "\","
                 + "nonce_str=\"" + nonceStr + "\","
@@ -258,13 +314,13 @@
     /**
      * 閲嶆柊涓嬭浇璇佷功
      */
-    public void refreshCertificate() throws GeneralSecurityException, IOException {
+    public void refreshCertificate(byte[] keyPemBs) throws GeneralSecurityException, IOException, Exception {
         String method = "GET";
         String httpUrl = "/v3/certificates";
         String nonceStr = generateRandomString();
         Long timestamp = System.currentTimeMillis() / 1000;
 
-        String header = PayInfo.schema + " " + getToken(method, httpUrl, "", nonceStr, timestamp, PayInfo.privateCertFileName);
+        String header = PayInfo.schema + " " + getToken(method, httpUrl, "", nonceStr, timestamp, keyPemBs);
 
         Map<String, String> headers = new HashMap<>();
         headers.put("Authorization", header);
@@ -329,10 +385,10 @@
      * @throws InvalidKeyException
      * @throws SignatureException
      */
-    public Boolean responseSignVerify(String wechatpaySerial, String signatureStr, String wechatpaySignature) throws GeneralSecurityException, IOException {
+    public Boolean responseSignVerify(String wechatpaySerial, String signatureStr, String wechatpaySignature, byte[] keyPemBs) throws GeneralSecurityException, IOException, Exception {
         if(CERTIFICATE_MAP.isEmpty() || !CERTIFICATE_MAP.containsKey(wechatpaySerial)) {
             CERTIFICATE_MAP.clear();
-            refreshCertificate();
+            refreshCertificate(keyPemBs);
         }
         Certificate certificate = (Certificate)CERTIFICATE_MAP.get(wechatpaySerial);
         if(certificate == null) {
@@ -456,7 +512,7 @@
      * @throws SignatureException
      * @throws InvalidKeyException
      */
-    public BaseResponse<Boolean> refunds(Refund po) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException {
+    public BaseResponse<Boolean> refunds(Refund po, ResourceLoader resourceLoader) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, Exception {
         String tradeNo = po.getTradeNo();
         String refundNo = po.getRefundNo();
         Integer refund = po.getRefund();
@@ -482,7 +538,7 @@
         String httpUrl = "/v3/refund/domestic/refunds";
 
         String body = JSONObject.toJSONString(refundRequest);
-        String header = schema + " " + getToken(method, httpUrl, body, nonceStr, timestamp, privateCertFileName);
+        String header = schema + " " + getToken(method, httpUrl, body, nonceStr, timestamp, WxCertUtil.getKey_pemBytes(resourceLoader));
 
         Map<String, String> headers = new HashMap<>();
         headers.put("Authorization", header);
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PayInfo.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PayInfo.java
index 539ca81..f43fdf4 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PayInfo.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PayInfo.java
@@ -142,13 +142,6 @@
      */
     public static String schema = "WECHATPAY2-SHA256-RSA2048";
 
-    /**
-     * 绉侀挜鏂囦欢璺緞
-     */
-    public static String privateCertFileName = "C:\\webchat\\apiclient_key.pem";
-
-    public static String publicCertFileName = "C:\\webchat\\wxp_cert.pem";
-
     /*
      * 寰俊璁㈠崟鍙凤紝浼樺厛浣跨敤
      */
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java
index 4314bed..ce1fb29 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java
@@ -6,6 +6,7 @@
 import com.dy.common.webUtil.BaseResponse;
 import com.dy.common.webUtil.BaseResponseUtils;
 import com.dy.common.webUtil.ResultCodeMsg;
+import com.dy.pipIrrGlobal.cert.WxCertUtil;
 import com.dy.pipIrrGlobal.pojoSe.*;
 import com.dy.pipIrrGlobal.voSe.VoClient;
 import com.dy.pipIrrSell.client.ClientSv;
@@ -33,6 +34,7 @@
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.ResourceLoader;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.transaction.annotation.Transactional;
@@ -66,13 +68,15 @@
 @RequestMapping(path="payment")
 @RequiredArgsConstructor
 public class PaymentCtrl {
+    private final ResourceLoader resourceLoader;
+
     private final PaymentSv paymentSv;
     private final RestTemplateUtil restTemplateUtil;
     private final PayHelper payHelper;
     private final VirtualCardSv virtualCardSv;
     private final ClientSv clientSv;
 
-    private final String privateCertFileName = PayInfo.privateCertFileName;
+    //private final String privateCertFileName = PayInfo.privateCertFileName;
     private final String appid = PayInfo.appid;
     private final String secret = PayInfo.secret;
     private final String mchid = PayInfo.mchid;
@@ -171,7 +175,8 @@
         String nonceStr = payHelper.generateRandomString();
         Long timestamp = System.currentTimeMillis() / 1000;
 
-        String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, privateCertFileName);
+        byte[] keyPemBs = WxCertUtil.getKey_pemBytes(resourceLoader) ;
+        String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, keyPemBs);
 
         Map<String, String> headers = new HashMap<>();
         headers.put("Authorization", header);
@@ -189,7 +194,7 @@
         // 鏋勯�犻獙绛惧悕涓�
         String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, job_body.toJSONString());
         // 楠岃瘉绛惧悕
-        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature);
+        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature, keyPemBs);
 
         return BaseResponseUtils.buildSuccess();
     }
@@ -212,7 +217,7 @@
     @PostMapping(path = "placeOrder")
     @Transactional(rollbackFor = Exception.class)
     @SsoAop()
-    public BaseResponse<Boolean> placeOrder(@RequestBody @Valid DtoOrder order, BindingResult bindingResult) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException {
+    public BaseResponse<Boolean> placeOrder(@RequestBody @Valid DtoOrder order, BindingResult bindingResult) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, Exception {
         if(bindingResult != null && bindingResult.hasErrors()){
             return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
@@ -273,7 +278,7 @@
         String httpUrl = "/v3/pay/transactions/jsapi";
 
         String body = job_body.toJSONString();
-        String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, privateCertFileName);
+        String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, WxCertUtil.getKey_pemBytes(resourceLoader));
 
         Map<String, String> headers = new HashMap<>();
         headers.put("Authorization", header);
@@ -315,7 +320,7 @@
         String nonceStr = payHelper.generateRandomString();
         String pkg = "prepay_id=" + prepayId;
         String message = payHelper.buildMessage_signAgain(appid, timeStamp, nonceStr, pkg);
-        String paySign = payHelper.sign(message.getBytes("utf-8"), privateCertFileName);
+        String paySign = payHelper.sign(message.getBytes("utf-8"), WxCertUtil.getKey_pemBytes(resourceLoader));
 
         JSONObject job_result = new JSONObject();
         job_result.put("timeStamp", timeStamp);
@@ -348,7 +353,7 @@
     @PostMapping(path = "orderNotify", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
     @SsoAop()
-    public JSONObject orderNotify(@RequestHeader HttpHeaders headers, HttpServletRequest request, HttpServletResponse response) throws IOException, GeneralSecurityException {
+    public JSONObject orderNotify(@RequestHeader HttpHeaders headers, HttpServletRequest request, HttpServletResponse response) throws IOException, GeneralSecurityException, Exception {
         JSONObject result = new JSONObject();
 
         /**
@@ -386,8 +391,9 @@
 
         // 鏋勯�犻獙绛惧悕涓�
         String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, bodyStr);
+        byte[] keyPemBs = WxCertUtil.getKey_pemBytes(resourceLoader) ;
         // 楠岃瘉绛惧悕
-        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature);
+        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature, keyPemBs);
         if(!valid) {
             response.setStatus(500);
             result.put("code", "FAIL");
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/ClientCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/ClientCtrl.java
index 1161ebb..2de7911 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/ClientCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/ClientCtrl.java
@@ -42,7 +42,6 @@
     private final ClientSv clientSv;
     private final AliyunSmsSv aliyunSmsSv;
     private final RestTemplateUtil restTemplateUtil;
-    private final String privateCertFileName = PayInfo.privateCertFileName;
     private final String appid = PayInfo.appid;
     private final String secret = PayInfo.secret;
     private final String mchid = PayInfo.mchid;
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/PayInfo.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/PayInfo.java
index fe36705..ecb3ac5 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/PayInfo.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/PayInfo.java
@@ -142,13 +142,6 @@
      */
     public static String schema = "WECHATPAY2-SHA256-RSA2048";
 
-    /**
-     * 绉侀挜鏂囦欢璺緞
-     */
-    public static String privateCertFileName = "C:\\webchat\\apiclient_key.pem";
-
-    public static String publicCertFileName = "C:\\webchat\\wxp_cert.pem";
-
     /*
      * 寰俊璁㈠崟鍙凤紝浼樺厛浣跨敤
      */
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/util/PayHelper.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/util/PayHelper.java
index 3aa2522..ea8ed6a 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/util/PayHelper.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/util/PayHelper.java
@@ -51,7 +51,6 @@
     private String resetUserSessionKeyUrl = PayInfo.resetUserSessionKeyUrl;
     private String notifyUrl = PayInfo.notifyUrl;
     private String schema = PayInfo.schema;
-    private String privateCertFileName = PayInfo.privateCertFileName;
     private String refundUrl = PayInfo.refundUrl;
 
     // 骞冲彴璇佷功鍏挜
@@ -73,12 +72,25 @@
 
     /**
      * 鑾峰彇鍟嗘埛璇佷功绉侀挜瀵硅薄
-     * @param filename 绉侀挜鏂囦欢璺緞
+     * @param certFileBs 绉侀挜鏂囦欢鍐呭
      * @return 绉侀挜瀵硅薄
      * @throws IOException
-     */
     public PrivateKey getPrivateKey(String filename) throws IOException {
         String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");
+        try {
+            String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "")
+                    .replace("-----END PRIVATE KEY-----", "")
+                    .replaceAll("\\s+", "");
+            KeyFactory kf = KeyFactory.getInstance("RSA");
+            return kf.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("褰撳墠Java鐜涓嶆敮鎸丷SA", e);
+        } catch (InvalidKeySpecException e) {
+            throw new RuntimeException("鏃犳晥鐨勫瘑閽ユ牸寮�");
+        }
+    }*/
+    public PrivateKey getPrivateKey(byte[] certFileBs) throws IOException {
+        String content = new String(certFileBs, "utf-8");
         try {
             String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "")
                     .replace("-----END PRIVATE KEY-----", "")
@@ -208,16 +220,21 @@
     /**
      * 绛惧悕
      * @param message 琚鍚嶄俊鎭�
-     * @param certFileName 绉侀挜璇佷功鏂囦欢璺緞
+     * @param certBs 绉侀挜璇佷功鏂囦欢鍐呭
      * @return signature绛惧悕鍊硷紝绛惧悕淇℃伅涓殑涓�椤癸紝鍙備笌鐢熸垚绛惧悕淇℃伅
      * @throws NoSuchAlgorithmException
      * @throws InvalidKeyException
      * @throws SignatureException
      * @throws IOException
-     */
     public String sign(byte[] message, String certFileName) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, IOException {
         Signature sign = Signature.getInstance("SHA256withRSA");
         sign.initSign(getPrivateKey(certFileName));
+        sign.update(message);
+        return Base64.getEncoder().encodeToString(sign.sign());
+    }*/
+    public String sign(byte[] message, byte[] certBs) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, IOException, Exception {
+        Signature sign = Signature.getInstance("SHA256withRSA");
+        sign.initSign(getPrivateKey(certBs));
         sign.update(message);
         return Base64.getEncoder().encodeToString(sign.sign());
     }
@@ -230,10 +247,19 @@
      * @return 绛惧悕淇℃伅锛孒TTP澶翠腑鐨勭鍚嶄俊鎭�
      * HTTP澶达細Authorization: 璁よ瘉绫诲瀷 绛惧悕淇℃伅
      * 璁よ瘉绫诲瀷锛學ECHATPAY2-SHA256-RSA2048
-     */
     public String getToken(String method, String url, String body, String nonceStr, Long timestamp, String certFileName) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, NoSuchPaddingException {
         String message = buildMessage_order(method, url, timestamp, nonceStr, body);
         String signature = sign(message.getBytes("utf-8"), certFileName);
+
+        return "mchid=\"" + PayInfo.mchid + "\","
+                + "nonce_str=\"" + nonceStr + "\","
+                + "timestamp=\"" + timestamp + "\","
+                + "serial_no=\"" + PayInfo.serial_no + "\","
+                + "signature=\"" + signature + "\"";
+    }*/
+    public String getToken(String method, String url, String body, String nonceStr, Long timestamp, byte[] certFileBs) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, Exception {
+        String message = buildMessage_order(method, url, timestamp, nonceStr, body);
+        String signature = sign(message.getBytes("utf-8"), certFileBs);
 
         return "mchid=\"" + PayInfo.mchid + "\","
                 + "nonce_str=\"" + nonceStr + "\","
@@ -259,13 +285,13 @@
     /**
      * 閲嶆柊涓嬭浇璇佷功
      */
-    public void refreshCertificate() throws GeneralSecurityException, IOException {
+    public void refreshCertificate(byte[] certFileBs) throws GeneralSecurityException, IOException , Exception {
         String method = "GET";
         String httpUrl = "/v3/certificates";
         String nonceStr = generateRandomString();
         Long timestamp = System.currentTimeMillis() / 1000;
 
-        String header = PayInfo.schema + " " + getToken(method, httpUrl, "", nonceStr, timestamp, PayInfo.privateCertFileName);
+        String header = PayInfo.schema + " " + getToken(method, httpUrl, "", nonceStr, timestamp, certFileBs);
 
         Map<String, String> headers = new HashMap<>();
         headers.put("Authorization", header);
@@ -330,10 +356,10 @@
      * @throws InvalidKeyException
      * @throws SignatureException
      */
-    public Boolean responseSignVerify(String wechatpaySerial, String signatureStr, String wechatpaySignature) throws GeneralSecurityException, IOException {
+    public Boolean responseSignVerify(String wechatpaySerial, String signatureStr, String wechatpaySignature, byte[] certFileBs) throws Exception {
         if(CERTIFICATE_MAP.isEmpty() || !CERTIFICATE_MAP.containsKey(wechatpaySerial)) {
             CERTIFICATE_MAP.clear();
-            refreshCertificate();
+            refreshCertificate(certFileBs);
         }
         Certificate certificate = (Certificate)CERTIFICATE_MAP.get(wechatpaySerial);
         if(certificate == null) {
@@ -457,7 +483,7 @@
      * @throws SignatureException
      * @throws InvalidKeyException
      */
-    public BaseResponse<Boolean> refunds(Refund po) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException {
+    public BaseResponse<Boolean> refunds(Refund po, byte[] certFileBs) throws SignatureException, InvalidKeyException, Exception{
         String tradeNo = po.getTradeNo();
         String refundNo = po.getRefundNo();
         Integer refund = po.getRefund();
@@ -483,7 +509,7 @@
         String httpUrl = "/v3/refund/domestic/refunds";
 
         String body = JSONObject.toJSONString(refundRequest);
-        String header = schema + " " + getToken(method, httpUrl, body, nonceStr, timestamp, privateCertFileName);
+        String header = schema + " " + getToken(method, httpUrl, body, nonceStr, timestamp, certFileBs);
 
         Map<String, String> headers = new HashMap<>();
         headers.put("Authorization", header);
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PayInfo.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PayInfo.java
index 017b530..9a87cee 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PayInfo.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PayInfo.java
@@ -141,14 +141,6 @@
      * HTTP澶磋璇佺被鍨�
      */
     public static String schema = "WECHATPAY2-SHA256-RSA2048";
-
-    /**
-     * 绉侀挜鏂囦欢璺緞
-     */
-    public static String privateCertFileName = "C:\\webchat\\apiclient_key.pem";
-
-    public static String publicCertFileName = "C:\\webchat\\wxp_cert.pem";
-
     /*
      * 寰俊璁㈠崟鍙凤紝浼樺厛浣跨敤
      */
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java
index 356ac1f..622d58d 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java
@@ -6,6 +6,7 @@
 import com.dy.common.webUtil.BaseResponse;
 import com.dy.common.webUtil.BaseResponseUtils;
 import com.dy.common.webUtil.ResultCodeMsg;
+import com.dy.pipIrrGlobal.cert.WxCertUtil;
 import com.dy.pipIrrGlobal.pojoSe.*;
 import com.dy.pipIrrGlobal.voSe.VoClient;
 import com.dy.pipIrrWechat.result.WechatResultCode;
@@ -32,13 +33,13 @@
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.ResourceLoader;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
-import javax.crypto.NoSuchPaddingException;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.security.GeneralSecurityException;
@@ -65,11 +66,11 @@
 @RequestMapping(path="payment")
 @RequiredArgsConstructor
 public class PaymentCtrl {
+    private final ResourceLoader resourceLoader;
     private final PaymentSv paymentSv;
     private final RestTemplateUtil restTemplateUtil;
     private final PayHelper payHelper;
     private final VirtualCardSv virtualCardSv;
-    private final String privateCertFileName = com.dy.pipIrrWechat.wechatpay.PayInfo.privateCertFileName;
     private final String appid = com.dy.pipIrrWechat.wechatpay.PayInfo.appid;
     private final String secret = com.dy.pipIrrWechat.wechatpay.PayInfo.secret;
     private final String mchid = com.dy.pipIrrWechat.wechatpay.PayInfo.mchid;
@@ -166,7 +167,8 @@
         String nonceStr = payHelper.generateRandomString();
         Long timestamp = System.currentTimeMillis() / 1000;
 
-        String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, privateCertFileName);
+        byte[] certFileBs = WxCertUtil.getKey_pemBytes(resourceLoader) ;
+        String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, certFileBs);
 
         Map<String, String> headers = new HashMap<>();
         headers.put("Authorization", header);
@@ -184,7 +186,7 @@
         // 鏋勯�犻獙绛惧悕涓�
         String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, job_body.toJSONString());
         // 楠岃瘉绛惧悕
-        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature);
+        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature, certFileBs);
 
         return BaseResponseUtils.buildSuccess();
     }
@@ -197,7 +199,7 @@
      */
     @PostMapping(path = "placeOrder")
     @Transactional(rollbackFor = Exception.class)
-    public BaseResponse<Boolean> placeOrder(@RequestBody @Valid DtoOrder order, BindingResult bindingResult) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException {
+    public BaseResponse<Boolean> placeOrder(@RequestBody @Valid DtoOrder order, BindingResult bindingResult) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, Exception {
         if(bindingResult != null && bindingResult.hasErrors()){
             return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
@@ -287,7 +289,8 @@
         String httpUrl = "/v3/pay/transactions/jsapi";
 
         String body = job_body.toJSONString();
-        String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, privateCertFileName);
+        byte[] certFileBs = WxCertUtil.getKey_pemBytes(resourceLoader) ;
+        String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, certFileBs);
 
         Map<String, String> headers = new HashMap<>();
         headers.put("Authorization", header);
@@ -328,7 +331,8 @@
         String nonceStr = payHelper.generateRandomString();
         String pkg = "prepay_id=" + prepayId;
         String message = payHelper.buildMessage_signAgain(appid, timeStamp, nonceStr, pkg);
-        String paySign = payHelper.sign(message.getBytes("utf-8"), privateCertFileName);
+        byte[] certFileBs = WxCertUtil.getKey_pemBytes(resourceLoader) ;
+        String paySign = payHelper.sign(message.getBytes("utf-8"), certFileBs);
 
         JSONObject job_result = new JSONObject();
         job_result.put("timeStamp", timeStamp);
@@ -360,7 +364,7 @@
     })
     @PostMapping(path = "orderNotify", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
-    public JSONObject orderNotify(@RequestHeader HttpHeaders headers, HttpServletRequest request, HttpServletResponse response) throws IOException, GeneralSecurityException {
+    public JSONObject orderNotify(@RequestHeader HttpHeaders headers, HttpServletRequest request, HttpServletResponse response) throws IOException, GeneralSecurityException, Exception {
         JSONObject result = new JSONObject();
 
         /**
@@ -398,8 +402,9 @@
 
         // 鏋勯�犻獙绛惧悕涓�
         String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, bodyStr);
+        byte[] certFileBs = WxCertUtil.getKey_pemBytes(resourceLoader) ;
         // 楠岃瘉绛惧悕
-        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature);
+        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature, certFileBs);
         if(!valid) {
             response.setStatus(500);
             result.put("code", "FAIL");

--
Gitblit v1.8.0