From b60807fd8bdbc1e5f7c772a036b17d4c63ead530 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 8 Jan 2025 17:16:39 +0800 Subject: [PATCH] =?UTF-8?q?REQ-3541:=20=E6=B7=BB=E5=8A=A0=E6=B8=A0?= =?UTF-8?q?=E9=81=93-=E9=BE=99=E6=B3=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../msg/center/service/enums/MnsChannel.java | 2 + .../common/enums/ChannelHandlerEnum.java | 3 +- .../common/enums/MessageChannelEnum.java | 3 +- .../dto/request/MessageSendRequestDto.java | 4 - .../manager/MessageChannelRouteImpl.java | 2 +- .../manager/MessageTemplateManagerImpl.java | 8 +- .../manager/RegulatoryGaoxinManager.java | 12 +- .../manager/RegulatoryLongquanManager.java | 125 ++++++++++++++++++ .../service/impl/MessageServiceImpl.java | 5 +- .../notices/service/manager/SmsManager.java | 2 +- .../service/request/SendCodeV2Req.java | 6 + 11 files changed, 145 insertions(+), 27 deletions(-) create mode 100644 msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/RegulatoryLongquanManager.java diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/MnsChannel.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/MnsChannel.java index 8c98f066..da8957cd 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/MnsChannel.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/MnsChannel.java @@ -12,6 +12,8 @@ import lombok.RequiredArgsConstructor; public enum MnsChannel { // 政务: 高新渠道. 政府渠道, 请勿随意使用 REGULATORY_GAOXIN("regulatory_gaoxin"), + // 政务: 龙泉渠道. 政府渠道, 请勿随意使用 + REGULATORY_LONGQUAN("regulatory_longquan"), // 阿里云 (当前默认) ALIYUN("aliyun") ; diff --git a/msg-notices/msg-notices-common/src/main/java/cn/axzo/msg/center/notices/common/enums/ChannelHandlerEnum.java b/msg-notices/msg-notices-common/src/main/java/cn/axzo/msg/center/notices/common/enums/ChannelHandlerEnum.java index 7bacd999..f0deb154 100644 --- a/msg-notices/msg-notices-common/src/main/java/cn/axzo/msg/center/notices/common/enums/ChannelHandlerEnum.java +++ b/msg-notices/msg-notices-common/src/main/java/cn/axzo/msg/center/notices/common/enums/ChannelHandlerEnum.java @@ -22,7 +22,8 @@ public enum ChannelHandlerEnum implements EnumBase { CHUANG_LAN("chuanglan", "chuangLanSmsSendManager", "创蓝"), SUB_MAIL("sub_mail", "subMailSmsSendManager", "赛邮"), LIAN_LU("lian_lu", "lianLuSmsSendManager", "联麓"), - REGULATORY_GAOXIN("regulatory_gaoxin", "regulatoryGaoxinManager", "监管机构: 高新") + REGULATORY_GAOXIN("regulatory_gaoxin", "regulatoryGaoxinManager", "监管机构: 高新"), + REGULATORY_LONGQUAN("regulatory_longquan", "regulatoryLongquanManager", "监管机构: 龙泉") ; private final String code; diff --git a/msg-notices/msg-notices-common/src/main/java/cn/axzo/msg/center/notices/common/enums/MessageChannelEnum.java b/msg-notices/msg-notices-common/src/main/java/cn/axzo/msg/center/notices/common/enums/MessageChannelEnum.java index 5de4be02..35ccf4a5 100644 --- a/msg-notices/msg-notices-common/src/main/java/cn/axzo/msg/center/notices/common/enums/MessageChannelEnum.java +++ b/msg-notices/msg-notices-common/src/main/java/cn/axzo/msg/center/notices/common/enums/MessageChannelEnum.java @@ -21,7 +21,8 @@ public enum MessageChannelEnum implements EnumBase { CHUANG_LAN("chuanglan", "创蓝云智"), SUB_MAIL("sub_mail", "赛邮"), LIAN_LU("lian_lu", "联麓"), - REGULATORY_GAOXIN("regulatory_gaoxin", "监管机构: 高新") + REGULATORY_GAOXIN("regulatory_gaoxin", "监管机构: 高新"), + REGULATORY_LONGQUAN("regulatory_longquan", "监管机构: 龙泉"), ; private final String code; diff --git a/msg-notices/msg-notices-manager-api/src/main/java/cn/axzo/msg/center/notices/manager/api/dto/request/MessageSendRequestDto.java b/msg-notices/msg-notices-manager-api/src/main/java/cn/axzo/msg/center/notices/manager/api/dto/request/MessageSendRequestDto.java index d96df218..e3e2b340 100644 --- a/msg-notices/msg-notices-manager-api/src/main/java/cn/axzo/msg/center/notices/manager/api/dto/request/MessageSendRequestDto.java +++ b/msg-notices/msg-notices-manager-api/src/main/java/cn/axzo/msg/center/notices/manager/api/dto/request/MessageSendRequestDto.java @@ -54,10 +54,6 @@ public class MessageSendRequestDto { * 短信模版 */ private MNSMessageTemplate template; - /** - * 渠道模版信息 - */ - private MNSChannelMessageTemplate channelTemplate; /** * 原始请求 diff --git a/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/MessageChannelRouteImpl.java b/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/MessageChannelRouteImpl.java index e71c03e8..29996109 100644 --- a/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/MessageChannelRouteImpl.java +++ b/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/MessageChannelRouteImpl.java @@ -65,7 +65,7 @@ public class MessageChannelRouteImpl implements MessageChannelRouter { final Set pickChannelCodes = new HashSet<>(mappedChannelCodes); // 解析入参是否指定了渠道 String specifyChannelCode = parseCondition(condition); - if (pickChannelCodes.contains(specifyChannelCode)) { + if (StringUtils.isNotBlank(specifyChannelCode)) { // 指定的渠道编码在映射关系中, 优先使用该渠道 pickChannelCodes.clear(); pickChannelCodes.add(specifyChannelCode); diff --git a/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/MessageTemplateManagerImpl.java b/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/MessageTemplateManagerImpl.java index 8e99f996..b7841b1d 100644 --- a/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/MessageTemplateManagerImpl.java +++ b/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/MessageTemplateManagerImpl.java @@ -51,13 +51,7 @@ public class MessageTemplateManagerImpl implements MessageTemplateManager { @Override public MNSChannelMessageTemplate queryChannelTemplate(String innerTemplateNo, String channelCode) { - MNSChannelMessageTemplate channelMessageTemplate = mnsChannelMessageTemplateDao - .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; + return mnsChannelMessageTemplateDao.queryByTemplateNo(innerTemplateNo, channelCode); } @Override diff --git a/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/RegulatoryGaoxinManager.java b/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/RegulatoryGaoxinManager.java index 2bb6b2ed..8bf61b4b 100644 --- a/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/RegulatoryGaoxinManager.java +++ b/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/RegulatoryGaoxinManager.java @@ -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.SendSmsCommonResponseDto; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** - * 政务系统 + * 政务: 高新 * * @author yanglin */ @@ -23,19 +22,12 @@ import org.springframework.stereotype.Service; @Service("regulatoryGaoxinManager") public class RegulatoryGaoxinManager implements SmsSendManager { - private static final String USE_CHANNEL_CONTENT = "use_channel_content"; - private final RegulatoryGaoxinClient regulatoryGaoxinClient; @Override public SendSmsCommonResponseDto sendMessage(MessageSendRequestDto request) { log.info("[RegulatoryGaoxinManager#sendMessage] -> 政务高新 - 发送sms {}", JSON.toJSONString(request)); - JSONObject expansion = request.getRequest().parseExpansion(); - Boolean useChannelContent = expansion.getBoolean(USE_CHANNEL_CONTENT); - if (useChannelContent == null) useChannelContent = false; - String templateContent = useChannelContent - ? request.getChannelTemplate().getTemplateContent() - : request.getTemplate().getTemplateContent(); + String templateContent = request.getTemplate().getTemplateContent(); String content = PlaceholderResolver.getDefaultResolver().resolveByMap( templateContent, request.getTemplateMap()); String respStr = regulatoryGaoxinClient.send(request.getPhoneNo(), content); diff --git a/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/RegulatoryLongquanManager.java b/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/RegulatoryLongquanManager.java new file mode 100644 index 00000000..cc62e30d --- /dev/null +++ b/msg-notices/msg-notices-manager/src/main/java/cn/axzo/msg/center/notices/manager/RegulatoryLongquanManager.java @@ -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 formParams = new HashMap<>(); + BiConsumer 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); + } + } +} \ No newline at end of file diff --git a/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/impl/MessageServiceImpl.java b/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/impl/MessageServiceImpl.java index c131912e..d558ec4d 100644 --- a/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/impl/MessageServiceImpl.java +++ b/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/impl/MessageServiceImpl.java @@ -170,12 +170,13 @@ public class MessageServiceImpl implements MessageService, EnvironmentAware { dto.setChannelCode(message.getChannelCode()); dto.setPhoneNo(message.getTargetAddress()); dto.setInnerTemplateNo(messageTemplate.getTemplateNo()); - dto.setTemplateNo(channelTemplate.getTemplateNo()); + if (channelTemplate != null) { + dto.setTemplateNo(channelTemplate.getTemplateNo()); + } dto.setTemplateMap(request.getParams()); dto.setAppRequestNo(message.getRequestNo()); dto.setRequestChannelNo(message.getMessageOrderNo()); dto.setTemplate(messageTemplate); - dto.setChannelTemplate(channelTemplate); dto.setRequest(request); SendSmsCommonResponseDto response = smsSendManagerComposite.sendMessage(dto); messageManager.updateToProcessing(response.getBizId(), response.getRequestId(), message.getId()); diff --git a/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/manager/SmsManager.java b/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/manager/SmsManager.java index 26732fa7..53578f28 100644 --- a/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/manager/SmsManager.java +++ b/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/manager/SmsManager.java @@ -69,7 +69,7 @@ public class SmsManager extends BaseManager implements SmsGateway { */ public int sendSmsCode(SendCodeV2Req req) { 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(); } diff --git a/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/request/SendCodeV2Req.java b/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/request/SendCodeV2Req.java index 3ba9aead..52fa1b0e 100644 --- a/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/request/SendCodeV2Req.java +++ b/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/request/SendCodeV2Req.java @@ -1,6 +1,7 @@ package cn.axzo.msg.center.notices.service.request; import cn.axzo.msg.center.api.request.ExpansionInfo; +import com.alibaba.fastjson.JSON; import lombok.Data; import lombok.EqualsAndHashCode; @@ -32,4 +33,9 @@ public class SendCodeV2Req extends ExpansionInfo { private String appCode; @NotBlank(message = "templateNo参数不参为空") private String templateNo; + + @Override + public String toString() { + return JSON.toJSONString(this); + } }