保誠-保戶業務員媒合平台
wayne
2021-12-16 42567b98b186f219b7a923dc3e6daeb5ffa31cfe
[add][todo 132507] 新增發送手機簡訊service

修改3個檔案
新增6個檔案
428 ■■■■■ 已變更過的檔案
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/SendMsgService.java 59 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/service/dto/SMSDetail.java 26 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSRequest.java 99 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSResponse.java 50 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/service/util/HttpRequestUtil.java 112 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java 23 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/resources/config/application-dev.yml 5 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
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;
        }
    }
}
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));
pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java
¤ñ¹ï·sÀÉ®×
@@ -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();
    }
}
pamapi/src/main/java/com/pollex/pam/service/dto/SMSDetail.java
¤ñ¹ï·sÀÉ®×
@@ -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;
    }
}
pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSRequest.java
¤ñ¹ï·sÀÉ®×
@@ -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;
    }
}
pamapi/src/main/java/com/pollex/pam/service/dto/SendSMSResponse.java
¤ñ¹ï·sÀÉ®×
@@ -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;
    }
}
pamapi/src/main/java/com/pollex/pam/service/util/HttpRequestUtil.java
¤ñ¹ï·sÀÉ®×
@@ -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);
    }
}
pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java
¤ñ¹ï·sÀÉ®×
@@ -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) {
    }
}
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