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