Files
core/docs/PAYMENT_CONFIG_CHANGES.md
2025-07-28 10:15:56 +08:00

8.2 KiB
Raw Permalink Blame History

支付配置修改说明

修改概述

根据要求,对支付配置进行了以下修改:

  1. 注释掉从缓存获取支付配置的代码(测试期间)
  2. 确保微信支付和支付宝证书路径打印完整的绝对路径

修改的文件

1. WxNativePayController.java

文件路径: src/main/java/com/gxwebsoft/common/system/controller/WxNativePayController.java

主要修改:

  • 注释掉从Redis缓存获取微信支付配置的代码
  • 添加测试模式当payment为null时使用测试配置
  • 增强证书路径打印,显示完整的绝对路径
  • 区分classpath模式和文件系统模式的路径处理

关键代码:

// 测试期间注释掉从缓存获取支付配置
// 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和文件系统模式的路径处理

关键代码:

// 测试期间注释掉从缓存获取支付配置
// 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模式和文件系统模式的路径处理

关键功能:

// 打印完整的绝对路径信息
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

功能:

  • 测试微信支付证书路径获取
  • 测试支付宝证书路径获取
  • 测试证书配置属性
  • 验证修改后的功能是否正常工作

测试验证

运行测试

mvn test -Dtest=PaymentConfigTest

预期日志输出

运行测试后,应该能看到以下类型的日志:

  1. 微信支付证书路径:
微信支付证书路径模式: CLASSPATH
微信支付证书相对路径: certs/dev/wechat/apiclient_key.pem
微信支付证书完整绝对路径: /Users/xxx/project/target/classes/certs/dev/wechat/apiclient_key.pem
  1. 支付宝证书路径:
支付宝证书路径模式: CLASSPATH
支付宝证书相对路径: certs/dev/alipay/appCertPublicKey.crt
支付宝证书完整绝对路径: /Users/xxx/project/target/classes/certs/dev/alipay/appCertPublicKey.crt
  1. 缓存注释确认:
测试模式不从缓存获取支付配置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()方法
  • 增强证书健康检查,包含数据库配置检查
  • 打印数据库中证书的完整绝对路径

关键功能:

/**
 * 检查数据库中存储的证书路径
 */
public Map<String, Object> checkDatabaseCertificates() {
    // 查询微信支付配置
    List<Payment> wechatPayments = paymentService.list(
        new LambdaQueryWrapper<Payment>()
            .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使用示例

检查数据库证书配置

GET /api/system/certificate/database-check

响应示例:

{
  "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": "未找到支付宝配置"
      }
    }
  }
}

完整健康检查

GET /api/system/certificate/health

现在会包含三个部分的检查:

  • wechatPay: 配置文件中的微信支付证书
  • alipay: 配置文件中的支付宝证书
  • databaseCertificates: 数据库中的证书配置

配置文件

确保application.yml中的证书配置正确:

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"