256 lines
8.2 KiB
Markdown
256 lines
8.2 KiB
Markdown
# 支付配置修改说明
|
||
|
||
## 修改概述
|
||
|
||
根据要求,对支付配置进行了以下修改:
|
||
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"
|
||
```
|