# 微信小程序配置问题解决方案 ## 🔍 问题分析 ### 错误信息 ``` 生成二维码失败: 租户 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() .eq(CmsWebsiteField::getName, "AppID") .eq(CmsWebsiteField::getTenantId, tenantId) .eq(CmsWebsiteField::getDeleted, 0) ); // 查询AppSecret CmsWebsiteField appSecretField = cmsWebsiteFieldService.getOne( new LambdaQueryWrapper() .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`配置即可。