package com.smartor.message; import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.common.enums.WxGZHEnum; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.message.wechat.WechatMpConfig; import com.ruoyi.message.wechat.WechatMpConfigProvider; import com.ruoyi.system.service.ISysConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.Map; /** * 微信公众号机构级配置实现:收口原先散落在三个类里的 {@code WxGZHEnum.getDescByCode(orgid)} * 调用({@code RyTask} / {@code RedisMqReceiver} / {@code ServiceSubtaskServiceImpl})。 *

* 配置源优先级: *

    *
  1. {@code sys_config} 表 key = {@code wx.mp.config.},值形如 * {@code {"appid":"xx","appSecret":"yy","address":"zz"}} —— 便于新机构不改代码接入;
  2. *
  3. 代码内 {@link WxGZHEnum} 枚举(保持原有配置源不变,行为与线上一致)。
  4. *
* 同时把「按 List 下标取 appid/appSecret/address」这种脆弱写法改成了显式字段取值。 */ @Slf4j @Component public class WechatMpConfigProviderImpl implements WechatMpConfigProvider { /** * 机构级公众号配置的配置项 key 前缀 */ private static final String CONFIG_KEY_PREFIX = "wx.mp.config."; private final ISysConfigService configService; public WechatMpConfigProviderImpl(ISysConfigService configService) { this.configService = configService; } @Override public WechatMpConfig getConfig(String orgid) { if (StringUtils.isEmpty(orgid)) { return null; } //优先取数据库配置(支持新机构) WechatMpConfig fromDb = readFromDb(orgid); if (fromDb != null && fromDb.isComplete()) { return fromDb; } WechatMpConfig config = new WechatMpConfig(); config.setOrgid(orgid); for (WxGZHEnum item : WxGZHEnum.values()) { if (orgid.equals(item.getOrgid())) { config.setAppid(item.getAppid()); config.setAppSecret(item.getAppSecret()); config.setAddress(item.getAddress()); break; } } if (!config.isComplete()) { log.warn("【WechatMpConfigProviderImpl】机构 {} 的公众号配置不完整:{}", orgid, config); } return config; } private WechatMpConfig readFromDb(String orgid) { try { String value = configService.selectConfigByKey(CONFIG_KEY_PREFIX + orgid, orgid); if (StringUtils.isEmpty(value)) { return null; } Map map = new ObjectMapper().readValue(value, Map.class); WechatMpConfig config = new WechatMpConfig(); config.setOrgid(orgid); config.setAppid(map.get("appid")); config.setAppSecret(map.get("appSecret")); config.setAddress(map.get("address")); return config; } catch (Exception e) { log.warn("【WechatMpConfigProviderImpl】读取 {} 配置失败,orgid:{},err:{}", CONFIG_KEY_PREFIX + orgid, orgid, e.getMessage()); return null; } } }