SendSmsServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. package com.fuint.common.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  4. import com.fuint.common.dto.MessageResDto;
  5. import com.fuint.common.enums.StatusEnum;
  6. import com.fuint.common.service.SendSmsService;
  7. import com.fuint.common.service.SmsTemplateService;
  8. import com.fuint.common.util.CommonUtil;
  9. import com.fuint.framework.exception.BusinessCheckException;
  10. import com.fuint.framework.pagination.PaginationRequest;
  11. import com.fuint.framework.pagination.PaginationResponse;
  12. import com.fuint.repository.mapper.MtSmsSendedLogMapper;
  13. import com.fuint.repository.model.MtSmsSendedLog;
  14. import com.fuint.repository.model.MtSmsTemplate;
  15. import com.fuint.utils.StringUtil;
  16. import com.github.pagehelper.Page;
  17. import com.github.pagehelper.PageHelper;
  18. import lombok.AllArgsConstructor;
  19. import org.apache.commons.lang.StringUtils;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import org.springframework.core.env.Environment;
  23. import org.springframework.data.domain.PageImpl;
  24. import org.springframework.data.domain.PageRequest;
  25. import org.springframework.stereotype.Service;
  26. import com.aliyuncs.DefaultAcsClient;
  27. import com.aliyuncs.IAcsClient;
  28. import com.aliyuncs.CommonRequest;
  29. import com.aliyuncs.CommonResponse;
  30. import com.aliyuncs.exceptions.ClientException;
  31. import com.aliyuncs.exceptions.ServerException;
  32. import com.aliyuncs.http.MethodType;
  33. import com.aliyuncs.profile.DefaultProfile;
  34. import com.fasterxml.jackson.databind.ObjectMapper;
  35. import org.springframework.util.CollectionUtils;
  36. import java.util.*;
  37. import java.util.stream.Collectors;
  38. /**
  39. * 发送手机短信服务接口
  40. *
  41. * Created by FSQ
  42. * CopyRight https://www.fuint.cn
  43. */
  44. @Service
  45. @AllArgsConstructor
  46. public class SendSmsServiceImpl implements SendSmsService {
  47. private static final Logger logger = LoggerFactory.getLogger(SendSmsServiceImpl.class);
  48. /**
  49. * 系统环境变量
  50. * */
  51. private Environment env;
  52. private MtSmsSendedLogMapper mtSmsSendedLogMapper;
  53. /**
  54. * 短信模板服务接口
  55. * */
  56. private SmsTemplateService smsTemplateService;
  57. /**
  58. * 发送短信
  59. *
  60. * @param merchantId 商户ID
  61. * @param templateUname 模板名
  62. * @param phones 发送手机号
  63. * @param contentParams 发送参数
  64. * @return
  65. * */
  66. @Override
  67. public Map<Boolean,List<String>> sendSms(Integer merchantId, String templateUname, List<String> phones, Map<String, String> contentParams) throws BusinessCheckException {
  68. logger.info("使用短信平台发送短信.....");
  69. Integer mode = Integer.parseInt(env.getProperty("aliyun.sms.mode"));
  70. if (mode.intValue() != 1) {
  71. throw new BusinessCheckException("未开启短信发送开关,请联系管理员!");
  72. }
  73. if (templateUname != null && !CollectionUtils.isEmpty(phones)) {
  74. Map<Boolean, List<String>> result = new HashMap<>();
  75. try {
  76. if (mode != null && mode.intValue() == 1) {
  77. // 手机号以","分隔拼接
  78. String mobilePhones = phones.stream().collect(Collectors.joining(","));
  79. MessageResDto res = sendMessage(merchantId, mobilePhones, templateUname, contentParams);
  80. result.put(res.getResult(), phones);
  81. } else {
  82. result.put(Boolean.TRUE,phones);
  83. logger.info("模拟短信平台发送短信.....");
  84. }
  85. } catch (Exception e) {
  86. result.put(Boolean.FALSE,phones);
  87. logger.error("推送至短信平台出错...参数[smscontent={},phones={}]", templateUname, phones);
  88. logger.error(e.getMessage(),e);
  89. }
  90. return result;
  91. } else {
  92. throw new BusinessCheckException("手机号码和短信内容不能为空,请确认!");
  93. }
  94. }
  95. /**
  96. * 发送短信
  97. *
  98. * @param phoneNo 短信发送手机号,多个手机号以英文半角逗号隔开,最多支持200个手机号
  99. * @param templateUname 短信模板英文名称
  100. * @return
  101. */
  102. public MessageResDto sendMessage(Integer merchantId, String phoneNo, String templateUname, Map<String, String> contentParams) {
  103. MessageResDto resInfo = new MessageResDto();
  104. logger.info("sendMessage inParams:phoneNo={}, message={}", phoneNo, templateUname);
  105. if (StringUtil.isBlank(phoneNo) || phoneNo.split(",").length > 200) {
  106. logger.error("手机号列表不符合要求");
  107. resInfo.setResult(Boolean.FALSE);
  108. return resInfo;
  109. }
  110. String accessKeyId = env.getProperty("aliyun.sms.accessKeyId");
  111. String secret = env.getProperty("aliyun.sms.accessKeySecret");
  112. String signName = env.getProperty("aliyun.sms.signName");
  113. MtSmsTemplate templateInfo = new MtSmsTemplate();
  114. try {
  115. Map<String, Object> params = new HashMap<>();
  116. params.put("uname", templateUname);
  117. params.put("merchant_id", merchantId);
  118. List<MtSmsTemplate> templateList = smsTemplateService.querySmsTemplateByParams(params);
  119. if (templateList.size() < 1) {
  120. throw new BusinessCheckException("该短信模板不存在!");
  121. }
  122. templateInfo = templateList.get(0);
  123. if (!templateInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) {
  124. throw new BusinessCheckException("该短信模板未启用!");
  125. }
  126. } catch (BusinessCheckException e) {
  127. e.getStackTrace();
  128. }
  129. boolean flag = false;
  130. try {
  131. // 解决中文乱码
  132. if (!CommonUtil.isUtf8(signName) || CommonUtil.isErrCode(signName)) {
  133. signName = new String(signName.getBytes("ISO8859-1"), "UTF-8");
  134. }
  135. // 阿里云短信
  136. DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, secret);
  137. IAcsClient client = new DefaultAcsClient(profile);
  138. // 装配参数
  139. String smsContent = templateInfo.getContent();
  140. if (smsContent == null || StringUtil.isEmpty(smsContent)) {
  141. resInfo.setResult(Boolean.FALSE);
  142. return resInfo;
  143. }
  144. String paramJson = "";
  145. if (contentParams.size() > 0) {
  146. for (Map.Entry<String, String> entry : contentParams.entrySet()){
  147. String key = entry.getKey();
  148. String value = entry.getValue();
  149. smsContent = smsContent.replace("{"+key+"}", value);
  150. }
  151. try {
  152. ObjectMapper mapper = new ObjectMapper();
  153. paramJson = mapper.writeValueAsString(contentParams);
  154. } catch(Exception e){
  155. e.printStackTrace();
  156. }
  157. }
  158. CommonRequest request = new CommonRequest();
  159. request.setSysMethod(MethodType.POST);
  160. request.setSysDomain("dysmsapi.aliyuncs.com");
  161. request.setSysVersion("2017-05-25");
  162. request.setSysAction("SendSms");
  163. request.putQueryParameter("RegionId", "cn-hangzhou");
  164. request.putQueryParameter("PhoneNumbers", phoneNo);
  165. request.putQueryParameter("SignName", signName);
  166. request.putQueryParameter("TemplateCode", templateInfo.getCode());
  167. request.putQueryParameter("TemplateParam", paramJson);
  168. String res = "";
  169. try {
  170. CommonResponse response = client.getCommonResponse(request);
  171. res = response.getData();
  172. System.out.println(response.getData());
  173. } catch (ServerException e) {
  174. e.printStackTrace();
  175. } catch (ClientException e) {
  176. e.printStackTrace();
  177. }
  178. logger.info("sendMessage outParams:{}", res);
  179. saveSendLog(merchantId, phoneNo, smsContent);
  180. flag = true;
  181. } catch (Exception e) {
  182. flag = false;
  183. logger.error(e.getMessage(), e);
  184. } finally {
  185. resInfo.setResult(flag);
  186. }
  187. return resInfo;
  188. }
  189. /**
  190. * 发送短信日志记录
  191. *
  192. * @param merchantId 商户ID
  193. * @param phoneNo 短信发送手机号
  194. * @param message 短信内容
  195. * @return
  196. */
  197. public void saveSendLog(Integer merchantId, String phoneNo, String message) {
  198. MtSmsSendedLog mtSmsSendedLog = new MtSmsSendedLog();
  199. mtSmsSendedLog.setMerchantId(merchantId);
  200. mtSmsSendedLog.setMobilePhone(phoneNo);
  201. mtSmsSendedLog.setContent(message);
  202. Date time = new Date();
  203. mtSmsSendedLog.setCreateTime(time);
  204. mtSmsSendedLog.setSendTime(time);
  205. mtSmsSendedLog.setUpdateTime(time);
  206. mtSmsSendedLogMapper.insert(mtSmsSendedLog);
  207. }
  208. /**
  209. * 分页查询已发短信列表
  210. *
  211. * @param paginationRequest
  212. * @return
  213. */
  214. @Override
  215. public PaginationResponse<MtSmsSendedLog> querySmsListByPagination(PaginationRequest paginationRequest) {
  216. Page<MtSmsSendedLog> pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize());
  217. LambdaQueryWrapper<MtSmsSendedLog> lambdaQueryWrapper = Wrappers.lambdaQuery();
  218. String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString();
  219. if (StringUtils.isNotBlank(merchantId)) {
  220. lambdaQueryWrapper.eq(MtSmsSendedLog::getMerchantId, merchantId);
  221. }
  222. String content = paginationRequest.getSearchParams().get("content") == null ? "" : paginationRequest.getSearchParams().get("content").toString();
  223. if (StringUtils.isNotBlank(content)) {
  224. lambdaQueryWrapper.like(MtSmsSendedLog::getContent, content);
  225. }
  226. String mobile = paginationRequest.getSearchParams().get("mobile") == null ? "" : paginationRequest.getSearchParams().get("mobile").toString();
  227. if (StringUtils.isNotBlank(mobile)) {
  228. lambdaQueryWrapper.eq(MtSmsSendedLog::getMobilePhone, mobile);
  229. }
  230. lambdaQueryWrapper.orderByDesc(MtSmsSendedLog::getLogId);
  231. List<MtSmsSendedLog> dataList = mtSmsSendedLogMapper.selectList(lambdaQueryWrapper);
  232. PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize());
  233. PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal());
  234. PaginationResponse<MtSmsSendedLog> paginationResponse = new PaginationResponse(pageImpl, MtSmsSendedLog.class);
  235. paginationResponse.setTotalPages(pageHelper.getPages());
  236. paginationResponse.setTotalElements(pageHelper.getTotal());
  237. paginationResponse.setContent(dataList);
  238. return paginationResponse;
  239. }
  240. }