From b4789dfe1e366256a71c327db3dfc5e54f50c64d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Sun, 10 Aug 2025 02:33:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=94=AF=E4=BB=98=E8=AF=81?= =?UTF-8?q?=E4=B9=A6=E7=9A=84=E8=B7=AF=E5=BE=84=E6=8B=BC=E6=8E=A5=E8=A7=84?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CertificatePathConcatenationTest.java | 155 ++++++++++++++++++ .../test/CertificatePathFixTest.java | 99 +++++++++++ .../test/EnvironmentBasedCertificateTest.java | 119 ++++++++++++++ 3 files changed, 373 insertions(+) create mode 100644 src/test/java/com/gxwebsoft/test/CertificatePathConcatenationTest.java create mode 100644 src/test/java/com/gxwebsoft/test/CertificatePathFixTest.java create mode 100644 src/test/java/com/gxwebsoft/test/EnvironmentBasedCertificateTest.java diff --git a/src/test/java/com/gxwebsoft/test/CertificatePathConcatenationTest.java b/src/test/java/com/gxwebsoft/test/CertificatePathConcatenationTest.java new file mode 100644 index 0000000..e6ade61 --- /dev/null +++ b/src/test/java/com/gxwebsoft/test/CertificatePathConcatenationTest.java @@ -0,0 +1,155 @@ +package com.gxwebsoft.test; + +import com.gxwebsoft.common.core.config.ConfigProperties; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.beans.factory.annotation.Value; + +import javax.annotation.Resource; +import java.io.File; + +/** + * 证书路径拼接测试 + * 验证开发环境的路径拼接规则:配置文件upload-path + dev/wechat/ + 租户ID + * + * @author 科技小王子 + * @since 2025-08-09 + */ +@SpringBootTest +@ActiveProfiles("dev") +public class CertificatePathConcatenationTest { + + @Value("${spring.profiles.active:prod}") + private String activeProfile; + + @Resource + private ConfigProperties configProperties; + + @Test + public void testCertificatePathConcatenation() { + System.out.println("=== 证书路径拼接测试 ==="); + System.out.println("当前环境: " + activeProfile); + + if ("dev".equals(activeProfile)) { + testDevEnvironmentPathConcatenation(); + } else { + testProdEnvironmentPathConcatenation(); + } + + System.out.println("=== 证书路径拼接测试完成 ==="); + } + + private void testDevEnvironmentPathConcatenation() { + System.out.println("--- 开发环境路径拼接测试 ---"); + + // 获取配置文件中的upload-path + String uploadPath = configProperties.getUploadPath(); + System.out.println("配置文件upload-path: " + uploadPath); + + // 拼接规则:配置文件upload-path + dev/wechat/ + 租户ID + String tenantId = "10550"; + String certBasePath = uploadPath + "dev/wechat/" + tenantId + "/"; + String privateKeyPath = certBasePath + "apiclient_key.pem"; + String certPath = certBasePath + "apiclient_cert.pem"; + + System.out.println("拼接规则: upload-path + dev/wechat/ + 租户ID"); + System.out.println("租户ID: " + tenantId); + System.out.println("证书基础路径: " + certBasePath); + System.out.println("私钥文件路径: " + privateKeyPath); + System.out.println("证书文件路径: " + certPath); + + // 验证路径是否正确 + File privateKeyFile = new File(privateKeyPath); + File certFile = new File(certPath); + + System.out.println("--- 文件存在性验证 ---"); + System.out.println("私钥文件存在: " + privateKeyFile.exists()); + System.out.println("证书文件存在: " + certFile.exists()); + + if (privateKeyFile.exists()) { + System.out.println("✅ 私钥文件路径拼接正确"); + System.out.println(" 文件大小: " + privateKeyFile.length() + " bytes"); + } else { + System.out.println("❌ 私钥文件路径拼接错误或文件不存在"); + } + + if (certFile.exists()) { + System.out.println("✅ 证书文件路径拼接正确"); + System.out.println(" 文件大小: " + certFile.length() + " bytes"); + } else { + System.out.println("❌ 证书文件路径拼接错误或文件不存在"); + } + + // 验证期望的路径 + String expectedPath = "/Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10550/"; + System.out.println("--- 路径验证 ---"); + System.out.println("期望的证书路径: " + expectedPath); + System.out.println("实际拼接路径: " + certBasePath); + System.out.println("路径匹配: " + expectedPath.equals(certBasePath)); + + if (expectedPath.equals(certBasePath)) { + System.out.println("✅ 路径拼接规则正确"); + } else { + System.out.println("❌ 路径拼接规则需要调整"); + System.out.println(" 请检查配置文件中的upload-path设置"); + } + } + + private void testProdEnvironmentPathConcatenation() { + System.out.println("--- 生产环境路径配置测试 ---"); + System.out.println("生产环境使用数据库配置的证书路径"); + System.out.println("路径格式: {uploadPath}/file/{relativePath}"); + + String uploadPath = configProperties.getUploadPath(); + System.out.println("配置的upload-path: " + uploadPath); + + // 模拟生产环境路径拼接 + String relativePath = "wechat/10550/apiclient_key.pem"; + String prodPath = uploadPath + "file/" + relativePath; + System.out.println("生产环境示例路径: " + prodPath); + System.out.println("✅ 生产环境路径配置逻辑正确"); + } + + @Test + public void testMultipleTenantPaths() { + System.out.println("=== 多租户路径拼接测试 ==="); + + if (!"dev".equals(activeProfile)) { + System.out.println("跳过:仅在开发环境测试多租户路径"); + return; + } + + String uploadPath = configProperties.getUploadPath(); + String[] tenantIds = {"10324", "10398", "10547", "10549", "10550"}; + + System.out.println("配置文件upload-path: " + uploadPath); + System.out.println("测试多个租户的证书路径拼接:"); + + for (String tenantId : tenantIds) { + String certBasePath = uploadPath + "dev/wechat/" + tenantId + "/"; + String privateKeyPath = certBasePath + "apiclient_key.pem"; + + File privateKeyFile = new File(privateKeyPath); + System.out.println("租户 " + tenantId + ": " + (privateKeyFile.exists() ? "✅" : "❌") + " " + privateKeyPath); + } + + System.out.println("=== 多租户路径拼接测试完成 ==="); + } + + @Test + public void testConfigurationProperties() { + System.out.println("=== 配置属性测试 ==="); + + System.out.println("当前环境: " + activeProfile); + System.out.println("ConfigProperties注入: " + (configProperties != null ? "✅" : "❌")); + + if (configProperties != null) { + System.out.println("upload-path: " + configProperties.getUploadPath()); + System.out.println("upload-location: " + configProperties.getUploadLocation()); + System.out.println("server-url: " + configProperties.getServerUrl()); + } + + System.out.println("=== 配置属性测试完成 ==="); + } +} diff --git a/src/test/java/com/gxwebsoft/test/CertificatePathFixTest.java b/src/test/java/com/gxwebsoft/test/CertificatePathFixTest.java new file mode 100644 index 0000000..851a844 --- /dev/null +++ b/src/test/java/com/gxwebsoft/test/CertificatePathFixTest.java @@ -0,0 +1,99 @@ +package com.gxwebsoft.test; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; + +/** + * 证书路径修复验证测试 + * + * @author 科技小王子 + * @since 2025-08-09 + */ +@SpringBootTest +@ActiveProfiles("dev") +public class CertificatePathFixTest { + + private static final String CERT_BASE_PATH = "/Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10550"; + + @Test + public void testCertificatePathFix() { + System.out.println("=== 证书路径修复验证测试 ==="); + + // 验证证书目录存在 + File certDir = new File(CERT_BASE_PATH); + assert certDir.exists() && certDir.isDirectory() : "证书目录不存在: " + CERT_BASE_PATH; + System.out.println("✅ 证书目录存在: " + CERT_BASE_PATH); + + // 验证私钥文件 + String privateKeyPath = CERT_BASE_PATH + "/apiclient_key.pem"; + File privateKeyFile = new File(privateKeyPath); + assert privateKeyFile.exists() && privateKeyFile.isFile() : "私钥文件不存在: " + privateKeyPath; + System.out.println("✅ 私钥文件存在: " + privateKeyPath); + System.out.println(" 文件大小: " + privateKeyFile.length() + " bytes"); + + // 验证证书文件 + String certPath = CERT_BASE_PATH + "/apiclient_cert.pem"; + File certFile = new File(certPath); + assert certFile.exists() && certFile.isFile() : "证书文件不存在: " + certPath; + System.out.println("✅ 证书文件存在: " + certPath); + System.out.println(" 文件大小: " + certFile.length() + " bytes"); + + // 验证文件内容格式 + try { + String privateKeyContent = Files.readString(Paths.get(privateKeyPath)); + assert privateKeyContent.contains("-----BEGIN PRIVATE KEY-----") : "私钥文件格式错误"; + System.out.println("✅ 私钥文件格式正确"); + + String certContent = Files.readString(Paths.get(certPath)); + assert certContent.contains("-----BEGIN CERTIFICATE-----") : "证书文件格式错误"; + System.out.println("✅ 证书文件格式正确"); + + } catch (Exception e) { + throw new RuntimeException("读取证书文件失败: " + e.getMessage(), e); + } + + System.out.println("=== 证书路径修复验证完成 ==="); + System.out.println("🎉 所有证书文件验证通过!"); + System.out.println(); + System.out.println("📋 修复内容总结:"); + System.out.println("1. 修复了 SettingServiceImpl 中的硬编码证书路径"); + System.out.println("2. 更新了 WechatCertAutoConfig 中的默认开发环境配置"); + System.out.println("3. 证书路径已指向正确位置: " + CERT_BASE_PATH); + System.out.println(); + System.out.println("🔧 下一步建议:"); + System.out.println("1. 重启应用程序以使配置生效"); + System.out.println("2. 测试微信支付功能是否正常工作"); + System.out.println("3. 检查应用日志确认证书加载成功"); + } + + @Test + public void testCertificatePathStructure() { + System.out.println("=== 证书目录结构验证 ==="); + + File baseDir = new File("/Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat"); + if (baseDir.exists()) { + File[] tenantDirs = baseDir.listFiles(File::isDirectory); + if (tenantDirs != null) { + System.out.println("发现租户证书目录:"); + for (File tenantDir : tenantDirs) { + System.out.println(" - 租户ID: " + tenantDir.getName()); + + File privateKey = new File(tenantDir, "apiclient_key.pem"); + File cert = new File(tenantDir, "apiclient_cert.pem"); + File p12 = new File(tenantDir, "apiclient_cert.p12"); + + System.out.println(" 私钥文件: " + (privateKey.exists() ? "✅" : "❌")); + System.out.println(" 证书文件: " + (cert.exists() ? "✅" : "❌")); + System.out.println(" P12文件: " + (p12.exists() ? "✅" : "❌")); + } + } + } + + System.out.println("=== 目录结构验证完成 ==="); + } +} diff --git a/src/test/java/com/gxwebsoft/test/EnvironmentBasedCertificateTest.java b/src/test/java/com/gxwebsoft/test/EnvironmentBasedCertificateTest.java new file mode 100644 index 0000000..ae7dfa7 --- /dev/null +++ b/src/test/java/com/gxwebsoft/test/EnvironmentBasedCertificateTest.java @@ -0,0 +1,119 @@ +package com.gxwebsoft.test; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.beans.factory.annotation.Value; + +import javax.annotation.Resource; +import java.io.File; + +/** + * 基于环境的证书路径配置测试 + * + * @author 科技小王子 + * @since 2025-08-09 + */ +@SpringBootTest +@ActiveProfiles("dev") +public class EnvironmentBasedCertificateTest { + + @Value("${spring.profiles.active:prod}") + private String activeProfile; + + @Test + public void testEnvironmentBasedCertificateConfig() { + System.out.println("=== 环境基础证书配置测试 ==="); + System.out.println("当前激活的环境: " + activeProfile); + + if ("dev".equals(activeProfile)) { + System.out.println("✅ 检测到开发环境"); + testDevEnvironmentCertificates(); + } else { + System.out.println("✅ 检测到生产环境"); + testProdEnvironmentCertificates(); + } + + System.out.println("=== 环境基础证书配置测试完成 ==="); + } + + private void testDevEnvironmentCertificates() { + System.out.println("--- 开发环境证书路径测试 ---"); + + String devCertPath = "/Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10550"; + String privateKeyPath = devCertPath + "/apiclient_key.pem"; + String certPath = devCertPath + "/apiclient_cert.pem"; + + System.out.println("开发环境证书目录: " + devCertPath); + System.out.println("私钥文件路径: " + privateKeyPath); + System.out.println("证书文件路径: " + certPath); + + // 验证文件存在 + File privateKeyFile = new File(privateKeyPath); + File certFile = new File(certPath); + + assert privateKeyFile.exists() : "开发环境私钥文件不存在: " + privateKeyPath; + assert certFile.exists() : "开发环境证书文件不存在: " + certPath; + + System.out.println("✅ 开发环境证书文件验证通过"); + System.out.println(" - 私钥文件大小: " + privateKeyFile.length() + " bytes"); + System.out.println(" - 证书文件大小: " + certFile.length() + " bytes"); + } + + private void testProdEnvironmentCertificates() { + System.out.println("--- 生产环境证书路径测试 ---"); + System.out.println("生产环境将使用数据库配置的证书路径"); + System.out.println("证书路径格式: {uploadPath}/file/{relativePath}"); + System.out.println("✅ 生产环境配置逻辑正确"); + } + + @Test + public void testCertificatePathLogic() { + System.out.println("=== 证书路径逻辑测试 ==="); + + // 模拟不同环境的路径构建逻辑 + String uploadPath = "/www/wwwroot/file.ws/"; + String relativePath = "wechat/10550/apiclient_key.pem"; + + if ("dev".equals(activeProfile)) { + // 开发环境:使用固定的本地路径 + String devPath = "/Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10550/apiclient_key.pem"; + System.out.println("开发环境路径: " + devPath); + + File devFile = new File(devPath); + System.out.println("开发环境文件存在: " + devFile.exists()); + } else { + // 生产环境:使用数据库配置的路径 + String prodPath = uploadPath + "file/" + relativePath; + System.out.println("生产环境路径: " + prodPath); + System.out.println("生产环境路径构建逻辑正确"); + } + + System.out.println("=== 证书路径逻辑测试完成 ==="); + } + + @Test + public void testEnvironmentSwitching() { + System.out.println("=== 环境切换测试 ==="); + + // 测试环境判断逻辑 + System.out.println("当前环境: " + activeProfile); + + if ("dev".equals(activeProfile)) { + System.out.println("✅ 开发环境配置:"); + System.out.println(" - 使用本地固定证书路径"); + System.out.println(" - 路径: /Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10550/"); + System.out.println(" - 优点: 开发便利,无需配置数据库路径"); + } else if ("prod".equals(activeProfile)) { + System.out.println("✅ 生产环境配置:"); + System.out.println(" - 使用数据库存储的证书路径"); + System.out.println(" - 路径格式: {uploadPath}/file/{relativePath}"); + System.out.println(" - 优点: 灵活配置,支持多租户"); + } else { + System.out.println("⚠️ 未知环境: " + activeProfile); + System.out.println(" - 默认使用生产环境配置"); + } + + System.out.println("=== 环境切换测试完成 ==="); + } +}