Merge branch 'feature/REQ-3541'

This commit is contained in:
yanglin 2025-02-20 13:33:32 +08:00
commit bf1b27af1f
11 changed files with 145 additions and 27 deletions

View File

@ -12,6 +12,8 @@ import lombok.RequiredArgsConstructor;
public enum MnsChannel { public enum MnsChannel {
// 政务: 高新渠道. 政府渠道, 请勿随意使用 // 政务: 高新渠道. 政府渠道, 请勿随意使用
REGULATORY_GAOXIN("regulatory_gaoxin"), REGULATORY_GAOXIN("regulatory_gaoxin"),
// 政务: 龙泉渠道. 政府渠道, 请勿随意使用
REGULATORY_LONGQUAN("regulatory_longquan"),
// 阿里云 (当前默认) // 阿里云 (当前默认)
ALIYUN("aliyun") ALIYUN("aliyun")
; ;

View File

@ -22,7 +22,8 @@ public enum ChannelHandlerEnum implements EnumBase<String> {
CHUANG_LAN("chuanglan", "chuangLanSmsSendManager", "创蓝"), CHUANG_LAN("chuanglan", "chuangLanSmsSendManager", "创蓝"),
SUB_MAIL("sub_mail", "subMailSmsSendManager", "赛邮"), SUB_MAIL("sub_mail", "subMailSmsSendManager", "赛邮"),
LIAN_LU("lian_lu", "lianLuSmsSendManager", "联麓"), LIAN_LU("lian_lu", "lianLuSmsSendManager", "联麓"),
REGULATORY_GAOXIN("regulatory_gaoxin", "regulatoryGaoxinManager", "监管机构: 高新") REGULATORY_GAOXIN("regulatory_gaoxin", "regulatoryGaoxinManager", "监管机构: 高新"),
REGULATORY_LONGQUAN("regulatory_longquan", "regulatoryLongquanManager", "监管机构: 龙泉")
; ;
private final String code; private final String code;

View File

@ -21,7 +21,8 @@ public enum MessageChannelEnum implements EnumBase<String> {
CHUANG_LAN("chuanglan", "创蓝云智"), CHUANG_LAN("chuanglan", "创蓝云智"),
SUB_MAIL("sub_mail", "赛邮"), SUB_MAIL("sub_mail", "赛邮"),
LIAN_LU("lian_lu", "联麓"), LIAN_LU("lian_lu", "联麓"),
REGULATORY_GAOXIN("regulatory_gaoxin", "监管机构: 高新") REGULATORY_GAOXIN("regulatory_gaoxin", "监管机构: 高新"),
REGULATORY_LONGQUAN("regulatory_longquan", "监管机构: 龙泉"),
; ;
private final String code; private final String code;

View File

@ -54,10 +54,6 @@ public class MessageSendRequestDto {
* 短信模版 * 短信模版
*/ */
private MNSMessageTemplate template; private MNSMessageTemplate template;
/**
* 渠道模版信息
*/
private MNSChannelMessageTemplate channelTemplate;
/** /**
* 原始请求 * 原始请求

View File

@ -65,7 +65,7 @@ public class MessageChannelRouteImpl implements MessageChannelRouter {
final Set<String> pickChannelCodes = new HashSet<>(mappedChannelCodes); final Set<String> pickChannelCodes = new HashSet<>(mappedChannelCodes);
// 解析入参是否指定了渠道 // 解析入参是否指定了渠道
String specifyChannelCode = parseCondition(condition); String specifyChannelCode = parseCondition(condition);
if (pickChannelCodes.contains(specifyChannelCode)) { if (StringUtils.isNotBlank(specifyChannelCode)) {
// 指定的渠道编码在映射关系中, 优先使用该渠道 // 指定的渠道编码在映射关系中, 优先使用该渠道
pickChannelCodes.clear(); pickChannelCodes.clear();
pickChannelCodes.add(specifyChannelCode); pickChannelCodes.add(specifyChannelCode);

View File

@ -51,13 +51,7 @@ public class MessageTemplateManagerImpl implements MessageTemplateManager {
@Override @Override
public MNSChannelMessageTemplate queryChannelTemplate(String innerTemplateNo, String channelCode) { public MNSChannelMessageTemplate queryChannelTemplate(String innerTemplateNo, String channelCode) {
MNSChannelMessageTemplate channelMessageTemplate = mnsChannelMessageTemplateDao return mnsChannelMessageTemplateDao.queryByTemplateNo(innerTemplateNo, channelCode);
.queryByTemplateNo(innerTemplateNo, channelCode);
BizException.error(channelMessageTemplate != null, ReturnCodeEnum.MESSAGE_TEMPLATE_NOT_EXIST);
BizException
.error(AvailableStatusEnum.AVAILABLE.getStatus().equals(channelMessageTemplate.getStatus()),
ReturnCodeEnum.MESSAGE_TEMPLATE_NOT_VALID);
return channelMessageTemplate;
} }
@Override @Override

View File

@ -8,13 +8,12 @@ import cn.axzo.msg.center.notices.manager.api.dto.request.MessageSendRequestDto;
import cn.axzo.msg.center.notices.manager.api.dto.response.BatchMessageSendResponseDto; import cn.axzo.msg.center.notices.manager.api.dto.response.BatchMessageSendResponseDto;
import cn.axzo.msg.center.notices.manager.api.dto.response.SendSmsCommonResponseDto; import cn.axzo.msg.center.notices.manager.api.dto.response.SendSmsCommonResponseDto;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
* 政务系统 * 政务: 高新
* *
* @author yanglin * @author yanglin
*/ */
@ -23,19 +22,12 @@ import org.springframework.stereotype.Service;
@Service("regulatoryGaoxinManager") @Service("regulatoryGaoxinManager")
public class RegulatoryGaoxinManager implements SmsSendManager { public class RegulatoryGaoxinManager implements SmsSendManager {
private static final String USE_CHANNEL_CONTENT = "use_channel_content";
private final RegulatoryGaoxinClient regulatoryGaoxinClient; private final RegulatoryGaoxinClient regulatoryGaoxinClient;
@Override @Override
public SendSmsCommonResponseDto sendMessage(MessageSendRequestDto request) { public SendSmsCommonResponseDto sendMessage(MessageSendRequestDto request) {
log.info("[RegulatoryGaoxinManager#sendMessage] -> 政务高新 - 发送sms {}", JSON.toJSONString(request)); log.info("[RegulatoryGaoxinManager#sendMessage] -> 政务高新 - 发送sms {}", JSON.toJSONString(request));
JSONObject expansion = request.getRequest().parseExpansion(); String templateContent = request.getTemplate().getTemplateContent();
Boolean useChannelContent = expansion.getBoolean(USE_CHANNEL_CONTENT);
if (useChannelContent == null) useChannelContent = false;
String templateContent = useChannelContent
? request.getChannelTemplate().getTemplateContent()
: request.getTemplate().getTemplateContent();
String content = PlaceholderResolver.getDefaultResolver().resolveByMap( String content = PlaceholderResolver.getDefaultResolver().resolveByMap(
templateContent, request.getTemplateMap()); templateContent, request.getTemplateMap());
String respStr = regulatoryGaoxinClient.send(request.getPhoneNo(), content); String respStr = regulatoryGaoxinClient.send(request.getPhoneNo(), content);

View File

@ -0,0 +1,125 @@
package cn.axzo.msg.center.notices.manager;
import cn.axzo.basics.common.exception.ServiceException;
import cn.axzo.msg.center.common.utils.PlaceholderResolver;
import cn.axzo.msg.center.notices.manager.api.SmsSendManager;
import cn.axzo.msg.center.notices.manager.api.dto.request.BatchMessageSendRequestDto;
import cn.axzo.msg.center.notices.manager.api.dto.request.MessageSendRequestDto;
import cn.axzo.msg.center.notices.manager.api.dto.response.BatchMessageSendResponseDto;
import cn.axzo.msg.center.notices.manager.api.dto.response.SendSmsCommonResponseDto;
import cn.hutool.crypto.digest.DigestUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import com.aliyun.oss.common.utils.HttpUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.function.BiConsumer;
/**
* 政务: 龙泉
*
* @author yanglin
*/
@Slf4j
@RefreshScope
@RequiredArgsConstructor
@Service("regulatoryLongquanManager")
public class RegulatoryLongquanManager implements SmsSendManager {
private static final String URI = "http://182.151.56.200:9998/http/send";
private final OkHttpClient client = new OkHttpClient();
@Value("${regulatory.longquan.appId:xliKSXxnAj3Oge2pw5rlsEsKAsD1a2fk}")
private String appId;
@Value("${regulatory.longquan.appKey:OgAEa9bFPJJc2XNLlVJCXlGvL5jDHdZb}")
private String appKey;
@Value("${regulatory.longquan.signName:【龙泉驿区住建局】}")
private String signName;
@Override
public SendSmsCommonResponseDto sendMessage(MessageSendRequestDto request) {
try {
log.info("[RegulatoryLongquanManager#sendMessage] -> 政务龙泉 - 发送sms {}", JSON.toJSONString(request));
return sendImpl(request);
} catch (Exception e) {
log.warn("[RegulatoryLongquanManager#sendMessage] -> 政务龙泉 - 发送sms失败 {}", JSON.toJSONString(request), e);
throw new RuntimeException(e);
}
}
private SendSmsCommonResponseDto sendImpl(MessageSendRequestDto mnsRequest) throws Exception {
String templateContent = mnsRequest.getTemplate().getTemplateContent();
String content = PlaceholderResolver.getDefaultResolver().resolveByMap(
templateContent, mnsRequest.getTemplateMap());
String encodedMsg = HttpUtil.urlEncode(signName + content, "UTF-8");
String md5Sign = DigestUtil.md5Hex(appId + mnsRequest.getPhoneNo() + encodedMsg + appKey);
FormBody.Builder formBuilder = new FormBody.Builder();
HashMap<String, Object> formParams = new HashMap<>();
BiConsumer<String, String> formPopulator= (key, value) -> {
formBuilder.add(key, value);
formParams.put(key, value);
};
formPopulator.accept("appid", appId);
formPopulator.accept("mobile", mnsRequest.getPhoneNo());
formPopulator.accept("msg", encodedMsg);
formPopulator.accept("sign", md5Sign);
Request httpRequest = new Request.Builder()
.url(URI)
.post(formBuilder.build())
.build();
log.info("[RegulatoryLongquanManager#sendMessage] -> 政务龙泉 - 发送sms请求, formBody={}",
JSON.toJSONString(formParams));
LongquanResponse longquanResult = null;
try (Response httpResponse = client.newCall(httpRequest).execute()) {
ResponseBody body = httpResponse.body();
if (body != null)
longquanResult = JSON.parseObject(body.string(), LongquanResponse.class);
log.info("[RegulatoryLongquanManager#sendMessage] -> 政务龙泉 - formBody: {}, 发送sms结果: {}",
JSON.toJSONString(formParams), longquanResult);
}
if (longquanResult != null && !longquanResult.isSuccess())
throw new ServiceException(String.format("政务龙泉 - 发送sms失败 %s. mnsRequest=%s, formBody=%s",
longquanResult, JSON.toJSONString(mnsRequest), JSON.toJSONString(formParams)));
SendSmsCommonResponseDto result = new SendSmsCommonResponseDto();
if (longquanResult != null)
result.setBizId(longquanResult.getTaskId());
result.setRequestId(md5Sign);
result.setMessage(longquanResult == null ? "" : longquanResult.getResultMsg());
return result;
}
@Override
public BatchMessageSendResponseDto sendBatchMessage(BatchMessageSendRequestDto requestDto) {
throw new UnsupportedOperationException("sendBatchMessage");
}
@Setter
@Getter
private static class LongquanResponse {
private int resultCode;
private String resultMsg;
@JSONField(name = "taskid")
private String taskId;
public boolean isSuccess() {
return resultCode == 0;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
}

View File

@ -170,12 +170,13 @@ public class MessageServiceImpl implements MessageService, EnvironmentAware {
dto.setChannelCode(message.getChannelCode()); dto.setChannelCode(message.getChannelCode());
dto.setPhoneNo(message.getTargetAddress()); dto.setPhoneNo(message.getTargetAddress());
dto.setInnerTemplateNo(messageTemplate.getTemplateNo()); dto.setInnerTemplateNo(messageTemplate.getTemplateNo());
if (channelTemplate != null) {
dto.setTemplateNo(channelTemplate.getTemplateNo()); dto.setTemplateNo(channelTemplate.getTemplateNo());
}
dto.setTemplateMap(request.getParams()); dto.setTemplateMap(request.getParams());
dto.setAppRequestNo(message.getRequestNo()); dto.setAppRequestNo(message.getRequestNo());
dto.setRequestChannelNo(message.getMessageOrderNo()); dto.setRequestChannelNo(message.getMessageOrderNo());
dto.setTemplate(messageTemplate); dto.setTemplate(messageTemplate);
dto.setChannelTemplate(channelTemplate);
dto.setRequest(request); dto.setRequest(request);
SendSmsCommonResponseDto response = smsSendManagerComposite.sendMessage(dto); SendSmsCommonResponseDto response = smsSendManagerComposite.sendMessage(dto);
messageManager.updateToProcessing(response.getBizId(), response.getRequestId(), message.getId()); messageManager.updateToProcessing(response.getBizId(), response.getRequestId(), message.getId());

View File

@ -69,7 +69,7 @@ public class SmsManager extends BaseManager implements SmsGateway {
*/ */
public int sendSmsCode(SendCodeV2Req req) { public int sendSmsCode(SendCodeV2Req req) {
sendMnsCode(req.getPhone(), req.getParam(), req.getAppCode(),req.getTemplateNo(), req.getCode(), req.getExpansion()); sendMnsCode(req.getPhone(), req.getParam(), req.getAppCode(),req.getTemplateNo(), req.getCode(), req.getExpansion());
log.info("发送验证码 手机号{} -- 参数 {} -- 应用程序code {} -- 模板编号templateCode {}", req.getPhone(), req.getParam(), req.getAppCode(),req.getTemplateNo()); log.info("发送验证码, request={}", req);
return req.getCode(); return req.getCode();
} }

View File

@ -1,6 +1,7 @@
package cn.axzo.msg.center.notices.service.request; package cn.axzo.msg.center.notices.service.request;
import cn.axzo.msg.center.api.request.ExpansionInfo; import cn.axzo.msg.center.api.request.ExpansionInfo;
import com.alibaba.fastjson.JSON;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -32,4 +33,9 @@ public class SendCodeV2Req extends ExpansionInfo {
private String appCode; private String appCode;
@NotBlank(message = "templateNo参数不参为空") @NotBlank(message = "templateNo参数不参为空")
private String templateNo; private String templateNo;
@Override
public String toString() {
return JSON.toJSONString(this);
}
} }