From 42567b98b186f219b7a923dc3e6daeb5ffa31cfe Mon Sep 17 00:00:00 2001 From: wayne <wayne8692wayne8692@gmail.com> Date: 星期五, 17 十二月 2021 15:29:59 +0800 Subject: [PATCH] [add][todo 132507] 新增發送手機簡訊service --- pamapi/src/main/resources/config/application-dev.yml | 5 pamapi/src/main/java/com/pollex/pam/service/dto/SMSDetail.java | 26 +++ pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java | 23 ++ pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java | 59 +++++++ pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java | 48 ++++++ pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java | 6 pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSRequest.java | 99 ++++++++++++ pamapi/src/main/java/com/pollex/pam/service/util/HttpRequestUtil.java | 112 ++++++++++++++ pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSResponse.java | 50 ++++++ 9 files changed, 425 insertions(+), 3 deletions(-) diff --git a/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java b/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java index 6f79c28..8f9876a 100644 --- a/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java +++ b/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java @@ -18,6 +18,7 @@ private String eServiceLoginUrl; private String eServiceLoginFunc; private String eServiceLoginSys; + private SMS sms; public boolean isMockLogin() { return mockLogin; @@ -74,4 +75,51 @@ public void seteServiceLoginSys(String eServiceLoginSys) { this.eServiceLoginSys = eServiceLoginSys; } + + public SMS getSms() { + return sms; + } + + public void setSms(SMS sms) { + this.sms = sms; + } + + public static class SMS { + private String url; + private String sourceCode; + private String sender; + private String smsType; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getSourceCode() { + return sourceCode; + } + + public void setSourceCode(String sourceCode) { + this.sourceCode = sourceCode; + } + + public String getSender() { + return sender; + } + + public void setSender(String sender) { + this.sender = sender; + } + + public String getSmsType() { + return smsType; + } + + public void setSmsType(String smsType) { + this.smsType = smsType; + } + } } diff --git a/pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java b/pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java index 9a90c5e..06c3fe0 100644 --- a/pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java +++ b/pamapi/src/main/java/com/pollex/pam/security/provider/EServiceAuthenticationProvider.java @@ -8,6 +8,7 @@ import com.pollex.pam.security.token.EServiceAuthenticationToken; import com.pollex.pam.service.LoginRecordService; import com.pollex.pam.service.dto.EServiceResponse; +import com.pollex.pam.service.util.HttpRequestUtil; import com.pollex.pam.web.rest.errors.EServiceErrorException; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; @@ -21,7 +22,6 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.security.authentication.AuthenticationServiceException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; @@ -105,7 +105,7 @@ private ResponseEntity<EServiceResponse> loginByEService(String account, String paxxword) throws JsonProcessingException, GeneralSecurityException { RestTemplate restTemplate = getTrustAllRestTemplate(); - settingMessageConvertesToSpecifyType(restTemplate, MediaType.ALL); + settingMessageConvertersToSpecifyType(restTemplate, MediaType.ALL); String urlTemplate = UriComponentsBuilder.fromHttpUrl(applicationProperty.geteServiceLoginUrl()) .queryParam("func", applicationProperty.geteServiceLoginFunc()) @@ -140,7 +140,7 @@ return new RestTemplate(requestFactory); } - private void settingMessageConvertesToSpecifyType(RestTemplate restTemplate, MediaType mediaType) { + private void settingMessageConvertersToSpecifyType(RestTemplate restTemplate, MediaType mediaType) { List<HttpMessageConverter<?>> messageConverters = new ArrayList<>(); MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setSupportedMediaTypes(Collections.singletonList(mediaType)); diff --git a/pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java b/pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java new file mode 100644 index 0000000..5280732 --- /dev/null +++ b/pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java @@ -0,0 +1,59 @@ +package com.pollex.pam.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.pollex.pam.config.ApplicationProperties; +import com.pollex.pam.service.dto.SMSDetail; +import com.pollex.pam.service.dto.SendSMSRequest; +import com.pollex.pam.service.dto.SendSMSResponse; +import com.pollex.pam.service.util.HttpRequestUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.nio.charset.StandardCharsets; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Base64; +import java.util.Base64.Encoder; +import java.util.Collections; +import java.util.UUID; + +@Service +public class SendMsgService { + + private final static Logger log = LoggerFactory.getLogger(SendMsgService.class); + private final Encoder encoder = Base64.getEncoder(); + + @Autowired + ApplicationProperties applicationProperties; + + public SendSMSResponse sendMsgBySMS(String subject, String toMobile, String content) throws Exception{ + final String SMS_URL = applicationProperties.getSms().getUrl(); + + SendSMSRequest sendSMSRequest = new SendSMSRequest(); + sendSMSRequest.setpKey(UUID.randomUUID().toString()); + sendSMSRequest.setSourceCode(applicationProperties.getSms().getSourceCode()); + sendSMSRequest.setSender(applicationProperties.getSms().getSender()); + sendSMSRequest.setMsgTypeSet(applicationProperties.getSms().getSmsType()); + sendSMSRequest.setSendTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:00"))); + sendSMSRequest.setSubject(subject); + sendSMSRequest.setActivityId(""); + + SMSDetail smsDetail = new SMSDetail(); + smsDetail.setMobile(toMobile); + smsDetail.setContent(encoder.encodeToString(content.getBytes(StandardCharsets.UTF_8))); + + sendSMSRequest.setDetail(Collections.singletonList(smsDetail)); + + ResponseEntity<SendSMSResponse> responseEntity = HttpRequestUtil.postWithJson(SMS_URL, sendSMSRequest, SendSMSResponse.class); + return responseEntity.getBody(); + } + + +} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SMSDetail.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SMSDetail.java new file mode 100644 index 0000000..8cbc3da --- /dev/null +++ b/pamapi/src/main/java/com/pollex/pam/service/dto/SMSDetail.java @@ -0,0 +1,26 @@ +package com.pollex.pam.service.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class SMSDetail { + private String mobile; + private String content; + + @JsonProperty("mobile") + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @JsonProperty("content") + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSRequest.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSRequest.java new file mode 100644 index 0000000..de3aa42 --- /dev/null +++ b/pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSRequest.java @@ -0,0 +1,99 @@ +package com.pollex.pam.service.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class SendSMSRequest { + + private String pKey; + private String sourceCode; + private String sender; + private String sendTime; + private String subject; + private String activityId; + private String mmsPath; + private String msgTypeSet; + private List<SMSDetail> detail; + + @JsonProperty("p_key") + public String getpKey() { + return pKey; + } + + public void setpKey(String pKey) { + this.pKey = pKey; + } + + @JsonProperty("source_code") + public String getSourceCode() { + return sourceCode; + } + + public void setSourceCode(String sourceCode) { + this.sourceCode = sourceCode; + } + + @JsonProperty("sender") + public String getSender() { + return sender; + } + + public void setSender(String sender) { + this.sender = sender; + } + + @JsonProperty("send_time") + public String getSendTime() { + return sendTime; + } + + public void setSendTime(String sendTime) { + this.sendTime = sendTime; + } + + @JsonProperty("subject") + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + @JsonProperty("activity_id") + public String getActivityId() { + return activityId; + } + + public void setActivityId(String activityId) { + this.activityId = activityId; + } + + @JsonProperty("mms_path") + public String getMmsPath() { + return mmsPath; + } + + public void setMmsPath(String mmsPath) { + this.mmsPath = mmsPath; + } + + @JsonProperty("msg_type_set") + public String getMsgTypeSet() { + return msgTypeSet; + } + + public void setMsgTypeSet(String msgTypeSet) { + this.msgTypeSet = msgTypeSet; + } + + @JsonProperty("detail") + public List<SMSDetail> getDetail() { + return detail; + } + + public void setDetail(List<SMSDetail> detail) { + this.detail = detail; + } +} diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSResponse.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSResponse.java new file mode 100644 index 0000000..fee3219 --- /dev/null +++ b/pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSResponse.java @@ -0,0 +1,50 @@ +package com.pollex.pam.service.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class SendSMSResponse { + + @JsonProperty("p_key") + private String pKey; + + @JsonProperty("return_code") + private String returnCode; + + @JsonProperty("msg_batchNo") + private String msgBatchNo; + + @JsonProperty("error_msg") + private String errorMsg; + + public String getpKey() { + return pKey; + } + + public void setpKey(String pKey) { + this.pKey = pKey; + } + + public String getReturnCode() { + return returnCode; + } + + public void setReturnCode(String returnCode) { + this.returnCode = returnCode; + } + + public String getMsgBatchNo() { + return msgBatchNo; + } + + public void setMsgBatchNo(String msgBatchNo) { + this.msgBatchNo = msgBatchNo; + } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } +} diff --git a/pamapi/src/main/java/com/pollex/pam/service/util/HttpRequestUtil.java b/pamapi/src/main/java/com/pollex/pam/service/util/HttpRequestUtil.java new file mode 100644 index 0000000..f277b6b --- /dev/null +++ b/pamapi/src/main/java/com/pollex/pam/service/util/HttpRequestUtil.java @@ -0,0 +1,112 @@ +package com.pollex.pam.service.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContexts; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.*; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import javax.net.ssl.SSLContext; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.util.Map; +import java.util.Set; + +public final class HttpRequestUtil { + private static final Logger log = LoggerFactory.getLogger(HttpRequestUtil.class); + + private HttpRequestUtil() {} + + public static <T> ResponseEntity<T> getWithJson(String url, Class<T> responseType) + throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException + { + return getWithJson(url, responseType, null); + } + + public static <T> ResponseEntity<T> getWithJson(String url, Class<T> responseType, Map<String, String> addedHeaders) + throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException + { + RestTemplate restTemplate = getTrustAllRestTemplate(); + HttpHeaders headers = new HttpHeaders(); + setHeaders(headers, addedHeaders); + + HttpEntity<String> httpEntity = new HttpEntity<>(headers); + + log.debug("HttpRequestUtil get url: {}", url); + log.debug("httpEntity = {}", httpEntity); + return restTemplate.exchange(url, HttpMethod.GET, httpEntity, responseType); + } + + public static ResponseEntity<String> postWithJson(String url, Object jsonData, Map<String, String> headers) + throws KeyStoreException, NoSuchAlgorithmException, JsonProcessingException, KeyManagementException + { + return postWithJson(url, jsonData, String.class, headers); + } + + public static ResponseEntity<String> postWithJson(String url, Object jsonData) + throws KeyStoreException, NoSuchAlgorithmException, JsonProcessingException, KeyManagementException + { + return postWithJson(url, jsonData, String.class, null); + } + + public static <T> ResponseEntity<T> postWithJson(String url, Object jsonData, Class<T> responseType) + throws KeyStoreException, NoSuchAlgorithmException, JsonProcessingException, KeyManagementException + { + return postWithJson(url, jsonData, responseType, null); + } + + public static <T> ResponseEntity<T> postWithJson(String url, Object jsonData, Class<T> responseType, Map<String, String> addedHeaders) + throws JsonProcessingException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException { + + String parameters = new ObjectMapper().writeValueAsString(jsonData); + //憒��葆Base64,debug��靘������ + if(parameters.length() < 1000){ + log.debug("parameters : {}",parameters); + } + + RestTemplate restTemplate = getTrustAllRestTemplate(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + setHeaders(headers, addedHeaders); + + HttpEntity<String> entity = new HttpEntity<>(parameters, headers); + return restTemplate.exchange(url, HttpMethod.POST, entity, responseType); + } + + private static void setHeaders(HttpHeaders headers, Map<String, String> addedHeaders) { + if(addedHeaders != null && addedHeaders.size() > 0) { + Set<String> keys = addedHeaders.keySet(); + for (String key : keys) { + String headerValue = addedHeaders.get(key); + headers.set(key, headerValue); + log.info("http cust header key: {}", key); + log.info("http cust header headerValue: {}", headerValue); + } + } + } + + private static RestTemplate getTrustAllRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { + SSLContext sslContext = SSLContexts.custom() + .loadTrustMaterial(null, (X509Certificate[] x509Certs, String s) -> true) + .build(); + SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier()); + CloseableHttpClient httpClient = HttpClients.custom() + .setSSLSocketFactory(csf) + .build(); + HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); + requestFactory.setHttpClient(httpClient); + requestFactory.setConnectTimeout(300000); + requestFactory.setReadTimeout(300000); + return new RestTemplate(requestFactory); + } +} diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java new file mode 100644 index 0000000..4a47d67 --- /dev/null +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java @@ -0,0 +1,23 @@ +package com.pollex.pam.web.rest; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Deprecated +@RestController +@RequestMapping("/api/test/sendMsg") +public class TestSendMsgResource { + + @PostMapping("/bySMS") + public ResponseEntity<Void> bySMS(@RequestBody Object param) { + + } + + @PostMapping("/byEmail") + public ResponseEntity<Void> byEmail(@RequestBody Object param) { + + } +} diff --git a/pamapi/src/main/resources/config/application-dev.yml b/pamapi/src/main/resources/config/application-dev.yml index f81590c..5c2c5d0 100644 --- a/pamapi/src/main/resources/config/application-dev.yml +++ b/pamapi/src/main/resources/config/application-dev.yml @@ -119,3 +119,8 @@ e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate e-service-login-func: ValidateUsrLogin e-service-login-sys: epos + sms: + url: https://vtwlifewinbo66.pru.intranet.asia/MesgQueueMgmnt/rest/smsSendMsgResource + source-code: ePos + sender: POS + sms-type: 0017 -- Gitblit v1.8.0