From 638d2a31d32c8dc580dba0a49c97bbca866ba783 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Wed, 17 Jan 2024 13:13:23 +0800
Subject: [PATCH] fapiao

---
 src/main/java/cc/mrbird/febs/pay/service/impl/WxFaPiaoServiceImpl.java |  103 ++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 88 insertions(+), 15 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/WxFaPiaoServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/WxFaPiaoServiceImpl.java
index 0182525..fecfbbf 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/impl/WxFaPiaoServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/impl/WxFaPiaoServiceImpl.java
@@ -11,19 +11,24 @@
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.aliyun.oss.internal.SignUtils;
 import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier;
 import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
 import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
+import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
 import com.wechat.pay.contrib.apache.httpclient.notification.Notification;
 import com.wechat.pay.contrib.apache.httpclient.notification.NotificationHandler;
 import com.wechat.pay.contrib.apache.httpclient.notification.NotificationRequest;
 import com.wechat.pay.contrib.apache.httpclient.util.AesUtil;
+import io.undertow.util.Certificates;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.HttpUrl;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPatch;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.entity.StringEntity;
@@ -41,6 +46,7 @@
 import java.security.cert.X509Certificate;
 import java.security.spec.InvalidKeySpecException;
 import java.security.spec.PKCS8EncodedKeySpec;
+import java.text.SimpleDateFormat;
 import java.util.Base64;
 import java.util.HashMap;
 import java.util.Map;
@@ -201,7 +207,6 @@
 
     @Override
     public Map<String, Object> fapiaoCallBack(HttpServletResponse response, HttpServletRequest request) {
-        log.info("微信电子发票回调接口....");
         Map<String,Object> map = new HashMap<>();
         try {
             BufferedReader br = request.getReader();
@@ -211,17 +216,24 @@
                 sb.append(str);
             }
             // 构建request,传入必要参数
-            NotificationRequest requests = new NotificationRequest.Builder()
-                    .withSerialNumber(request.getHeader("Wechatpay-Serial"))
-                    .withNonce(request.getHeader("Wechatpay-Nonce"))
-                    .withTimestamp(request.getHeader("Wechatpay-Timestamp"))
-                    .withSignature(request.getHeader("Wechatpay-Signature"))
-                    .withBody(String.valueOf(sb))
-                    .build();
+//            NotificationRequest requests = new NotificationRequest.Builder()
+//                    .withSerialNumber(request.getHeader("Wechatpay-Serial"))
+//                    .withNonce(request.getHeader("Wechatpay-Nonce"))
+//                    .withTimestamp(request.getHeader("Wechatpay-Timestamp"))
+//                    .withSignature(request.getHeader("Wechatpay-Signature"))
+//                    .withBody(String.valueOf(sb))
+//                    .build();
+            log.info("微信电子发票回调接口...."+request.getHeader("Wechatpay-Serial"));
+            log.info("微信电子发票回调接口...."+request.getHeader("Wechatpay-Nonce"));
+            log.info("微信电子发票回调接口...."+request.getHeader("Wechatpay-Timestamp"));
+            log.info("微信电子发票回调接口...."+request.getHeader("Wechatpay-Signature"));
+
+            log.info("微信电子发票回调接口....body"+request.getHeader(String.valueOf(sb)));
             //验签
-            NotificationHandler handler = new NotificationHandler(getVerifier(AppContants.WX_CARD_NUM), xcxProperties.getWecharpaySecretV3().getBytes(StandardCharsets.UTF_8));
+//            NotificationHandler handler = new NotificationHandler(getVerifier(AppContants.WX_CARD_NUM), xcxProperties.getWecharpaySecretV3().getBytes(StandardCharsets.UTF_8));
             //解析请求体
-            Notification notification = handler.parse(requests);
+//            Notification notification = handler.parse(requests);
+            Notification notification = com.alibaba.fastjson.JSONObject.parseObject(String.valueOf(sb),Notification.class);
             log.info("微信电子发票回调接口....解析请求体:"+notification.toString());
             String decryptData = notification.getDecryptData();//可能是支付业务的回调数据
             log.info("微信电子发票回调接口....decryptData:"+notification.toString());
@@ -326,6 +338,15 @@
                 verifier = new AutoUpdateCertificatesVerifier(credentials
                         , xcxProperties.getWecharpaySecretV3().getBytes("utf-8"));
                 verifierMap.put(verifier.getValidCertificate().getSerialNumber()+"", verifier);
+
+//                AutoUpdateCertificatesVerifier verifierNew = new AutoUpdateCertificatesVerifier(
+//                        new WechatPay2Credentials(
+//                                xcxProperties.getWecharpayMchid(),
+//                                new PrivateKeySigner(
+//                                        mchSerialNo,
+//                                        privateKey)),
+//                        xcxProperties.getWecharpaySecretV3().getBytes("utf-8"));
+//                new WechatPay2Validator(verifierNew).;
             } catch (UnsupportedEncodingException e) {
                 e.printStackTrace();
             } catch (IOException e) {
@@ -336,6 +357,56 @@
         }
         return verifier;
     }
