# 微信小程序配置问题解决方案

## 🔍 问题分析

### 错误信息
```
生成二维码失败: 租户 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`配置即可。
