mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 04:08:43 +08:00 
			
		
		
		
	【功能优化】PAY:微信支付使用 certSerialNo 替代 privateCertContent
This commit is contained in:
		@@ -36,6 +36,7 @@ import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import static cn.hutool.core.date.DatePattern.*;
 | 
			
		||||
import static cn.iocoder.yudao.framework.pay.core.client.impl.weixin.WxPayClientConfig.API_VERSION_V2;
 | 
			
		||||
import static cn.iocoder.yudao.framework.pay.core.client.impl.weixin.WxPayClientConfig.API_VERSION_V3;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 微信支付抽象类,实现微信统一的接口、以及部分实现(退款)
 | 
			
		||||
@@ -59,19 +60,14 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
			
		||||
    protected void doInit(String tradeType) {
 | 
			
		||||
        // 创建 config 配置
 | 
			
		||||
        WxPayConfig payConfig = new WxPayConfig();
 | 
			
		||||
        BeanUtil.copyProperties(config, payConfig, "keyContent", "privateKeyContent", "privateCertContent");
 | 
			
		||||
        BeanUtil.copyProperties(config, payConfig, "keyContent", "privateKeyContent");
 | 
			
		||||
        payConfig.setTradeType(tradeType);
 | 
			
		||||
        // weixin-pay-java 无法设置内容,只允许读取文件,所以这里要创建临时文件来解决
 | 
			
		||||
        if (Base64.isBase64(config.getKeyContent())) {
 | 
			
		||||
        if (Objects.equals(config.getApiVersion(), API_VERSION_V2)) {
 | 
			
		||||
            payConfig.setKeyPath(FileUtils.createTempFile(Base64.decode(config.getKeyContent())).getPath());
 | 
			
		||||
        }
 | 
			
		||||
        if (StrUtil.isNotEmpty(config.getPrivateKeyContent())) {
 | 
			
		||||
        } else if (Objects.equals(config.getApiVersion(), API_VERSION_V3)) {
 | 
			
		||||
            payConfig.setPrivateKeyPath(FileUtils.createTempFile(config.getPrivateKeyContent()).getPath());
 | 
			
		||||
        }
 | 
			
		||||
        if (StrUtil.isNotEmpty(config.getPrivateCertContent())) {
 | 
			
		||||
            payConfig.setPrivateCertPath(FileUtils.createTempFile(config.getPrivateCertContent()).getPath());
 | 
			
		||||
        }
 | 
			
		||||
//        payConfig.setCertSerialNo();
 | 
			
		||||
 | 
			
		||||
        // 创建 client 客户端
 | 
			
		||||
        client = new WxPayServiceImpl();
 | 
			
		||||
@@ -86,7 +82,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
			
		||||
            switch (config.getApiVersion()) {
 | 
			
		||||
                case API_VERSION_V2:
 | 
			
		||||
                    return doUnifiedOrderV2(reqDTO);
 | 
			
		||||
                case WxPayClientConfig.API_VERSION_V3:
 | 
			
		||||
                case API_VERSION_V3:
 | 
			
		||||
                    return doUnifiedOrderV3(reqDTO);
 | 
			
		||||
                default:
 | 
			
		||||
                    throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
			
		||||
@@ -157,7 +153,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
			
		||||
        switch (config.getApiVersion()) {
 | 
			
		||||
            case API_VERSION_V2:
 | 
			
		||||
                return doParseOrderNotifyV2(body);
 | 
			
		||||
            case WxPayClientConfig.API_VERSION_V3:
 | 
			
		||||
            case API_VERSION_V3:
 | 
			
		||||
                return doParseOrderNotifyV3(body);
 | 
			
		||||
            default:
 | 
			
		||||
                throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
			
		||||
@@ -192,7 +188,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
			
		||||
            switch (config.getApiVersion()) {
 | 
			
		||||
                case API_VERSION_V2:
 | 
			
		||||
                    return doGetOrderV2(outTradeNo);
 | 
			
		||||
                case WxPayClientConfig.API_VERSION_V3:
 | 
			
		||||
                case API_VERSION_V3:
 | 
			
		||||
                    return doGetOrderV3(outTradeNo);
 | 
			
		||||
                default:
 | 
			
		||||
                    throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
			
		||||
@@ -261,7 +257,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
			
		||||
            switch (config.getApiVersion()) {
 | 
			
		||||
                case API_VERSION_V2:
 | 
			
		||||
                    return doUnifiedRefundV2(reqDTO);
 | 
			
		||||
                case WxPayClientConfig.API_VERSION_V3:
 | 
			
		||||
                case API_VERSION_V3:
 | 
			
		||||
                    return doUnifiedRefundV3(reqDTO);
 | 
			
		||||
                default:
 | 
			
		||||
                    throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
			
		||||
@@ -321,7 +317,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
			
		||||
        switch (config.getApiVersion()) {
 | 
			
		||||
            case API_VERSION_V2:
 | 
			
		||||
                return doParseRefundNotifyV2(body);
 | 
			
		||||
            case WxPayClientConfig.API_VERSION_V3:
 | 
			
		||||
            case API_VERSION_V3:
 | 
			
		||||
                return parseRefundNotifyV3(body);
 | 
			
		||||
            default:
 | 
			
		||||
                throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
			
		||||
@@ -358,7 +354,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
			
		||||
            switch (config.getApiVersion()) {
 | 
			
		||||
                case API_VERSION_V2:
 | 
			
		||||
                    return doGetRefundV2(outTradeNo, outRefundNo);
 | 
			
		||||
                case WxPayClientConfig.API_VERSION_V3:
 | 
			
		||||
                case API_VERSION_V3:
 | 
			
		||||
                    return doGetRefundV3(outTradeNo, outRefundNo);
 | 
			
		||||
                default:
 | 
			
		||||
                    throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,10 @@
 | 
			
		||||
package cn.iocoder.yudao.framework.pay.core.client.impl.weixin;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.io.IoUtil;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import jakarta.validation.Validator;
 | 
			
		||||
import jakarta.validation.constraints.NotBlank;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.FileNotFoundException;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 微信支付的 PayClientConfig 实现类
 | 
			
		||||
@@ -71,16 +67,19 @@ public class WxPayClientConfig implements PayClientConfig {
 | 
			
		||||
     */
 | 
			
		||||
    @NotBlank(message = "apiclient_key 不能为空", groups = V3.class)
 | 
			
		||||
    private String privateKeyContent;
 | 
			
		||||
    /**
 | 
			
		||||
     * apiclient_cert.pem 证书文件的对应的字符串
 | 
			
		||||
     */
 | 
			
		||||
    @NotBlank(message = "apiclient_cert 不能为空", groups = V3.class)
 | 
			
		||||
    private String privateCertContent;
 | 
			
		||||
    /**
 | 
			
		||||
     * apiV3 密钥值
 | 
			
		||||
     */
 | 
			
		||||
    @NotBlank(message = "apiV3 密钥值不能为空", groups = V3.class)
 | 
			
		||||
    private String apiV3Key;
 | 
			
		||||
    /**
 | 
			
		||||
     * 证书序列号
 | 
			
		||||
     */
 | 
			
		||||
    @NotBlank(message = "证书序列号不能为空", groups = V3.class)
 | 
			
		||||
    private String certSerialNo;
 | 
			
		||||
 | 
			
		||||
    @Deprecated // TODO 芋艿:V2.3.0 进行移除
 | 
			
		||||
    private String privateCertContent;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分组校验 v2版本
 | 
			
		||||
@@ -100,11 +99,4 @@ public class WxPayClientConfig implements PayClientConfig {
 | 
			
		||||
                API_VERSION_V2.equals(this.getApiVersion()) ? V2.class : V3.class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void main(String[] args) throws FileNotFoundException {
 | 
			
		||||
        String path = "/Users/yunai/Downloads/wx_pay/apiclient_cert.p12";
 | 
			
		||||
        /// String path = "/Users/yunai/Downloads/wx_pay/apiclient_key.pem";
 | 
			
		||||
        /// String path = "/Users/yunai/Downloads/wx_pay/apiclient_cert.pem";
 | 
			
		||||
        System.out.println(IoUtil.readUtf8(new FileInputStream(path)));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user