# 支付配置修改说明 ## 修改概述 根据要求,对支付配置进行了以下修改: 1. 注释掉从缓存获取支付配置的代码(测试期间) 2. 确保微信支付和支付宝证书路径打印完整的绝对路径 ## 修改的文件 ### 1. WxNativePayController.java **文件路径**: `src/main/java/com/gxwebsoft/common/system/controller/WxNativePayController.java` **主要修改**: - 注释掉从Redis缓存获取微信支付配置的代码 - 添加测试模式,当payment为null时使用测试配置 - 增强证书路径打印,显示完整的绝对路径 - 区分classpath模式和文件系统模式的路径处理 **关键代码**: ```java // 测试期间注释掉从缓存获取支付配置 // final Payment payment = redisUtil.get(key, Payment.class); // log.debug("从缓存获取支付配置: {}", payment); // 测试期间直接从数据库获取支付配置 final Payment payment = null; // 暂时设为null,强制从数据库获取 log.debug("测试模式:不从缓存获取支付配置,payment设为null"); ``` ### 2. AlipayConfigUtil.java **文件路径**: `src/main/java/com/gxwebsoft/common/core/utils/AlipayConfigUtil.java` **主要修改**: - 注释掉从Redis缓存获取支付宝配置的代码 - 增强支付宝证书路径打印,显示完整的绝对路径 - 添加classpath和文件系统模式的路径处理 **关键代码**: ```java // 测试期间注释掉从缓存获取支付配置 // String cache = stringRedisTemplate.opsForValue().get(key); // if (cache == null) { // throw new BusinessException("支付方式未配置"); // } // 测试期间:模拟缓存为空的情况 String cache = null; log.debug("测试模式:支付宝配置缓存设为null"); ``` ### 3. CertificateService.java **文件路径**: `src/main/java/com/gxwebsoft/common/core/service/CertificateService.java` **主要修改**: - 增强`getWechatPayCertPath()`方法,添加完整绝对路径打印 - 增强`getAlipayCertPath()`方法,添加完整绝对路径打印 - 区分classpath模式和文件系统模式的路径处理 **关键功能**: ```java // 打印完整的绝对路径信息 if (certificateProperties.isClasspathMode()) { log.info("微信支付证书路径模式: CLASSPATH"); log.info("微信支付证书相对路径: {}", certPath); try { ClassPathResource resource = new ClassPathResource(certPath); if (resource.exists()) { String absolutePath = resource.getFile().getAbsolutePath(); log.info("微信支付证书完整绝对路径: {}", absolutePath); } } catch (Exception e) { log.warn("无法获取微信支付证书绝对路径: {}", e.getMessage()); } } else { java.io.File file = new java.io.File(certPath); String absolutePath = file.getAbsolutePath(); log.info("微信支付证书路径模式: FILESYSTEM"); log.info("微信支付证书完整绝对路径: {}", absolutePath); log.info("微信支付证书文件是否存在: {}", file.exists()); } ``` ### 4. PaymentConfigTest.java (新增) **文件路径**: `src/test/java/com/gxwebsoft/common/core/PaymentConfigTest.java` **功能**: - 测试微信支付证书路径获取 - 测试支付宝证书路径获取 - 测试证书配置属性 - 验证修改后的功能是否正常工作 ## 测试验证 ### 运行测试 ```bash mvn test -Dtest=PaymentConfigTest ``` ### 预期日志输出 运行测试后,应该能看到以下类型的日志: 1. **微信支付证书路径**: ``` 微信支付证书路径模式: CLASSPATH 微信支付证书相对路径: certs/dev/wechat/apiclient_key.pem 微信支付证书完整绝对路径: /Users/xxx/project/target/classes/certs/dev/wechat/apiclient_key.pem ``` 2. **支付宝证书路径**: ``` 支付宝证书路径模式: CLASSPATH 支付宝证书相对路径: certs/dev/alipay/appCertPublicKey.crt 支付宝证书完整绝对路径: /Users/xxx/project/target/classes/certs/dev/alipay/appCertPublicKey.crt ``` 3. **缓存注释确认**: ``` 测试模式:不从缓存获取支付配置,payment设为null 测试模式:支付宝配置缓存设为null ``` ## 注意事项 1. **测试期间**: 当前修改是为了测试目的,缓存获取被注释掉 2. **生产环境**: 在生产环境部署前,需要恢复缓存获取功能 3. **证书文件**: 确保证书文件存在于配置的路径中 4. **日志级别**: 建议将日志级别设置为INFO或DEBUG以查看详细的路径信息 ## 恢复缓存功能 测试完成后,如需恢复缓存功能,请: 1. 取消注释缓存获取代码 2. 注释掉测试模式的代码 3. 重新部署应用 ### 5. CertificateHealthService.java (新增功能) **文件路径**: `src/main/java/com/gxwebsoft/common/core/service/CertificateHealthService.java` **主要修改**: - 添加了从数据库读取支付配置证书路径的功能 - 新增`checkDatabaseCertificates()`方法 - 增强证书健康检查,包含数据库配置检查 - 打印数据库中证书的完整绝对路径 **关键功能**: ```java /** * 检查数据库中存储的证书路径 */ public Map checkDatabaseCertificates() { // 查询微信支付配置 List wechatPayments = paymentService.list( new LambdaQueryWrapper() .eq(Payment::getCode, "wxPay") .eq(Payment::getStatus, true) .eq(Payment::getTenantId, tenantId) ); // 检查证书路径并打印完整绝对路径 String keyPath = getAbsoluteCertPath(apiclientKey); boolean keyExists = new File(keyPath).exists(); log.info("微信支付私钥证书 - 相对路径: {}, 绝对路径: {}, 存在: {}", apiclientKey, keyPath, keyExists); } ``` ### 6. CertificateController.java (新增API) **文件路径**: `src/main/java/com/gxwebsoft/common/core/controller/CertificateController.java` **新增API**: - `GET /api/system/certificate/database-check`: 检查数据库证书配置 ### 7. PaymentConfigTest.java (更新测试) **文件路径**: `src/test/java/com/gxwebsoft/common/core/PaymentConfigTest.java` **新增测试**: - `testDatabaseCertificateCheck()`: 测试数据库证书配置检查 - `testCertificateHealthCheck()`: 测试完整证书健康检查 ## 新增功能说明 ### 数据库证书路径检查 现在证书健康检查功能会: 1. **从数据库读取支付配置**: 查询`sys_payment`表中的微信支付配置 2. **检查证书路径**: 验证数据库中存储的证书文件路径 3. **打印完整绝对路径**: 显示证书文件的完整绝对路径 4. **验证文件存在性**: 检查证书文件是否真实存在 ### API使用示例 #### 检查数据库证书配置 ```bash GET /api/system/certificate/database-check ``` **响应示例**: ```json { "code": 0, "message": "数据库证书检查完成", "data": { "healthy": true, "certificates": { "wechatPay": { "privateKey": { "relativePath": "/20230622/fb193d3bfff0467b83dc498435a4f433.pem", "absolutePath": "/Users/gxwebsoft/Documents/uploads/file/20230622/fb193d3bfff0467b83dc498435a4f433.pem", "exists": true }, "certificate": { "relativePath": "/20230622/23329e924dae41af9b716825626dd44b.pem", "absolutePath": "/Users/gxwebsoft/Documents/uploads/file/20230622/23329e924dae41af9b716825626dd44b.pem", "exists": true }, "merchantId": "1246610101", "serialNumber": "2903B872D5CA36E525FAEC37AEDB22E54ECDE7B7", "apiV3Key": "已配置" }, "alipay": { "status": "未找到支付宝配置" } } } } ``` #### 完整健康检查 ```bash GET /api/system/certificate/health ``` 现在会包含三个部分的检查: - `wechatPay`: 配置文件中的微信支付证书 - `alipay`: 配置文件中的支付宝证书 - `databaseCertificates`: 数据库中的证书配置 ## 配置文件 确保`application.yml`中的证书配置正确: ```yaml certificate: load-mode: CLASSPATH dev-cert-path: certs/dev wechat-pay: dev: api-v3-key: "your-api-v3-key" private-key-file: "apiclient_key.pem" cert-dir: "wechat" alipay: cert-dir: "alipay" app-cert-public-key-file: "appCertPublicKey.crt" alipay-cert-public-key-file: "alipayCertPublicKey.crt" alipay-root-cert-file: "alipayRootCert.crt" ```