小程序开发-服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

6.5 KiB

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

🔍 问题分析

错误信息

生成二维码失败: 租户 10550 的小程序未配置,请先在系统设置中配置微信小程序信息

问题根源

代码在SettingServiceImpl.getBySettingKeyIgnoreTenant方法中查找微信小程序配置时,使用以下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方法中添加了备用配置读取逻辑:

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. 新增配置读取方法

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查询检查你的配置:

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. 创建配置(如果不存在)

如果查询结果为空,需要创建配置:

-- 创建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. 更新配置值

如果配置存在但值不正确,更新配置:

-- 更新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. 运行测试

# 运行配置测试
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表格式

{
  "setting_key": "mp-weixin",
  "content": "{\"appId\":\"wx1234567890abcdef\",\"appSecret\":\"abcdef1234567890abcdef1234567890\"}",
  "tenant_id": 10550
}

cms_website_field表格式

-- AppID记录
name = 'AppID', value = 'wx1234567890abcdef', tenant_id = 10550

-- AppSecret记录  
name = 'AppSecret', value = 'abcdef1234567890abcdef1234567890', tenant_id = 10550

最终返回格式

{
  "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位字符串

验证清单

  • 修改SettingServiceImpl添加备用配置读取
  • 添加getWeixinConfigFromWebsiteField方法
  • 创建测试用例验证功能
  • 提供SQL脚本检查和创建配置
  • 在cms_website_field表中创建AppID配置
  • 在cms_website_field表中创建AppSecret配置
  • 重启应用程序测试
  • 验证二维码生成功能正常

🎉 总结

通过修改SettingServiceImpl,现在系统支持从两个地方读取微信小程序配置:

  1. 主要来源sys_setting表(原有方式)
  2. 备用来源cms_website_field表(新增支持)

当主要来源找不到配置时,系统会自动尝试从备用来源读取,这样就解决了你的配置问题,无需修改现有的cms_website_field表结构。

只需要确保在cms_website_field表中有正确的AppIDAppSecret配置即可。