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

256 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 支付配置修改说明
## 修改概述
根据要求,对支付配置进行了以下修改:
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<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使用示例
#### 检查数据库证书配置
```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"
```