Commit 605e11bf5fbaebf454ea4409890405c8ff189e12

Authored by YunaiV
1 parent af361b43

fix(pay): 修复微信支付证书临时文件失效问题

使用 weixin-java-pay 的内存证书配置,替代临时文件路径,避免系统清理临时文件后导致微信支付不可用;同时使用 Hutool 的 UTF-8 字节转换方法,保持 JDK8 兼容性。
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java
@@ -6,7 +6,6 @@ import cn.hutool.core.collection.CollUtil; @@ -6,7 +6,6 @@ import cn.hutool.core.collection.CollUtil;
6 import cn.hutool.core.date.LocalDateTimeUtil; 6 import cn.hutool.core.date.LocalDateTimeUtil;
7 import cn.hutool.core.date.TemporalAccessorUtil; 7 import cn.hutool.core.date.TemporalAccessorUtil;
8 import cn.hutool.core.util.StrUtil; 8 import cn.hutool.core.util.StrUtil;
9 -import cn.iocoder.yudao.framework.common.util.io.FileUtils;  
10 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 9 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
11 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; 10 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
12 import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; 11 import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
@@ -63,18 +62,17 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC @@ -63,18 +62,17 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
63 WxPayConfig payConfig = new WxPayConfig(); 62 WxPayConfig payConfig = new WxPayConfig();
64 BeanUtil.copyProperties(config, payConfig, "keyContent", "privateKeyContent", "publicKeyContent"); 63 BeanUtil.copyProperties(config, payConfig, "keyContent", "privateKeyContent", "publicKeyContent");
65 payConfig.setTradeType(tradeType); 64 payConfig.setTradeType(tradeType);
66 - // weixin-pay-java 无法设置内容,只允许读取文件,所以这里要创建临时文件来解决  
67 if (Objects.equals(config.getApiVersion(), API_VERSION_V2)) { 65 if (Objects.equals(config.getApiVersion(), API_VERSION_V2)) {
68 - payConfig.setKeyPath(FileUtils.createTempFile(Base64.decode(config.getKeyContent())).getPath()); 66 + payConfig.setKeyContent(Base64.decode(config.getKeyContent()));
69 } else if (Objects.equals(config.getApiVersion(), API_VERSION_V3)) { 67 } else if (Objects.equals(config.getApiVersion(), API_VERSION_V3)) {
70 - payConfig.setPrivateKeyPath(FileUtils.createTempFile(config.getPrivateKeyContent()).getPath()); 68 + payConfig.setPrivateKeyContent(StrUtil.utf8Bytes(config.getPrivateKeyContent()));
71 // 参考 https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICUE53 和 https://t.zsxq.com/ODR5V 69 // 参考 https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICUE53 和 https://t.zsxq.com/ODR5V
72 if (StrUtil.isNotBlank(config.getPublicKeyContent())) { 70 if (StrUtil.isNotBlank(config.getPublicKeyContent())) {
73 - payConfig.setPublicKeyPath(FileUtils.createTempFile(config.getPublicKeyContent()).getPath()); 71 + payConfig.setPublicKeyContent(StrUtil.utf8Bytes(config.getPublicKeyContent()));
74 } 72 }
75 // 特殊:强制使用微信公钥模式,避免灰度期间的问题!!! 73 // 特殊:强制使用微信公钥模式,避免灰度期间的问题!!!
76 payConfig.setStrictlyNeedWechatPaySerial(true); 74 payConfig.setStrictlyNeedWechatPaySerial(true);
77 - // 特殊:weixin-java-pay 只有配置 publicKeyPath 后,再开启 fullPublicKeyModel,才会使用 PublicCertificateVerifier 75 + // 特殊:weixin-java-pay 只有配置 publicKeyContent 后,再开启 fullPublicKeyModel,才会使用 PublicCertificateVerifier
78 // 对应 https://t.zsxq.com/5Q9lO 帖子 76 // 对应 https://t.zsxq.com/5Q9lO 帖子
79 payConfig.setFullPublicKeyModel(true); 77 payConfig.setFullPublicKeyModel(true);
80 } 78 }