| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | |
| | | @Override |
| | | public Map<String, Object> fapiaoCallBack(HttpServletResponse response, HttpServletRequest request) { |
| | | log.info("微信电子发票回调接口...."); |
| | | Map<String,Object> map = new HashMap<>(); |
| | | try { |
| | | BufferedReader br = request.getReader(); |
| | |
| | | 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()); |
| | |
| | | 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) { |
| | |
| | | } |
| | | 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); |
| | | // } |
| | | // } |
| | | |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | 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); |
| | | } |
| | | |
| | | } |