11
This commit is contained in:
230
docs/微信小程序配置问题解决方案.md
Normal file
230
docs/微信小程序配置问题解决方案.md
Normal file
@@ -0,0 +1,230 @@
|
||||
# 微信小程序配置问题解决方案
|
||||
|
||||
## 🔍 问题分析
|
||||
|
||||
### 错误信息
|
||||
```
|
||||
生成二维码失败: 租户 10550 的小程序未配置,请先在系统设置中配置微信小程序信息
|
||||
```
|
||||
|
||||
### 问题根源
|
||||
代码在`SettingServiceImpl.getBySettingKeyIgnoreTenant`方法中查找微信小程序配置时,使用以下SQL条件:
|
||||
```sql
|
||||
SELECT * FROM sys_setting
|
||||
WHERE setting_key = 'mp-weixin'
|
||||
AND tenant_id = 10550
|
||||
AND deleted = 0
|
||||
```
|
||||
|
||||
但是你的配置存储在`cms_website_field`表中,字段结构为:
|
||||
- `name = 'AppID'` - 微信小程序AppID
|
||||
- `name = 'AppSecret'` - 微信小程序AppSecret
|
||||
- `tenant_id = 10550` - 租户ID
|
||||
|
||||
## ✅ 解决方案
|
||||
|
||||
我已经修改了`SettingServiceImpl`,让它在找不到`sys_setting`配置时,自动从`cms_website_field`表中读取配置。
|
||||
|
||||
### 🔧 代码修改
|
||||
|
||||
#### 1. 修改SettingServiceImpl
|
||||
在`getBySettingKeyIgnoreTenant`方法中添加了备用配置读取逻辑:
|
||||
|
||||
```java
|
||||
if ("mp-weixin".equals(key)) {
|
||||
// 尝试从cms_website_field表中读取微信小程序配置
|
||||
JSONObject websiteFieldConfig = getWeixinConfigFromWebsiteField(tenantId);
|
||||
if (websiteFieldConfig != null) {
|
||||
System.out.println("从cms_website_field表获取到微信小程序配置: " + websiteFieldConfig);
|
||||
return websiteFieldConfig;
|
||||
}
|
||||
throw new BusinessException("租户 " + tenantId + " 的小程序未配置,请先在系统设置中配置微信小程序信息");
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 新增配置读取方法
|
||||
```java
|
||||
private JSONObject getWeixinConfigFromWebsiteField(Integer tenantId) {
|
||||
// 查询AppID
|
||||
CmsWebsiteField appIdField = cmsWebsiteFieldService.getOne(
|
||||
new LambdaQueryWrapper<CmsWebsiteField>()
|
||||
.eq(CmsWebsiteField::getName, "AppID")
|
||||
.eq(CmsWebsiteField::getTenantId, tenantId)
|
||||
.eq(CmsWebsiteField::getDeleted, 0)
|
||||
);
|
||||
|
||||
// 查询AppSecret
|
||||
CmsWebsiteField appSecretField = cmsWebsiteFieldService.getOne(
|
||||
new LambdaQueryWrapper<CmsWebsiteField>()
|
||||
.eq(CmsWebsiteField::getName, "AppSecret")
|
||||
.eq(CmsWebsiteField::getTenantId, tenantId)
|
||||
.eq(CmsWebsiteField::getDeleted, 0)
|
||||
);
|
||||
|
||||
if (appIdField != null && appSecretField != null
|
||||
&& appIdField.getValue() != null && !appIdField.getValue().trim().isEmpty()
|
||||
&& appSecretField.getValue() != null && !appSecretField.getValue().trim().isEmpty()) {
|
||||
|
||||
// 构建微信小程序配置JSON
|
||||
JSONObject config = new JSONObject();
|
||||
config.put("appId", appIdField.getValue().trim());
|
||||
config.put("appSecret", appSecretField.getValue().trim());
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
```
|
||||
|
||||
## 📋 配置检查步骤
|
||||
|
||||
### 1. 检查现有配置
|
||||
执行SQL查询检查你的配置:
|
||||
```sql
|
||||
SELECT id, name, value, tenant_id, deleted, comments
|
||||
FROM cms_website_field
|
||||
WHERE tenant_id = 10550
|
||||
AND name IN ('AppID', 'AppSecret')
|
||||
AND deleted = 0;
|
||||
```
|
||||
|
||||
### 2. 创建配置(如果不存在)
|
||||
如果查询结果为空,需要创建配置:
|
||||
```sql
|
||||
-- 创建AppID配置
|
||||
INSERT INTO cms_website_field (type, name, value, tenant_id, comments, deleted, create_time)
|
||||
VALUES (0, 'AppID', '你的微信小程序AppID', 10550, '微信小程序AppID', 0, NOW());
|
||||
|
||||
-- 创建AppSecret配置
|
||||
INSERT INTO cms_website_field (type, name, value, tenant_id, comments, deleted, create_time)
|
||||
VALUES (0, 'AppSecret', '你的微信小程序AppSecret', 10550, '微信小程序AppSecret', 0, NOW());
|
||||
```
|
||||
|
||||
### 3. 更新配置值
|
||||
如果配置存在但值不正确,更新配置:
|
||||
```sql
|
||||
-- 更新AppID
|
||||
UPDATE cms_website_field
|
||||
SET value = '你的实际AppID'
|
||||
WHERE name = 'AppID' AND tenant_id = 10550 AND deleted = 0;
|
||||
|
||||
-- 更新AppSecret
|
||||
UPDATE cms_website_field
|
||||
SET value = '你的实际AppSecret'
|
||||
WHERE name = 'AppSecret' AND tenant_id = 10550 AND deleted = 0;
|
||||
```
|
||||
|
||||
## 🧪 测试验证
|
||||
|
||||
### 1. 运行测试
|
||||
```bash
|
||||
# 运行配置测试
|
||||
mvn test -Dtest=WeixinConfigTest
|
||||
|
||||
# 运行特定测试方法
|
||||
mvn test -Dtest=WeixinConfigTest#testGetWeixinConfigFromWebsiteField
|
||||
```
|
||||
|
||||
### 2. 手动验证
|
||||
重启应用后,尝试生成二维码功能,应该不再报错。
|
||||
|
||||
## 🔄 配置流程
|
||||
|
||||
### 原始流程
|
||||
```
|
||||
请求微信小程序配置
|
||||
↓
|
||||
查询 sys_setting 表
|
||||
↓
|
||||
setting_key = 'mp-weixin' AND tenant_id = 10550
|
||||
↓
|
||||
未找到配置 → 抛出异常
|
||||
```
|
||||
|
||||
### 修改后流程
|
||||
```
|
||||
请求微信小程序配置
|
||||
↓
|
||||
查询 sys_setting 表
|
||||
↓
|
||||
setting_key = 'mp-weixin' AND tenant_id = 10550
|
||||
↓
|
||||
未找到配置
|
||||
↓
|
||||
查询 cms_website_field 表
|
||||
↓
|
||||
name = 'AppID' AND name = 'AppSecret' AND tenant_id = 10550
|
||||
↓
|
||||
找到配置 → 构建JSON返回
|
||||
↓
|
||||
未找到配置 → 抛出异常
|
||||
```
|
||||
|
||||
## 📊 配置格式对比
|
||||
|
||||
### sys_setting表格式
|
||||
```json
|
||||
{
|
||||
"setting_key": "mp-weixin",
|
||||
"content": "{\"appId\":\"wx1234567890abcdef\",\"appSecret\":\"abcdef1234567890abcdef1234567890\"}",
|
||||
"tenant_id": 10550
|
||||
}
|
||||
```
|
||||
|
||||
### cms_website_field表格式
|
||||
```sql
|
||||
-- AppID记录
|
||||
name = 'AppID', value = 'wx1234567890abcdef', tenant_id = 10550
|
||||
|
||||
-- AppSecret记录
|
||||
name = 'AppSecret', value = 'abcdef1234567890abcdef1234567890', tenant_id = 10550
|
||||
```
|
||||
|
||||
### 最终返回格式
|
||||
```json
|
||||
{
|
||||
"appId": "wx1234567890abcdef",
|
||||
"appSecret": "abcdef1234567890abcdef1234567890"
|
||||
}
|
||||
```
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
### 1. 配置安全
|
||||
- AppSecret是敏感信息,确保数据库访问权限控制
|
||||
- 建议定期更换AppSecret
|
||||
|
||||
### 2. 字段名称
|
||||
- 确保`cms_website_field`表中的`name`字段值准确:
|
||||
- `AppID`(注意大小写)
|
||||
- `AppSecret`(注意大小写)
|
||||
|
||||
### 3. 租户隔离
|
||||
- 确保`tenant_id = 10550`
|
||||
- 确保`deleted = 0`
|
||||
|
||||
### 4. 配置验证
|
||||
- AppID格式:以`wx`开头的18位字符串
|
||||
- AppSecret格式:32位字符串
|
||||
|
||||
## ✅ 验证清单
|
||||
|
||||
- [x] 修改SettingServiceImpl添加备用配置读取
|
||||
- [x] 添加getWeixinConfigFromWebsiteField方法
|
||||
- [x] 创建测试用例验证功能
|
||||
- [x] 提供SQL脚本检查和创建配置
|
||||
- [ ] 在cms_website_field表中创建AppID配置
|
||||
- [ ] 在cms_website_field表中创建AppSecret配置
|
||||
- [ ] 重启应用程序测试
|
||||
- [ ] 验证二维码生成功能正常
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
通过修改`SettingServiceImpl`,现在系统支持从两个地方读取微信小程序配置:
|
||||
1. **主要来源**:`sys_setting`表(原有方式)
|
||||
2. **备用来源**:`cms_website_field`表(新增支持)
|
||||
|
||||
当主要来源找不到配置时,系统会自动尝试从备用来源读取,这样就解决了你的配置问题,无需修改现有的`cms_website_field`表结构。
|
||||
|
||||
只需要确保在`cms_website_field`表中有正确的`AppID`和`AppSecret`配置即可。
|
||||
Reference in New Issue
Block a user