199 lines
5.1 KiB
Markdown
199 lines
5.1 KiB
Markdown
# 微信支付公钥模式配置指南
|
||
|
||
## 概述
|
||
|
||
如果您的后台系统使用了微信支付公钥模式,系统现在支持自动检测并优先使用公钥配置。这种模式比自动证书配置更稳定,不依赖网络下载平台证书。
|
||
|
||
## 配置步骤
|
||
|
||
### 1. 获取公钥文件
|
||
|
||
从微信商户平台下载或获取以下文件:
|
||
- 微信支付平台公钥文件(通常以 `.pem` 结尾)
|
||
- 公钥ID(一个字符串标识符)
|
||
|
||
### 2. 放置公钥文件
|
||
|
||
将公钥文件放置到对应租户的证书目录:
|
||
|
||
```
|
||
src/main/resources/dev/wechat/{tenantId}/
|
||
├── apiclient_key.pem # 商户私钥(必需)
|
||
├── apiclient_cert.pem # 商户证书(可选)
|
||
└── wechatpay_public_key.pem # 微信支付平台公钥(新增)
|
||
```
|
||
|
||
例如,租户ID为10547的目录结构:
|
||
```
|
||
src/main/resources/dev/wechat/10547/
|
||
├── apiclient_key.pem
|
||
├── apiclient_cert.pem
|
||
└── wechatpay_public_key.pem
|
||
```
|
||
|
||
### 3. 数据库配置
|
||
|
||
在 `sys_payment` 表中配置公钥相关字段:
|
||
|
||
```sql
|
||
UPDATE sys_payment SET
|
||
pub_key = 'wechatpay_public_key.pem',
|
||
pub_key_id = 'YOUR_PUBLIC_KEY_ID'
|
||
WHERE tenant_id = 10547 AND type = 0;
|
||
```
|
||
|
||
**字段说明**:
|
||
- `pub_key`: 公钥文件名
|
||
- `pub_key_id`: 微信支付平台提供的公钥ID
|
||
|
||
### 4. 验证配置
|
||
|
||
运行测试来验证配置是否正确:
|
||
|
||
```bash
|
||
# 运行公钥配置测试
|
||
mvn test -Dtest=WechatPayPublicKeyTest#testPublicKeyConfiguration
|
||
```
|
||
|
||
## 配置优先级
|
||
|
||
系统会按以下优先级选择配置方式:
|
||
|
||
1. **RSA公钥配置**(最高优先级)
|
||
- 条件:数据库中配置了 `pub_key` 和 `pub_key_id`
|
||
- 优势:稳定、不依赖网络、配置简单
|
||
|
||
2. **RSA自动证书配置**
|
||
- 条件:公钥配置不可用时
|
||
- 优势:自动管理平台证书
|
||
- 劣势:依赖网络连接和商户平台API安全设置
|
||
|
||
3. **RSA手动证书配置**(回退方案)
|
||
- 条件:自动配置失败时
|
||
- 需要:商户证书文件
|
||
|
||
## 示例配置
|
||
|
||
### 开发环境示例
|
||
|
||
**目录结构**:
|
||
```
|
||
src/main/resources/dev/wechat/10547/
|
||
├── apiclient_key.pem
|
||
├── apiclient_cert.pem
|
||
└── wechatpay_public_key.pem
|
||
```
|
||
|
||
**数据库配置**:
|
||
```sql
|
||
-- 查看当前配置
|
||
SELECT id, tenant_id, mch_id, app_id, merchant_serial_number,
|
||
pub_key, pub_key_id, api_key
|
||
FROM sys_payment
|
||
WHERE tenant_id = 10547 AND type = 0;
|
||
|
||
-- 更新公钥配置
|
||
UPDATE sys_payment SET
|
||
pub_key = 'wechatpay_public_key.pem',
|
||
pub_key_id = 'PUB_KEY_ID_0112422897022025011300326200001208'
|
||
WHERE tenant_id = 10547 AND type = 0;
|
||
```
|
||
|
||
### 生产环境示例
|
||
|
||
**证书文件路径**:
|
||
```
|
||
/www/wwwroot/file.ws/file/wechat/10547/
|
||
├── apiclient_key.pem
|
||
├── apiclient_cert.pem
|
||
└── wechatpay_public_key.pem
|
||
```
|
||
|
||
**数据库配置**:
|
||
```sql
|
||
UPDATE sys_payment SET
|
||
apiclient_key = '/wechat/10547/apiclient_key.pem',
|
||
apiclient_cert = '/wechat/10547/apiclient_cert.pem',
|
||
pub_key = '/wechat/10547/wechatpay_public_key.pem',
|
||
pub_key_id = 'PUB_KEY_ID_0112422897022025011300326200001208'
|
||
WHERE tenant_id = 10547 AND type = 0;
|
||
```
|
||
|
||
## 日志输出
|
||
|
||
配置成功后,您会在日志中看到:
|
||
|
||
```
|
||
=== 检测到公钥配置,使用RSA公钥模式 ===
|
||
公钥文件: wechatpay_public_key.pem
|
||
公钥ID: PUB_KEY_ID_0112422897022025011300326200001208
|
||
公钥文件路径: /path/to/wechatpay_public_key.pem
|
||
✅ 开发环境RSA公钥配置成功
|
||
```
|
||
|
||
如果没有公钥配置,系统会尝试自动证书配置:
|
||
|
||
```
|
||
=== 尝试创建自动证书配置 ===
|
||
商户号: 1723321338
|
||
私钥路径: /path/to/apiclient_key.pem
|
||
序列号: 2B933F7C35014A1C363642623E4A62364B34C4EB
|
||
API密钥长度: 32
|
||
```
|
||
|
||
## 故障排除
|
||
|
||
### 1. 公钥文件不存在
|
||
|
||
**错误信息**:
|
||
```
|
||
❌ 公钥文件不存在: dev/wechat/10547/wechatpay_public_key.pem
|
||
```
|
||
|
||
**解决方案**:
|
||
- 检查文件路径是否正确
|
||
- 确认文件已放置在正确位置
|
||
- 验证文件名与数据库配置一致
|
||
|
||
### 2. 公钥ID错误
|
||
|
||
**错误信息**:
|
||
```
|
||
❌ RSA公钥配置失败: Invalid public key ID
|
||
```
|
||
|
||
**解决方案**:
|
||
- 检查公钥ID是否正确
|
||
- 确认公钥ID与公钥文件匹配
|
||
- 联系微信支付技术支持获取正确的公钥ID
|
||
|
||
### 3. 数据库配置缺失
|
||
|
||
**现象**:系统跳过公钥配置,直接尝试自动证书配置
|
||
|
||
**解决方案**:
|
||
```sql
|
||
-- 检查当前配置
|
||
SELECT pub_key, pub_key_id FROM sys_payment WHERE tenant_id = 10547 AND type = 0;
|
||
|
||
-- 如果字段为空,进行配置
|
||
UPDATE sys_payment SET
|
||
pub_key = 'wechatpay_public_key.pem',
|
||
pub_key_id = 'YOUR_PUBLIC_KEY_ID'
|
||
WHERE tenant_id = 10547 AND type = 0;
|
||
```
|
||
|
||
## 优势对比
|
||
|
||
| 配置方式 | 稳定性 | 网络依赖 | 配置复杂度 | 推荐度 |
|
||
|---------|--------|----------|------------|--------|
|
||
| RSA公钥配置 | 高 | 无 | 低 | ⭐⭐⭐⭐⭐ |
|
||
| RSA自动证书配置 | 中 | 高 | 低 | ⭐⭐⭐ |
|
||
| RSA手动证书配置 | 中 | 无 | 高 | ⭐⭐ |
|
||
|
||
## 总结
|
||
|
||
使用公钥模式可以有效避免 `X509Certificate.getSerialNumber() null` 错误,因为它不依赖自动下载平台证书。建议优先使用此配置方式。
|
||
|
||
如果您已经有公钥文件和公钥ID,按照本指南配置后,系统会自动使用更稳定的公钥模式。
|