|  | @ -1,9 +1,28 @@
 | 
												
													
														
															|  | package com.yihu.jw.base.service;
 |  | package com.yihu.jw.base.service;
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | import com.fasterxml.jackson.databind.ObjectMapper;
 | 
												
													
														
															|  | 
 |  | import com.yihu.jw.base.dao.SmsDao;
 | 
												
													
														
															|  | import com.yihu.jw.base.dao.SmsGatewayDao;
 |  | import com.yihu.jw.base.dao.SmsGatewayDao;
 | 
												
													
														
															|  | 
 |  | import com.yihu.jw.base.dao.SmsTemplateDao;
 | 
												
													
														
															|  | 
 |  | import com.yihu.jw.entity.base.sms.SmsDO;
 | 
												
													
														
															|  | import com.yihu.jw.entity.base.sms.SmsGatewayDO;
 |  | import com.yihu.jw.entity.base.sms.SmsGatewayDO;
 | 
												
													
														
															|  | 
 |  | import com.yihu.jw.entity.base.sms.SmsTemplateDO;
 | 
												
													
														
															|  | 
 |  | import com.yihu.jw.exception.ApiException;
 | 
												
													
														
															|  | import com.yihu.mysql.query.BaseJpaService;
 |  | import com.yihu.mysql.query.BaseJpaService;
 | 
												
													
														
															|  | 
 |  | import com.yihu.utils.network.HttpResponse;
 | 
												
													
														
															|  | 
 |  | import com.yihu.utils.network.HttpUtils;
 | 
												
													
														
															|  | 
 |  | import com.yihu.utils.network.IPInfoUtils;
 | 
												
													
														
															|  | 
 |  | import org.apache.commons.lang3.time.DateUtils;
 | 
												
													
														
															|  | 
 |  | import org.springframework.beans.factory.annotation.Autowired;
 | 
												
													
														
															|  | import org.springframework.stereotype.Service;
 |  | import org.springframework.stereotype.Service;
 | 
												
													
														
															|  | 
 |  | import org.springframework.web.context.request.RequestContextHolder;
 | 
												
													
														
															|  | 
 |  | import org.springframework.web.context.request.ServletRequestAttributes;
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  | import javax.servlet.http.HttpServletRequest;
 | 
												
													
														
															|  | 
 |  | import java.lang.reflect.MalformedParameterizedTypeException;
 | 
												
													
														
															|  | 
 |  | import java.util.*;
 | 
												
													
														
															|  | 
 |  | import java.util.regex.Matcher;
 | 
												
													
														
															|  | 
 |  | import java.util.regex.Pattern;
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | /**
 |  | /**
 | 
												
													
														
															|  |  * Service - 短信网关
 |  |  * Service - 短信网关
 | 
												
											
												
													
														
															|  | @ -12,4 +31,96 @@ import org.springframework.stereotype.Service;
 | 
												
													
														
															|  | @Service
 |  | @Service
 | 
												
													
														
															|  | public class SmsGatewayService extends BaseJpaService<SmsGatewayDO, SmsGatewayDao> {
 |  | public class SmsGatewayService extends BaseJpaService<SmsGatewayDO, SmsGatewayDao> {
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  |     private static final Pattern PATTERN  = Pattern.compile("\\$\\{[A-Za-z0-9]+\\}");
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  |     @Autowired
 | 
												
													
														
															|  | 
 |  |     private SmsTemplateDao smsTemplateDao;
 | 
												
													
														
															|  | 
 |  |     @Autowired
 | 
												
													
														
															|  | 
 |  |     private SmsGatewayDao smsGatewayDao;
 | 
												
													
														
															|  | 
 |  |     @Autowired
 | 
												
													
														
															|  | 
 |  |     private SmsDao smsDao;
 | 
												
													
														
															|  | 
 |  |     @Autowired
 | 
												
													
														
															|  | 
 |  |     private ObjectMapper objectMapper;
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  |     public SmsDO send(String clientId, SmsTemplateDO.Type type, String to) throws Exception {
 | 
												
													
														
															|  | 
 |  |         List<SmsGatewayDO> smsGatewayDOS = smsGatewayDao.findByClientIdAndStatus(clientId, SmsGatewayDO.Status.available);
 | 
												
													
														
															|  | 
 |  |         if (smsGatewayDOS.size() == 0) {
 | 
												
													
														
															|  | 
 |  |             throw new ApiException("no gateway available");
 | 
												
													
														
															|  | 
 |  |         }
 | 
												
													
														
															|  | 
 |  |         List<SmsTemplateDO> smsTemplateDOS = smsTemplateDao.findByClientIdAndType(clientId, type);
 | 
												
													
														
															|  | 
 |  |         if (smsTemplateDOS.size() == 0) {
 | 
												
													
														
															|  | 
 |  |             throw new ApiException("no template available");
 | 
												
													
														
															|  | 
 |  |         }
 | 
												
													
														
															|  | 
 |  |         Random random = new Random();
 | 
												
													
														
															|  | 
 |  |         SmsGatewayDO smsGatewayDO = smsGatewayDOS.get(random.nextInt(smsGatewayDOS.size()));
 | 
												
													
														
															|  | 
 |  |         SmsTemplateDO smsTemplateDO = smsTemplateDOS.get(random.nextInt(smsTemplateDOS.size()));
 | 
												
													
														
															|  | 
 |  |         //生成内容
 | 
												
													
														
															|  | 
 |  |         String rawContent = smsTemplateDO.getContent();
 | 
												
													
														
															|  | 
 |  |         /*
 | 
												
													
														
															|  | 
 |  |          * 0 - 验证码
 | 
												
													
														
															|  | 
 |  |          * 1 - 过期时间(分钟)
 | 
												
													
														
															|  | 
 |  |          */
 | 
												
													
														
															|  | 
 |  |         String [] contentDatas = new String[] {
 | 
												
													
														
															|  | 
 |  |                 randomInt(6),
 | 
												
													
														
															|  | 
 |  |                 smsGatewayDO.getExpireMin().toString()
 | 
												
													
														
															|  | 
 |  |         };
 | 
												
													
														
															|  | 
 |  |         Matcher contentMatcher = PATTERN.matcher(rawContent);
 | 
												
													
														
															|  | 
 |  |         int index = 0;
 | 
												
													
														
															|  | 
 |  |         while (contentMatcher.find()) {
 | 
												
													
														
															|  | 
 |  |             String matchWord = contentMatcher.group(0);
 | 
												
													
														
															|  | 
 |  |             rawContent = rawContent.replace(matchWord, contentDatas[index]);
 | 
												
													
														
															|  | 
 |  |             index ++;
 | 
												
													
														
															|  | 
 |  |         }
 | 
												
													
														
															|  | 
 |  |         String sendContent = smsTemplateDO.getHeader() + rawContent;
 | 
												
													
														
															|  | 
 |  |         //第三方API服务请求参数
 | 
												
													
														
															|  | 
 |  |         String rawCertificate = smsGatewayDO.getRequestCertificate();
 | 
												
													
														
															|  | 
 |  |         /*
 | 
												
													
														
															|  | 
 |  |          * 0 - 接收手机号码
 | 
												
													
														
															|  | 
 |  |          * 1 - 短信内容
 | 
												
													
														
															|  | 
 |  |          */
 | 
												
													
														
															|  | 
 |  |         String [] certificateDatas = new String[] {
 | 
												
													
														
															|  | 
 |  |                 to,
 | 
												
													
														
															|  | 
 |  |                 sendContent
 | 
												
													
														
															|  | 
 |  |         };
 | 
												
													
														
															|  | 
 |  |         Matcher certificateMatcher = PATTERN.matcher(rawCertificate);
 | 
												
													
														
															|  | 
 |  |         index = 0;
 | 
												
													
														
															|  | 
 |  |         while (certificateMatcher.find()) {
 | 
												
													
														
															|  | 
 |  |             String matchWord = certificateMatcher.group(0);
 | 
												
													
														
															|  | 
 |  |             rawCertificate = rawCertificate.replace(matchWord, certificateDatas[index]);
 | 
												
													
														
															|  | 
 |  |             index ++;
 | 
												
													
														
															|  | 
 |  |         }
 | 
												
													
														
															|  | 
 |  |         HttpResponse httpResponse = HttpUtils.doPost(smsGatewayDO.getRequestUrl(), objectMapper.readValue(rawCertificate, Map.class));
 | 
												
													
														
															|  | 
 |  |         if (httpResponse.isSuccessFlg()) {
 | 
												
													
														
															|  | 
 |  |             Map<String, Object> response = objectMapper.readValue(httpResponse.getContent(), Map.class);
 | 
												
													
														
															|  | 
 |  |             if (response.get(smsGatewayDO.getResponseCode()).equals(smsGatewayDO.getSuccessValue())) {
 | 
												
													
														
															|  | 
 |  |                 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
 | 
												
													
														
															|  | 
 |  |                 SmsDO smsDO = new SmsDO();
 | 
												
													
														
															|  | 
 |  |                 smsDO.setClientId(clientId);
 | 
												
													
														
															|  | 
 |  |                 smsDO.setSmsGatewayId(smsGatewayDO.getId());
 | 
												
													
														
															|  | 
 |  |                 smsDO.setRequestIp(IPInfoUtils.getIPAddress(request));
 | 
												
													
														
															|  | 
 |  |                 smsDO.setTo(to);
 | 
												
													
														
															|  | 
 |  |                 smsDO.setContent(sendContent);
 | 
												
													
														
															|  | 
 |  |                 smsDO.setDeadline(DateUtils.addMinutes(new Date(), smsGatewayDO.getExpireMin()));
 | 
												
													
														
															|  | 
 |  |                 smsDO.setCaptcha(contentDatas[0]);
 | 
												
													
														
															|  | 
 |  |                 smsDO.setType(type);
 | 
												
													
														
															|  | 
 |  |                 return smsDao.save(smsDO);
 | 
												
													
														
															|  | 
 |  |             } else {
 | 
												
													
														
															|  | 
 |  |                 throw new ApiException(httpResponse.getContent());
 | 
												
													
														
															|  | 
 |  |             }
 | 
												
													
														
															|  | 
 |  |         } else {
 | 
												
													
														
															|  | 
 |  |             throw new ApiException(httpResponse.getContent());
 | 
												
													
														
															|  | 
 |  |         }
 | 
												
													
														
															|  | 
 |  |     }
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | 
 |  |     private String randomInt(int length) {
 | 
												
													
														
															|  | 
 |  |         String str = "0123456789";
 | 
												
													
														
															|  | 
 |  |         StringBuffer buffer = new StringBuffer();
 | 
												
													
														
															|  | 
 |  |         Random random = new Random();
 | 
												
													
														
															|  | 
 |  |         for(int i = 0; i < length; ++i) {
 | 
												
													
														
															|  | 
 |  |             int pos = random.nextInt(str.length());
 | 
												
													
														
															|  | 
 |  |             buffer.append(str.charAt(pos));
 | 
												
													
														
															|  | 
 |  |         }
 | 
												
													
														
															|  | 
 |  |         return buffer.toString();
 | 
												
													
														
															|  | 
 |  |     }
 | 
												
													
														
															|  | 
 |  | 
 | 
												
													
														
															|  | }
 |  | }
 |