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