+
+    /**
+     * 获取平台证书
+     */
+//    public static X509Certificate getCertificates() throws IOException, NoSuchAlgorithmException, SignatureException, InvalidKeyException {
+//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+//        CloseableHttpClient httpClient = HttpClients.createDefault();
+//        //请求URL
+//        HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/certificates");
+//        httpGet.setHeader("Accept", "application/json");
+//        //生成签名
+//        httpGet.setHeader("Authorization ", SignUtils.getSign("GET", HttpUrl.parse("https://api.mch.weixin.qq.com/v3/certificates"), ""));
+//        httpGet.setHeader("User-Agent", "https://zh.wikipedia.org/wiki/User_agent");
+//        //完成签名并执行请求
+//        CloseableHttpResponse response = httpClient.execute(httpGet);
+//        X509Certificate x509Certificate = null;
+//        try {
+//            int statusCode = response.getStatusLine().getStatusCode();
+//            if (statusCode == 200) { //处理成功
+////                System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
+//                CertificateVo certificateVo = JSONObject.parseObject(EntityUtils.toString(response.getEntity()), CertificateVo.class);
+//                for (Certificates certificates : certificateVo.getData()) {
+//                    if (format.parse(certificates.getEffective_time()).before(new Date()) && format.parse(certificates.getExpire_time()).after(new Date())) {
+//                        EncryptCertificate encrypt_certificate = certificates.getEncrypt_certificate();
+//                        //解密
+//                        AesUtil aesUtil = new AesUtil(CommonParameters.apiV3Key.getBytes("utf-8"));
+//                        String pulicKey = aesUtil.decryptToString(encrypt_certificate.getAssociated_data().getBytes("utf-8"), encrypt_certificate.getNonce().getBytes("utf-8"), encrypt_certificate.getCiphertext());
+//                                       //获取平台证书                        final CertificateFactory cf = CertificateFactory.getInstance("X509");
+//
+//                        ByteArrayInputStream inputStream = new ByteArrayInputStream(pulicKey.getBytes(StandardCharsets.UTF_8));
+//
+//                        x509Certificate = (X509Certificate) cf.generateCertificate(inputStream);
+//                    }
+//                }
+//                return x509Certificate;
+//            } else if (statusCode == 204) { //处理成功,无返回Body
+//                System.out.println("success");
+//                return x509Certificate;
+//            } else {
+//                System.out.println("failed,resp code = " + statusCode + ",return body = " + EntityUtils.toString(response.getEntity()));
+//                return x509Certificate;
+//            }
+//        } catch (GeneralSecurityException | ParseException e) {
+//            e.printStackTrace();
+//            return null;
+//        } finally {
+//            response.close();
+//            CommonUtils.after(httpClient);
+//        }
+//    }
 
 
     /**
@@ -373,11 +444,13 @@
     }
 
     public static void main(String[] args) {
-        HeaderDto headerDto = new HeaderDto();
-        headerDto.setCallback_url("https://api.blnka.cn/api/xcxPay/fapiaoCallBack");
-        headerDto.setShow_fapiao_cell(true);
-        String parseObj = JSONUtil.parseObj(headerDto).toString();
-            System.out.println(parseObj);
+        byte[] bytes = new byte[0];
+        try {
+            bytes = "DVREEVEREBERykpbgqcfsdsfggsdg".getBytes("utf-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        System.out.println(bytes.length);
     }
 
 }

--
Gitblit v1.9.1