All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.binarywang.wxpay.service.impl.CustomDeclarationServiceImpl Maven / Gradle / Ivy

The newest version!
package com.github.binarywang.wxpay.service.impl;

import com.github.binarywang.wxpay.bean.customs.*;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.CustomDeclarationService;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.v3.util.RsaCryptoUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.RequiredArgsConstructor;
import me.chanjar.weixin.common.error.WxRuntimeException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.Base64;

/**
 * 
 * 支付报关 实现.
 * Created by xifengzhu on 2022/05/05.
 * 
* * @author xifengzhu */ @RequiredArgsConstructor public class CustomDeclarationServiceImpl implements CustomDeclarationService { private static final Gson GSON = new GsonBuilder().create(); private final WxPayService payService; @Override public DeclarationResult declare(DeclarationRequest request) throws WxPayException { String response = this.payService.postV3(DECLARATION_BASE_URL.concat("/orders"), GSON.toJson(request)); return GSON.fromJson(response, DeclarationResult.class); } @Override public DeclarationQueryResult query(DeclarationQueryRequest request) throws WxPayException { String url = String.format("%s/orders?appid=%s&mchid=%s&order_type=%s&order_no=%s&customs=%s&offset=%s&limit=%s", DECLARATION_BASE_URL, request.getAppid(), request.getMchid(), request.getOrderType(), request.getOrderNo(), request.getCustoms(), request.getOffset(), request.getLimit() ); String result = this.payService.getV3(url); return GSON.fromJson(result, DeclarationQueryResult.class); } @Override public VerifyCertificateResult verifyCertificate(VerifyCertificateRequest request) throws WxPayException { this.encryptFields(request); String response = this.payService.postV3WithWechatpaySerial(DECLARATION_BASE_URL.concat("/verify-certificate"), GSON.toJson(request)); return GSON.fromJson(response, VerifyCertificateResult.class); } @Override public DeclarationResult modify(DeclarationRequest request) throws WxPayException { String response = this.payService.patchV3(DECLARATION_BASE_URL.concat("/orders"), GSON.toJson(request)); return GSON.fromJson(response, DeclarationResult.class); } @Override public RedeclareResult redeclare(RedeclareRequest request) throws WxPayException { String response = this.payService.postV3(DECLARATION_BASE_URL.concat("/redeclare"), GSON.toJson(request)); return GSON.fromJson(response, RedeclareResult.class); } private void encryptFields(VerifyCertificateRequest request) throws WxPayException { try { request.setCertificateId(encryptOAEP(request.getCertificateId())); request.setCertificateName(encryptOAEP(request.getCertificateName())); } catch (Exception e) { throw new WxPayException("敏感信息加密失败", e); } } private X509Certificate getValidCertificate() { return this.payService.getConfig().getVerifier().getValidCertificate(); } private String encryptOAEP(String message) throws IllegalBlockSizeException { X509Certificate certificate = getValidCertificate(); try { // 身份信息校验 RSA 加密,填充方案使用 `RSAES-PKCS1-v1_5` // https://pay.weixin.qq.com/wiki/doc/api/wxpay/ch/declarecustom_ch/chapter3_2.shtml Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, certificate.getPublicKey()); byte[] data = message.getBytes(StandardCharsets.UTF_8); byte[] ciphertext = cipher.doFinal(data); return Base64.getEncoder().encodeToString(ciphertext); } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { throw new WxRuntimeException("当前Java环境不支持RSA v1.5/OAEP", e); } catch (InvalidKeyException e) { throw new IllegalArgumentException("无效的证书", e); } catch (IllegalBlockSizeException | BadPaddingException e) { throw new IllegalBlockSizeException("加密原串的长度不能超过214字节"); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy