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})。
|
* <p>
|
* 配置源优先级:
|
* <ol>
|
* <li>{@code sys_config} 表 key = {@code wx.mp.config.<orgid>},值形如
|
* {@code {"appid":"xx","appSecret":"yy","address":"zz"}} —— 便于新机构不改代码接入;</li>
|
* <li>代码内 {@link WxGZHEnum} 枚举(保持原有配置源不变,行为与线上一致)。</li>
|
* </ol>
|
* 同时把「按 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<String, String> 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;
|
}
|
}
|
}
|