diff --git a/austin-common/pom.xml b/austin-common/pom.xml index 0dadbfd..ab589d0 100644 --- a/austin-common/pom.xml +++ b/austin-common/pom.xml @@ -5,11 +5,16 @@ austin com.java3y.austin - 0.0.2 + 0.0.1-SNAPSHOT 4.0.0 austin-common - + + + org.projectlombok + lombok + + \ No newline at end of file diff --git a/austin-common/src/main/java/com/java3y/austin/pojo/SmsParam.java b/austin-common/src/main/java/com/java3y/austin/pojo/SmsParam.java new file mode 100644 index 0000000..0b19f07 --- /dev/null +++ b/austin-common/src/main/java/com/java3y/austin/pojo/SmsParam.java @@ -0,0 +1,26 @@ +package com.java3y.austin.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.util.Set; + +/** + * @author 3y + * @date 2021/11/4 + * 发送短信参数 + */ +@Data +@Builder +public class SmsParam { + + /** + * 需要发送的手机号 + */ + private Set phones; + + /** + * 发送文案 + */ + private String content; +} diff --git a/austin-handler/pom.xml b/austin-handler/pom.xml index 5dc38e5..f059091 100644 --- a/austin-handler/pom.xml +++ b/austin-handler/pom.xml @@ -5,17 +5,34 @@ austin com.java3y.austin - 0.0.2 + 0.0.1-SNAPSHOT 4.0.0 austin-handler - + + + com.java3y.austin + austin-common + 0.0.1-SNAPSHOT + + + com.java3y.austin + austin-support + 0.0.1-SNAPSHOT + + - org.springframework.boot - spring-boot-starter + com.tencentcloudapi + tencentcloud-sdk-java + + + com.squareup.okio + okio + + \ No newline at end of file diff --git a/austin-handler/src/main/java/com/java3y/austin/script/TencentSmsScript.java b/austin-handler/src/main/java/com/java3y/austin/script/TencentSmsScript.java new file mode 100644 index 0000000..4703a0d --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/script/TencentSmsScript.java @@ -0,0 +1,82 @@ +package com.java3y.austin.script; + +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSON; +import com.google.common.base.Throwables; +import com.java3y.austin.pojo.SmsParam; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author 3y + * @date 2021/11/6 + * 1. 发送短信接入文档:https://cloud.tencent.com/document/api/382/55981 + * 2. 推荐直接使用SDK + * 3. 推荐使用API Explorer 生成代码 + */ +@Service +@Slf4j +public class TencentSmsScript { + + /** + * api相关 + */ + private static final String URL = "sms.tencentcloudapi.com"; + private static final String REGION = "ap-guangzhou"; + + /** + * 账号相关 TODO + */ + private final static String SECRET_ID = "//"; + private final static String SECRET_KEY = "//"; + private static final String SMS_SDK_APP_ID = "//"; + private static final String TEMPLATE_ID = "//"; + private static final String SIGN_NAME = "//"; + + public String send(SmsParam smsParam) { + try { + + /** + * 初始化 client + */ + Credential cred = new Credential(SECRET_ID, SECRET_KEY); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint(URL); + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + SmsClient client = new SmsClient(cred, REGION, clientProfile); + + /** + * 组装发送短信参数 + */ + SendSmsRequest req = new SendSmsRequest(); + String[] phoneNumberSet1 = smsParam.getPhones().toArray(new String[smsParam.getPhones().size() - 1]); + req.setPhoneNumberSet(phoneNumberSet1); + req.setSmsSdkAppId(SMS_SDK_APP_ID); + req.setSignName(SIGN_NAME); + req.setTemplateId(TEMPLATE_ID); + String[] templateParamSet1 = {smsParam.getContent()}; + req.setTemplateParamSet(templateParamSet1); + req.setSessionContext(IdUtil.fastSimpleUUID()); + + /** + * 请求,返回结果 + */ + SendSmsResponse resp = client.SendSms(req); + return SendSmsResponse.toJsonString(resp); + + } catch (TencentCloudSDKException e) { + log.error("send tencent sms fail!{},params:{}", + Throwables.getStackTraceAsString(e), JSON.toJSONString(smsParam)); + return null; + } + + } +} diff --git a/austin-service-api-impl/pom.xml b/austin-service-api-impl/pom.xml index f091e45..6c14755 100644 --- a/austin-service-api-impl/pom.xml +++ b/austin-service-api-impl/pom.xml @@ -5,7 +5,7 @@ austin com.java3y.austin - 0.0.2 + 0.0.1-SNAPSHOT 4.0.0 diff --git a/austin-service-api/pom.xml b/austin-service-api/pom.xml index 8d2d001..d874b76 100644 --- a/austin-service-api/pom.xml +++ b/austin-service-api/pom.xml @@ -5,7 +5,7 @@ austin com.java3y.austin - 0.0.2 + 0.0.1-SNAPSHOT 4.0.0 diff --git a/austin-support/pom.xml b/austin-support/pom.xml index 93bbfaa..0363790 100644 --- a/austin-support/pom.xml +++ b/austin-support/pom.xml @@ -5,18 +5,52 @@ austin com.java3y.austin - 0.0.2 + 0.0.1-SNAPSHOT 4.0.0 austin-support - + + + org.springframework.boot + spring-boot-starter + mysql mysql-connector-java + + com.squareup.okhttp3 + okhttp + + + org.projectlombok + lombok + + + com.google.guava + guava + + + cn.hutool + hutool-all + + + + com.alibaba + fastjson + + + + + src/main/resources + true + + + + \ No newline at end of file diff --git a/austin-support/src/main/java/com/java3y/austin/config/OkHttpConfiguration.java b/austin-support/src/main/java/com/java3y/austin/config/OkHttpConfiguration.java new file mode 100644 index 0000000..ddc9567 --- /dev/null +++ b/austin-support/src/main/java/com/java3y/austin/config/OkHttpConfiguration.java @@ -0,0 +1,87 @@ +package com.java3y.austin.config; + + +import okhttp3.ConnectionPool; +import okhttp3.OkHttpClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.net.ssl.*; +import java.security.*; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.concurrent.TimeUnit; + + +/** + * @author 3y + * @date 2021/11/4 + */ +@Configuration +public class OkHttpConfiguration { + + @Value("${ok.http.connect-timeout}") + private Integer connectTimeout; + + @Value("${ok.http.read-timeout}") + private Integer readTimeout; + + @Value("${ok.http.write-timeout}") + private Integer writeTimeout; + + @Value("${ok.http.max-idle-connections}") + private Integer maxIdleConnections; + + @Value("${ok.http.keep-alive-duration}") + private Long keepAliveDuration; + + @Bean + public OkHttpClient okHttpClient() { + return new OkHttpClient.Builder() + .sslSocketFactory(sslSocketFactory(), x509TrustManager()) + .retryOnConnectionFailure(false) + .connectionPool(pool()) + .connectTimeout(connectTimeout, TimeUnit.SECONDS) + .readTimeout(readTimeout, TimeUnit.SECONDS) + .writeTimeout(writeTimeout,TimeUnit.SECONDS) + .hostnameVerifier((hostname, session) -> true) + .build(); + } + + @Bean + public X509TrustManager x509TrustManager() { + return new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + throws CertificateException { + } + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + throws CertificateException { + } + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + }; + } + + @Bean + public SSLSocketFactory sslSocketFactory() { + try { + // 信任任何链接 + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, new TrustManager[]{x509TrustManager()}, new SecureRandom()); + return sslContext.getSocketFactory(); + } catch (NoSuchAlgorithmException | KeyManagementException e) { + e.printStackTrace(); + } + return null; + } + + @Bean + public ConnectionPool pool() { + return new ConnectionPool(maxIdleConnections, keepAliveDuration, TimeUnit.SECONDS); + } +} diff --git a/austin-support/src/main/java/com/java3y/austin/utils/OkHttpUtils.java b/austin-support/src/main/java/com/java3y/austin/utils/OkHttpUtils.java new file mode 100644 index 0000000..8befb83 --- /dev/null +++ b/austin-support/src/main/java/com/java3y/austin/utils/OkHttpUtils.java @@ -0,0 +1,195 @@ +package com.java3y.austin.utils; + +import cn.hutool.core.map.MapUtil; +import com.google.common.base.Throwables; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; +import java.util.Map; + +/** + * @author 3y + * @date 2021/11/4 + */ +@Slf4j +@Component +public class OkHttpUtils { + private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); + private static final MediaType XML = MediaType.parse("application/xml; charset=utf-8"); + + @Autowired + private OkHttpClient okHttpClient; + + /** + * get 请求 + * + * @param url 请求url地址 + * @return string + */ + public String doGet(String url) { + return doGet(url, null, null); + } + + + /** + * get 请求 + * + * @param url 请求url地址 + * @param params 请求参数 map + * @return string + */ + public String doGet(String url, Map params) { + return doGet(url, params, null); + } + + /** + * get 请求 + * + * @param url 请求url地址 + * @param headers 请求头字段 {k1, v1 k2, v2, ...} + * @return string + */ + public String doGetWithHeaders(String url, Map headers) { + return doGet(url, null, headers); + } + + + /** + * get 请求 + * + * @param url 请求url地址 + * @param params 请求参数 map + * @param headers 请求头字段 {k1, v1 k2, v2, ...} + * @return string + */ + public String doGet(String url, Map params, Map headers) { + StringBuilder sb = new StringBuilder(url); + if (params != null && params.keySet().size() > 0) { + boolean firstFlag = true; + for (String key : params.keySet()) { + if (firstFlag) { + sb.append("?").append(key).append("=").append(params.get(key)); + firstFlag = false; + } else { + sb.append("&").append(key).append("=").append(params.get(key)); + } + } + } + Request.Builder builder = getBuilderWithHeaders(headers); + Request request = builder.url(sb.toString()).build(); + + log.info("do get request and url[{}]", sb.toString()); + return execute(request); + } + + /** + * post 请求 + * + * @param url 请求url地址 + * @param params 请求参数 map + * @param headers 请求头字段 {k1, v1 k2, v2, ...} + * @return string + */ + public String doPost(String url, Map params, Map headers) { + FormBody.Builder formBuilder = new FormBody.Builder(); + + if (params != null && params.keySet().size() > 0) { + for (String key : params.keySet()) { + formBuilder.add(key, params.get(key)); + } + } + Request.Builder builder = getBuilderWithHeaders(headers); + + Request request = builder.url(url).post(formBuilder.build()).build(); + log.info("do post request and url[{}]", url); + + return execute(request); + } + + + /** + * 获取request Builder + * + * @param headers 请求头字段 {k1, v1 k2, v2, ...} + * @return + */ + private Request.Builder getBuilderWithHeaders(Map headers) { + Request.Builder builder = new Request.Builder(); + if (!MapUtil.isEmpty(headers)) { + for (Map.Entry entry : headers.entrySet()) { + builder.addHeader(entry.getKey(), entry.getValue()); + } + } + return builder; + } + + + /** + * post 请求, 请求数据为 json 的字符串 + * + * @param url 请求url地址 + * @param json 请求数据, json 字符串 + * @return string + */ + public String doPostJson(String url, String json) { + log.info("do post request and url[{}]", url); + return executePost(url, json, JSON, null); + } + + /** + * post 请求, 请求数据为 json 的字符串 + * + * @param url 请求url地址 + * @param json 请求数据, json 字符串 + * @param headers 请求头字段 {k1, v1 k2, v2, ...} + * @return string + */ + public String doPostJsonWithHeaders(String url, String json, Map headers) { + log.info("do post request and url[{}]", url); + return executePost(url, json, JSON, headers); + } + + /** + * post 请求, 请求数据为 xml 的字符串 + * + * @param url 请求url地址 + * @param xml 请求数据, xml 字符串 + * @return string + */ + public String doPostXml(String url, String xml) { + log.info("do post request and url[{}]", url); + return executePost(url, xml, XML, null); + } + + + private String executePost(String url, String data, MediaType contentType, Map headers) { + RequestBody requestBody = RequestBody.create(data.getBytes(StandardCharsets.UTF_8), contentType); + Request.Builder builder = getBuilderWithHeaders(headers); + Request request = builder.url(url).post(requestBody).build(); + + return execute(request); + } + + private String execute(Request request) { + Response response = null; + try { + response = okHttpClient.newCall(request).execute(); + if (response.isSuccessful()) { + return response.body().string(); + } + } catch (Exception e) { + log.error(Throwables.getStackTraceAsString(e)); + } finally { + if (response != null) { + response.close(); + } + } + return ""; + } + +} + diff --git a/austin-web/pom.xml b/austin-web/pom.xml index 196640b..f7e6db8 100644 --- a/austin-web/pom.xml +++ b/austin-web/pom.xml @@ -5,38 +5,38 @@ austin com.java3y.austin - 0.0.2 + 0.0.1-SNAPSHOT 4.0.0 austin-web - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-test - test - - - org.projectlombok - lombok - org.springframework.boot spring-boot-starter-web - cn.hutool - hutool-all - - - com.google.guava - guava + com.java3y.austin + austin-handler + 0.0.1-SNAPSHOT + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + \ No newline at end of file diff --git a/austin-web/src/main/java/com/java3y/austin/AustinApplication.java b/austin-web/src/main/java/com/java3y/austin/AustinApplication.java index 58e43ba..cbee8e3 100644 --- a/austin-web/src/main/java/com/java3y/austin/AustinApplication.java +++ b/austin-web/src/main/java/com/java3y/austin/AustinApplication.java @@ -1,34 +1,37 @@ package com.java3y.austin; -import cn.hutool.core.util.ObjectUtil; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import com.java3y.austin.pojo.SmsParam; +import com.java3y.austin.script.TencentSmsScript; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.Arrays; +import java.util.HashSet; + @SpringBootApplication @RestController public class AustinApplication { - private final Logger logger = LoggerFactory.getLogger(AustinApplication.class); - + @Autowired + private TencentSmsScript tencentSmsScript; public static void main(String[] args) { SpringApplication.run(AustinApplication.class, args); } @GetMapping("/hello") - public String hello(@RequestParam(value = "name", defaultValue = "World") String name) { + public String hello() { + + SmsParam smsParam = SmsParam.builder() + .phones(new HashSet<>(Arrays.asList("//TODO PHONE "))) + .content("3333") + .build(); + + return tencentSmsScript.send(smsParam); - logger.error("error logback for austin"); - logger.info("info logback for austin"); - return String.format("Hello %s!", name); } } diff --git a/austin-web/src/main/resources/application.properties b/austin-web/src/main/resources/application.properties new file mode 100644 index 0000000..82ec95a --- /dev/null +++ b/austin-web/src/main/resources/application.properties @@ -0,0 +1,6 @@ +# ok http配置信息 TODO +ok.http.connect-timeout=30 +ok.http.read-timeout=30 +ok.http.write-timeout=30 +ok.http.max-idle-connections=200 +ok.http.keep-alive-duration=300 diff --git a/pom.xml b/pom.xml index 522a1da..990dc0a 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ com.java3y.austin austin - 0.0.2 + 0.0.1-SNAPSHOT austin austin-message @@ -37,6 +37,7 @@ mysql mysql-connector-java 5.1.35 + @@ -53,30 +54,29 @@ 31.0.1-jre - + - org.apache.commons - commons-collections4 - 4.4 + com.squareup.okhttp3 + okhttp + 4.9.2 + + + + + com.alibaba + fastjson + 1.2.78 + + + + + com.tencentcloudapi + tencentcloud-sdk-java + 3.1.390 - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - +