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.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_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) {
 | 
					    protected void doInit(String tradeType) {
 | 
				
			||||||
        // 创建 config 配置
 | 
					        // 创建 config 配置
 | 
				
			||||||
        WxPayConfig payConfig = new WxPayConfig();
 | 
					        WxPayConfig payConfig = new WxPayConfig();
 | 
				
			||||||
        BeanUtil.copyProperties(config, payConfig, "keyContent", "privateKeyContent", "privateCertContent");
 | 
					        BeanUtil.copyProperties(config, payConfig, "keyContent", "privateKeyContent");
 | 
				
			||||||
        payConfig.setTradeType(tradeType);
 | 
					        payConfig.setTradeType(tradeType);
 | 
				
			||||||
        // weixin-pay-java 无法设置内容,只允许读取文件,所以这里要创建临时文件来解决
 | 
					        // 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());
 | 
					            payConfig.setKeyPath(FileUtils.createTempFile(Base64.decode(config.getKeyContent())).getPath());
 | 
				
			||||||
        }
 | 
					        } else if (Objects.equals(config.getApiVersion(), API_VERSION_V3)) {
 | 
				
			||||||
        if (StrUtil.isNotEmpty(config.getPrivateKeyContent())) {
 | 
					 | 
				
			||||||
            payConfig.setPrivateKeyPath(FileUtils.createTempFile(config.getPrivateKeyContent()).getPath());
 | 
					            payConfig.setPrivateKeyPath(FileUtils.createTempFile(config.getPrivateKeyContent()).getPath());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (StrUtil.isNotEmpty(config.getPrivateCertContent())) {
 | 
					 | 
				
			||||||
            payConfig.setPrivateCertPath(FileUtils.createTempFile(config.getPrivateCertContent()).getPath());
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
//        payConfig.setCertSerialNo();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 创建 client 客户端
 | 
					        // 创建 client 客户端
 | 
				
			||||||
        client = new WxPayServiceImpl();
 | 
					        client = new WxPayServiceImpl();
 | 
				
			||||||
@@ -86,7 +82,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
				
			|||||||
            switch (config.getApiVersion()) {
 | 
					            switch (config.getApiVersion()) {
 | 
				
			||||||
                case API_VERSION_V2:
 | 
					                case API_VERSION_V2:
 | 
				
			||||||
                    return doUnifiedOrderV2(reqDTO);
 | 
					                    return doUnifiedOrderV2(reqDTO);
 | 
				
			||||||
                case WxPayClientConfig.API_VERSION_V3:
 | 
					                case API_VERSION_V3:
 | 
				
			||||||
                    return doUnifiedOrderV3(reqDTO);
 | 
					                    return doUnifiedOrderV3(reqDTO);
 | 
				
			||||||
                default:
 | 
					                default:
 | 
				
			||||||
                    throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
					                    throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
				
			||||||
@@ -157,7 +153,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
				
			|||||||
        switch (config.getApiVersion()) {
 | 
					        switch (config.getApiVersion()) {
 | 
				
			||||||
            case API_VERSION_V2:
 | 
					            case API_VERSION_V2:
 | 
				
			||||||
                return doParseOrderNotifyV2(body);
 | 
					                return doParseOrderNotifyV2(body);
 | 
				
			||||||
            case WxPayClientConfig.API_VERSION_V3:
 | 
					            case API_VERSION_V3:
 | 
				
			||||||
                return doParseOrderNotifyV3(body);
 | 
					                return doParseOrderNotifyV3(body);
 | 
				
			||||||
            default:
 | 
					            default:
 | 
				
			||||||
                throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
					                throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
				
			||||||
@@ -192,7 +188,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
				
			|||||||
            switch (config.getApiVersion()) {
 | 
					            switch (config.getApiVersion()) {
 | 
				
			||||||
                case API_VERSION_V2:
 | 
					                case API_VERSION_V2:
 | 
				
			||||||
                    return doGetOrderV2(outTradeNo);
 | 
					                    return doGetOrderV2(outTradeNo);
 | 
				
			||||||
                case WxPayClientConfig.API_VERSION_V3:
 | 
					                case API_VERSION_V3:
 | 
				
			||||||
                    return doGetOrderV3(outTradeNo);
 | 
					                    return doGetOrderV3(outTradeNo);
 | 
				
			||||||
                default:
 | 
					                default:
 | 
				
			||||||
                    throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
					                    throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
				
			||||||
@@ -261,7 +257,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
				
			|||||||
            switch (config.getApiVersion()) {
 | 
					            switch (config.getApiVersion()) {
 | 
				
			||||||
                case API_VERSION_V2:
 | 
					                case API_VERSION_V2:
 | 
				
			||||||
                    return doUnifiedRefundV2(reqDTO);
 | 
					                    return doUnifiedRefundV2(reqDTO);
 | 
				
			||||||
                case WxPayClientConfig.API_VERSION_V3:
 | 
					                case API_VERSION_V3:
 | 
				
			||||||
                    return doUnifiedRefundV3(reqDTO);
 | 
					                    return doUnifiedRefundV3(reqDTO);
 | 
				
			||||||
                default:
 | 
					                default:
 | 
				
			||||||
                    throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
					                    throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
				
			||||||
@@ -321,7 +317,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
				
			|||||||
        switch (config.getApiVersion()) {
 | 
					        switch (config.getApiVersion()) {
 | 
				
			||||||
            case API_VERSION_V2:
 | 
					            case API_VERSION_V2:
 | 
				
			||||||
                return doParseRefundNotifyV2(body);
 | 
					                return doParseRefundNotifyV2(body);
 | 
				
			||||||
            case WxPayClientConfig.API_VERSION_V3:
 | 
					            case API_VERSION_V3:
 | 
				
			||||||
                return parseRefundNotifyV3(body);
 | 
					                return parseRefundNotifyV3(body);
 | 
				
			||||||
            default:
 | 
					            default:
 | 
				
			||||||
                throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
					                throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
				
			||||||
@@ -358,7 +354,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
 | 
				
			|||||||
            switch (config.getApiVersion()) {
 | 
					            switch (config.getApiVersion()) {
 | 
				
			||||||
                case API_VERSION_V2:
 | 
					                case API_VERSION_V2:
 | 
				
			||||||
                    return doGetRefundV2(outTradeNo, outRefundNo);
 | 
					                    return doGetRefundV2(outTradeNo, outRefundNo);
 | 
				
			||||||
                case WxPayClientConfig.API_VERSION_V3:
 | 
					                case API_VERSION_V3:
 | 
				
			||||||
                    return doGetRefundV3(outTradeNo, outRefundNo);
 | 
					                    return doGetRefundV3(outTradeNo, outRefundNo);
 | 
				
			||||||
                default:
 | 
					                default:
 | 
				
			||||||
                    throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
					                    throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +1,10 @@
 | 
				
			|||||||
package cn.iocoder.yudao.framework.pay.core.client.impl.weixin;
 | 
					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.common.util.validation.ValidationUtils;
 | 
				
			||||||
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
 | 
					import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
 | 
				
			||||||
import lombok.Data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import jakarta.validation.Validator;
 | 
					import jakarta.validation.Validator;
 | 
				
			||||||
import jakarta.validation.constraints.NotBlank;
 | 
					import jakarta.validation.constraints.NotBlank;
 | 
				
			||||||
import java.io.FileInputStream;
 | 
					import lombok.Data;
 | 
				
			||||||
import java.io.FileNotFoundException;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 微信支付的 PayClientConfig 实现类
 | 
					 * 微信支付的 PayClientConfig 实现类
 | 
				
			||||||
@@ -71,16 +67,19 @@ public class WxPayClientConfig implements PayClientConfig {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    @NotBlank(message = "apiclient_key 不能为空", groups = V3.class)
 | 
					    @NotBlank(message = "apiclient_key 不能为空", groups = V3.class)
 | 
				
			||||||
    private String privateKeyContent;
 | 
					    private String privateKeyContent;
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * apiclient_cert.pem 证书文件的对应的字符串
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    @NotBlank(message = "apiclient_cert 不能为空", groups = V3.class)
 | 
					 | 
				
			||||||
    private String privateCertContent;
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * apiV3 密钥值
 | 
					     * apiV3 密钥值
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @NotBlank(message = "apiV3 密钥值不能为空", groups = V3.class)
 | 
					    @NotBlank(message = "apiV3 密钥值不能为空", groups = V3.class)
 | 
				
			||||||
    private String apiV3Key;
 | 
					    private String apiV3Key;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 证书序列号
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @NotBlank(message = "证书序列号不能为空", groups = V3.class)
 | 
				
			||||||
 | 
					    private String certSerialNo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Deprecated // TODO 芋艿:V2.3.0 进行移除
 | 
				
			||||||
 | 
					    private String privateCertContent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 分组校验 v2版本
 | 
					     * 分组校验 v2版本
 | 
				
			||||||
@@ -100,11 +99,4 @@ public class WxPayClientConfig implements PayClientConfig {
 | 
				
			|||||||
                API_VERSION_V2.equals(this.getApiVersion()) ? V2.class : V3.class);
 | 
					                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