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/test/java/cc/mrbird/febs/ProfitTest.java | 25 ++++++
src/main/java/cc/mrbird/febs/pay/util/RequestBodyUtils.java | 76 +++++++++++++++++++
src/main/java/cc/mrbird/febs/pay/service/impl/WxFaPiaoServiceImpl.java | 103 ++++++++++++++++++++++---
3 files changed, 189 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);
}
}
diff --git a/src/main/java/cc/mrbird/febs/pay/util/RequestBodyUtils.java b/src/main/java/cc/mrbird/febs/pay/util/RequestBodyUtils.java
new file mode 100644
index 0000000..eff106d
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/util/RequestBodyUtils.java
@@ -0,0 +1,76 @@
+package cc.mrbird.febs.pay.util;
+
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+
+public class RequestBodyUtils {
+
+ private static final int BUFFER_SIZE = 1024 * 8;
+
+ /**
+ * read string.
+ *
+ * @param reader Reader instance.
+ * @return String.
+ * @throws IOException
+ */
+ public static String read(Reader reader) throws IOException {
+ try (StringWriter writer = new StringWriter()) {
+ write(reader, writer);
+ return writer.getBuffer().toString();
+ }
+ }
+
+ /**
+ * write.
+ *
+ * @param reader Reader.
+ * @param writer Writer.
+ * @return count.
+ * @throws IOException
+ */
+ public static long write(Reader reader, Writer writer) throws IOException {
+
+ return write(reader, writer, BUFFER_SIZE);
+ }
+
+ /**
+ * write.
+ *
+ * @param reader Reader.
+ * @param writer Writer.
+ * @param bufferSize buffer size.
+ * @return count.
+ * @throws IOException
+ */
+ public static long write(Reader reader, Writer writer, int bufferSize) throws IOException {
+
+ int read;
+ long total = 0;
+ char[] buf = new char[bufferSize];
+ while ((read = reader.read(buf)) != -1) {
+
+ writer.write(buf, 0, read);
+ total += read;
+ }
+ return total;
+ }
+
+ /**
+ * 获取requestBody
+ */
+ public static String getRequestBody() throws IOException {
+ RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
+ ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) attributes;
+ assert servletRequestAttributes != null;
+ HttpServletRequest request = servletRequestAttributes.getRequest();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
+ //读取输入流的内容转换为String类型IOUtils必须引入org.apache.dubbo.common.utils.IOUtils;包
+ return RequestBodyUtils.read(reader);
+ }
+
+}
diff --git a/src/test/java/cc/mrbird/febs/ProfitTest.java b/src/test/java/cc/mrbird/febs/ProfitTest.java
index 2dc3b0a..a9eacb1 100644
--- a/src/test/java/cc/mrbird/febs/ProfitTest.java
+++ b/src/test/java/cc/mrbird/febs/ProfitTest.java
@@ -24,6 +24,10 @@
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
+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.notification.NotificationHandler;
import okhttp3.HttpUrl;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.httpclient.HttpClient;
@@ -53,6 +57,7 @@
import java.math.BigDecimal;
import java.net.URLConnection;
import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
@@ -217,6 +222,26 @@
}
@Test
+ public void rankProfit05() throws IOException {//获取用户填写的抬头
+ byte[] bytes = "daL341aN5orDt13puXadsAf2rpuX12v3".getBytes("utf-8");
+ try {
+ //传入证书
+ PrivateKey privateKey = wxFaPiaoService.getPrivateKeyV3();
+ //刷新
+ PrivateKeySigner signer = new PrivateKeySigner(AppContants.WX_CARD_NUM, privateKey);
+ WechatPay2Credentials credentials = new WechatPay2Credentials("1658958205", signer);
+ AutoUpdateCertificatesVerifier autoUpdateCertificatesVerifier = new AutoUpdateCertificatesVerifier(credentials
+ , bytes);
+
+ NotificationHandler handler = new NotificationHandler(autoUpdateCertificatesVerifier,bytes);
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Test
public void rankProfit2() throws IOException {//查询配置开发选项
PrivateKey privateKey = wxFaPiaoService.getPrivateKeyV3();
String baseUrl = "https://api.mch.weixin.qq.com";
--
Gitblit v1.9.1