Files
java-10561/docs/WECHAT_PAY_PUBLIC_KEY_CONFIG.md
2025-09-06 11:58:18 +08:00

199 lines
5.1 KiB
Markdown
Raw Permalink 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. 获取公钥文件
从微信商户平台下载或获取以下文件:
- 微信支付平台公钥文件(通常以 `.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按照本指南配置后系统会自动使用更稳定的公钥模式。