diff --git a/src/main/java/com/gxwebsoft/bszx/service/impl/BszxBmServiceImpl.java b/src/main/java/com/gxwebsoft/bszx/service/impl/BszxBmServiceImpl.java index fe8d146..1b73248 100644 --- a/src/main/java/com/gxwebsoft/bszx/service/impl/BszxBmServiceImpl.java +++ b/src/main/java/com/gxwebsoft/bszx/service/impl/BszxBmServiceImpl.java @@ -133,13 +133,13 @@ public class BszxBmServiceImpl extends ServiceImpl impleme //执行图片合并 combiner.combine(); - if (!FileUtil.exist(uploadPath + "file/poster/" + item.getTenantId() + "/bm")) { - FileUtil.mkdir(uploadPath + "file/poster/" + item.getTenantId() + "/bm"); + if (!FileUtil.exist(uploadPath + "/file/poster/" + item.getTenantId() + "/bm")) { + FileUtil.mkdir(uploadPath + "/file/poster/" + item.getTenantId() + "/bm"); } String basePath = "/poster/" + item.getTenantId() + "/bm/big-" + item.getId() + ".jpg"; String smallPath = "/poster/" + item.getTenantId() + "/bm/" + item.getId() + ".jpg"; - String filename = uploadPath + "file" + basePath; - String smallFileName = uploadPath + "file" + smallPath; + String filename = uploadPath + "/file" + basePath; + String smallFileName = uploadPath + "/file" + smallPath; combiner.save(filename); File input = new File(filename); diff --git a/src/main/java/com/gxwebsoft/bszx/service/impl/BszxPayServiceImpl.java b/src/main/java/com/gxwebsoft/bszx/service/impl/BszxPayServiceImpl.java index c7ffe46..eb2c3d0 100644 --- a/src/main/java/com/gxwebsoft/bszx/service/impl/BszxPayServiceImpl.java +++ b/src/main/java/com/gxwebsoft/bszx/service/impl/BszxPayServiceImpl.java @@ -123,13 +123,13 @@ public class BszxPayServiceImpl extends ServiceImpl impl //执行图片合并 combiner.combine(); - if (!FileUtil.exist(uploadPath + "file/poster/" + payCert.getTenantId() + "/pay")) { - FileUtil.mkdir(uploadPath + "file/poster/" + payCert.getTenantId() + "/pay"); + if (!FileUtil.exist(uploadPath + "/file/poster/" + payCert.getTenantId() + "/pay")) { + FileUtil.mkdir(uploadPath + "/file/poster/" + payCert.getTenantId() + "/pay"); } String basePath = "/poster/" + payCert.getTenantId() + "/pay/big-" + id + ".jpg"; String smallPath = "/poster/" + payCert.getTenantId() + "/pay/" + id + ".jpg"; - String filename = uploadPath + "file" + basePath; - String smallFileName = uploadPath + "file" + smallPath; + String filename = uploadPath + "/file" + basePath; + String smallFileName = uploadPath + "/file" + smallPath; combiner.save(filename); File input = new File(filename); diff --git a/src/main/java/com/gxwebsoft/common/core/utils/MyQrCodeUtil.java b/src/main/java/com/gxwebsoft/common/core/utils/MyQrCodeUtil.java index 9651cce..933deac 100644 --- a/src/main/java/com/gxwebsoft/common/core/utils/MyQrCodeUtil.java +++ b/src/main/java/com/gxwebsoft/common/core/utils/MyQrCodeUtil.java @@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrConfig; +import org.springframework.beans.factory.annotation.Value; import javax.annotation.Resource; import javax.imageio.ImageIO; @@ -22,6 +23,9 @@ import static com.gxwebsoft.common.core.constants.QRCodeConstants.*; */ public class MyQrCodeUtil { + @Value("${config.upload-path}") + private static String uploadPath; + private static final String logoUrl = "https://file.wsdns.cn/20230430/6fa31aca3b0d47af98a149cf2dd26a4f.jpeg"; /** @@ -60,7 +64,7 @@ public class MyQrCodeUtil { * @return 二维码图片地址 */ public static String createQrCode(String type,Integer id, String content) throws IOException { - String filePath = "/www/wwwroot/file.ws/file/qrcode/".concat(type).concat("/"); + String filePath = uploadPath + "/file/qrcode/".concat(type).concat("/"); String qrcodeUrl = "https://file.websoft.top/qrcode/".concat(type).concat("/"); // 将URL转为BufferedImage BufferedImage bufferedImage = ImageIO.read(new URL(logoUrl)); diff --git a/src/main/java/com/gxwebsoft/common/core/utils/WechatPayConfigValidator.java b/src/main/java/com/gxwebsoft/common/core/utils/WechatPayConfigValidator.java index 79905fd..23326d2 100644 --- a/src/main/java/com/gxwebsoft/common/core/utils/WechatPayConfigValidator.java +++ b/src/main/java/com/gxwebsoft/common/core/utils/WechatPayConfigValidator.java @@ -3,12 +3,13 @@ package com.gxwebsoft.common.core.utils; import com.gxwebsoft.common.core.config.CertificateProperties; import com.gxwebsoft.common.system.entity.Payment; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; /** * 微信支付配置验证工具 - * + * * @author 科技小王子 * @since 2025-07-27 */ @@ -19,6 +20,9 @@ public class WechatPayConfigValidator { private final CertificateProperties certConfig; private final CertificateLoader certificateLoader; + @Value("${spring.profiles.active}") + private String activeProfile; + public WechatPayConfigValidator(CertificateProperties certConfig, CertificateLoader certificateLoader) { this.certConfig = certConfig; this.certificateLoader = certificateLoader; @@ -26,34 +30,34 @@ public class WechatPayConfigValidator { /** * 验证微信支付配置 - * + * * @param payment 支付配置 * @param tenantId 租户ID * @return 验证结果 */ public ValidationResult validateWechatPayConfig(Payment payment, Integer tenantId) { ValidationResult result = new ValidationResult(); - + log.info("开始验证微信支付配置 - 租户ID: {}", tenantId); - + // 1. 验证基本配置 if (payment == null) { result.addError("支付配置为空"); return result; } - + if (!StringUtils.hasText(payment.getMchId())) { result.addError("商户号未配置"); } - + if (!StringUtils.hasText(payment.getAppId())) { result.addError("应用ID未配置"); } - + if (!StringUtils.hasText(payment.getMerchantSerialNumber())) { result.addError("商户证书序列号未配置"); } - + // 2. 验证 APIv3 密钥 String apiV3Key = getValidApiV3Key(payment); if (!StringUtils.hasText(apiV3Key)) { @@ -61,35 +65,35 @@ public class WechatPayConfigValidator { } else { validateApiV3Key(apiV3Key, result); } - + // 3. 验证证书文件 validateCertificateFiles(tenantId, result); - + // 4. 记录验证结果 if (result.isValid()) { log.info("✅ 微信支付配置验证通过 - 租户ID: {}", tenantId); } else { log.error("❌ 微信支付配置验证失败 - 租户ID: {}, 错误: {}", tenantId, result.getErrors()); } - + return result; } - + /** * 获取有效的 APIv3 密钥 * 优先使用数据库配置,如果为空则使用配置文件默认值 */ public String getValidApiV3Key(Payment payment) { String apiV3Key = payment.getApiKey(); - + if (!StringUtils.hasText(apiV3Key)) { apiV3Key = certConfig.getWechatPay().getDev().getApiV3Key(); log.warn("数据库中APIv3密钥为空,使用配置文件默认值"); } - + return apiV3Key; } - + /** * 验证 APIv3 密钥格式 */ @@ -97,43 +101,49 @@ public class WechatPayConfigValidator { if (apiV3Key.length() != 32) { result.addError("APIv3密钥长度错误,应为32位,实际为: " + apiV3Key.length()); } - + if (!apiV3Key.matches("^[a-zA-Z0-9]+$")) { result.addError("APIv3密钥格式错误,应仅包含字母和数字"); } - - log.info("APIv3密钥验证 - 长度: {}, 格式: {}", - apiV3Key.length(), + + log.info("APIv3密钥验证 - 长度: {}, 格式: {}", + apiV3Key.length(), apiV3Key.matches("^[a-zA-Z0-9]+$") ? "正确" : "错误"); } - + /** * 验证证书文件 */ private void validateCertificateFiles(Integer tenantId, ValidationResult result) { - String tenantCertPath = "dev/wechat/" + tenantId; - String privateKeyPath = tenantCertPath + "/" + certConfig.getWechatPay().getDev().getPrivateKeyFile(); - - if (!certificateLoader.certificateExists(privateKeyPath)) { - result.addError("证书文件不存在: " + privateKeyPath); - return; - } - - try { - String privateKey = certificateLoader.loadCertificatePath(privateKeyPath); - log.info("✅ 证书文件验证通过: {}", privateKey); - } catch (Exception e) { - result.addError("证书文件加载失败: " + e.getMessage()); + if ("dev".equals(activeProfile)) { + // 开发环境证书验证 + String tenantCertPath = "dev/wechat/" + tenantId; + String privateKeyPath = tenantCertPath + "/" + certConfig.getWechatPay().getDev().getPrivateKeyFile(); + + if (!certificateLoader.certificateExists(privateKeyPath)) { + result.addError("证书文件不存在: " + privateKeyPath); + return; + } + + try { + certificateLoader.loadCertificatePath(privateKeyPath); + log.info("✅ 开发环境证书文件验证通过: {}", privateKeyPath); + } catch (Exception e) { + result.addError("证书文件加载失败: " + e.getMessage()); + } + } else { + // 生产环境证书验证 - 跳过文件存在性检查,因为证书路径来自数据库 + log.info("✅ 生产环境跳过证书文件存在性验证,使用数据库配置的证书路径"); } } - + /** * 验证结果类 */ public static class ValidationResult { private boolean valid = true; private StringBuilder errors = new StringBuilder(); - + public void addError(String error) { this.valid = false; if (errors.length() > 0) { @@ -141,22 +151,22 @@ public class WechatPayConfigValidator { } errors.append(error); } - + public boolean isValid() { return valid; } - + public String getErrors() { return errors.toString(); } - + public void logErrors() { if (!valid) { log.error("配置验证失败: {}", errors.toString()); } } } - + /** * 生成配置诊断报告 */ @@ -164,41 +174,50 @@ public class WechatPayConfigValidator { StringBuilder report = new StringBuilder(); report.append("=== 微信支付配置诊断报告 ===\n"); report.append("租户ID: ").append(tenantId).append("\n"); - + if (payment != null) { report.append("商户号: ").append(payment.getMchId()).append("\n"); report.append("应用ID: ").append(payment.getAppId()).append("\n"); report.append("商户证书序列号: ").append(payment.getMerchantSerialNumber()).append("\n"); - + String dbApiKey = payment.getApiKey(); String configApiKey = certConfig.getWechatPay().getDev().getApiV3Key(); - + report.append("数据库APIv3密钥: ").append(dbApiKey != null ? "已配置(" + dbApiKey.length() + "位)" : "未配置").append("\n"); report.append("配置文件APIv3密钥: ").append(configApiKey != null ? "已配置(" + configApiKey.length() + "位)" : "未配置").append("\n"); - + String finalApiKey = getValidApiV3Key(payment); report.append("最终使用APIv3密钥: ").append(finalApiKey != null ? "已配置(" + finalApiKey.length() + "位)" : "未配置").append("\n"); - + } else { report.append("❌ 支付配置为空\n"); } - + // 证书文件检查 - String tenantCertPath = "dev/wechat/" + tenantId; - String privateKeyPath = tenantCertPath + "/" + certConfig.getWechatPay().getDev().getPrivateKeyFile(); - boolean certExists = certificateLoader.certificateExists(privateKeyPath); - - report.append("证书文件路径: ").append(privateKeyPath).append("\n"); - report.append("证书文件存在: ").append(certExists ? "是" : "否").append("\n"); - + report.append("当前环境: ").append(activeProfile).append("\n"); + if ("dev".equals(activeProfile)) { + String tenantCertPath = "dev/wechat/" + tenantId; + String privateKeyPath = tenantCertPath + "/" + certConfig.getWechatPay().getDev().getPrivateKeyFile(); + boolean certExists = certificateLoader.certificateExists(privateKeyPath); + + report.append("开发环境证书文件路径: ").append(privateKeyPath).append("\n"); + report.append("证书文件存在: ").append(certExists ? "是" : "否").append("\n"); + } else { + report.append("生产环境证书路径: 从数据库配置获取\n"); + if (payment != null) { + report.append("私钥文件: ").append(payment.getApiclientKey()).append("\n"); + report.append("证书文件: ").append(payment.getApiclientCert()).append("\n"); + } + } + ValidationResult validation = validateWechatPayConfig(payment, tenantId); report.append("配置验证结果: ").append(validation.isValid() ? "通过" : "失败").append("\n"); if (!validation.isValid()) { report.append("验证错误: ").append(validation.getErrors()).append("\n"); } - + report.append("=== 诊断报告结束 ==="); - + return report.toString(); } } diff --git a/src/main/java/com/gxwebsoft/house/service/impl/HouseInfoServiceImpl.java b/src/main/java/com/gxwebsoft/house/service/impl/HouseInfoServiceImpl.java index e4046f7..85b5f70 100644 --- a/src/main/java/com/gxwebsoft/house/service/impl/HouseInfoServiceImpl.java +++ b/src/main/java/com/gxwebsoft/house/service/impl/HouseInfoServiceImpl.java @@ -182,7 +182,7 @@ public class HouseInfoServiceImpl extends ServiceImpl