From 21c73440422e47ccf4d590d7d29020dee56ad865 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9B=BE=E6=96=87=E8=B1=AA?= <980287353@qq.com>
Date: Tue, 10 Jan 2023 17:20:42 +0800
Subject: [PATCH] =?UTF-8?q?perf=EF=BC=9A=E8=B0=83=E6=95=B4=E9=98=BF?=
=?UTF-8?q?=E9=87=8C=E4=BA=91=E7=9F=AD=E4=BF=A1=EF=BC=8C=E7=A7=BB=E9=99=A4?=
=?UTF-8?q?=E5=AE=98=E6=96=B9sdk?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 11 --
tiesheng-ademo/pom.xml | 6 +
.../demo/controller/TestController.java | 12 +-
.../src/main/resources/application.yml | 2 +-
tiesheng-message/pom.xml | 12 --
.../config/aliyun/AliyunSmsConfig.java | 116 ++++++++++++------
6 files changed, 92 insertions(+), 67 deletions(-)
diff --git a/pom.xml b/pom.xml
index b01af3e..5d91d51 100644
--- a/pom.xml
+++ b/pom.xml
@@ -114,17 +114,6 @@
3.1.4
-
- com.aliyun
- tea-openapi
- 0.2.8
-
-
- com.aliyun
- dysmsapi20170525
- 2.0.23
-
-
com.baomidou
mybatis-plus-boot-starter
diff --git a/tiesheng-ademo/pom.xml b/tiesheng-ademo/pom.xml
index f22e9b7..579c14e 100644
--- a/tiesheng-ademo/pom.xml
+++ b/tiesheng-ademo/pom.xml
@@ -23,6 +23,12 @@
com.tiesheng
tiesheng-web
+
+
+ com.aliyun
+ dysmsapi20170525
+
+
diff --git a/tiesheng-ademo/src/main/java/com/tiesheng/demo/controller/TestController.java b/tiesheng-ademo/src/main/java/com/tiesheng/demo/controller/TestController.java
index e7af80c..5756b51 100644
--- a/tiesheng-ademo/src/main/java/com/tiesheng/demo/controller/TestController.java
+++ b/tiesheng-ademo/src/main/java/com/tiesheng/demo/controller/TestController.java
@@ -1,6 +1,8 @@
package com.tiesheng.demo.controller;
+import cn.hutool.json.JSONUtil;
import com.tiesheng.annotation.token.TokenIgnore;
+import com.tiesheng.message.config.aliyun.AliyunSmsConfig;
import com.tiesheng.message.pojos.MessageReqResp;
import com.tiesheng.util.config.GlobalConfig;
import com.tiesheng.util.pojos.ApiResp;
@@ -19,8 +21,8 @@ public class TestController {
@Autowired
GlobalConfig globalConfig;
-// @Autowired
-// AliyunSmsConfig aliyunSmsConfig;
+ @Autowired
+ AliyunSmsConfig aliyunSmsConfig;
@RequestMapping("/index")
@TokenIgnore
@@ -38,9 +40,9 @@ public class TestController {
@RequestMapping("/send")
@TokenIgnore
public ApiResp sendMessage() {
-// MessageReqResp reqResp = aliyunSmsConfig.sendSms("13567116463", "SMS_126361543",
-// JSONUtil.createObj().putOpt("code", "123456"));
- return ApiResp.respOK(new MessageReqResp());
+ MessageReqResp reqResp = aliyunSmsConfig.sendSms("13567116463", "SMS_154950909",
+ JSONUtil.createObj().putOpt("code", "123456"));
+ return ApiResp.respOK(reqResp);
}
diff --git a/tiesheng-ademo/src/main/resources/application.yml b/tiesheng-ademo/src/main/resources/application.yml
index e2ef78a..457043a 100644
--- a/tiesheng-ademo/src/main/resources/application.yml
+++ b/tiesheng-ademo/src/main/resources/application.yml
@@ -25,4 +25,4 @@ tiesheng:
aliyun:
access-key-id: LTAI5tJtbgBCnTY5eS4SmrTf
access-key-secret: JIHqpRUFffCHhXaJEVvWN31WcexWqG
- sign-name: 智慧校园
+ sign-name: 阿里云短信测试
diff --git a/tiesheng-message/pom.xml b/tiesheng-message/pom.xml
index 7577a2d..fca7676 100644
--- a/tiesheng-message/pom.xml
+++ b/tiesheng-message/pom.xml
@@ -24,18 +24,6 @@
tiesheng-platform
-
-
- com.aliyun
- tea-openapi
- provided
-
-
- com.aliyun
- dysmsapi20170525
- provided
-
-
diff --git a/tiesheng-message/src/main/java/com/tiesheng/message/config/aliyun/AliyunSmsConfig.java b/tiesheng-message/src/main/java/com/tiesheng/message/config/aliyun/AliyunSmsConfig.java
index 157e41b..782f092 100644
--- a/tiesheng-message/src/main/java/com/tiesheng/message/config/aliyun/AliyunSmsConfig.java
+++ b/tiesheng-message/src/main/java/com/tiesheng/message/config/aliyun/AliyunSmsConfig.java
@@ -1,28 +1,34 @@
package com.tiesheng.message.config.aliyun;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
-import com.aliyun.dysmsapi20170525.Client;
-import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
-import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
-import com.aliyun.teaopenapi.models.Config;
import com.tiesheng.message.pojos.MessageReqResp;
import com.tiesheng.message.service.TieshengMessageConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
-import java.util.Objects;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.*;
/**
* @author admin
*/
@Configuration
@ConfigurationProperties(prefix = "tiesheng.aliyun")
-@ConditionalOnClass(SendSmsResponse.class)
public class AliyunSmsConfig {
+ /**
+ * 请求地址
+ */
+ private static final String ENDPOINT = "https://dysmsapi.aliyuncs.com";
+
@Autowired
TieshengMessageConfigurer tieshengMessageConfigurer;
@@ -31,47 +37,82 @@ public class AliyunSmsConfig {
private String signName;
/**
- * 获取一个短信发送客户端
+ * 特殊字符替换
+ *
+ * @param value
+ * @return
*/
- private Client getClient() throws Exception {
-
- Config config = new Config()
- .setAccessKeyId(getAccessKeyId())
- .setAccessKeySecret(getAccessKeySecret());
- config.setEndpoint("dysmsapi.aliyuncs.com");
- return new Client(config);
+ private static String specialUrlEncode(String value) {
+ try {
+ return URLEncoder.encode(value, "UTF-8").replace("+", "%20")
+ .replace("*", "%2A").replace("%7E", "~");
+ } catch (Exception ignore) {
+ }
+ return value;
}
+
/**
- * 发送短信
+ * 创建发送请求
*
- * @return 异常说明,为空是表示正常
+ * @param phoneNumbers 手机号,多个用,隔开
+ * @param templateCode 短信模板
+ * @param params 模板参数
+ * @return
*/
- public MessageReqResp sendSms(String phones, String templateCode, JSONObject params) {
+ public MessageReqResp sendSms(String phoneNumbers, String templateCode, JSONObject params) {
MessageReqResp reqResp = new MessageReqResp();
- reqResp.setTarget(phones);
- reqResp.setResult(0);
-
- SendSmsRequest request = new SendSmsRequest();
- request.setPhoneNumbers(phones);
- request.setSignName(getSignName());
- request.setTemplateCode(templateCode);
+ reqResp.setTarget(phoneNumbers);
+ reqResp.setResult(1);
+ reqResp.setContent(JSONUtil.createObj()
+ .putOpt("PhoneNumbers", phoneNumbers)
+ .putOpt("SignName", getSignName())
+ .putOpt("TemplateCode", templateCode)
+ .putOpt("TemplateParam", params)
+ .toString());
+
+ SortedMap queryMap = new TreeMap<>();
+
+ // 系统参数
+ queryMap.put("AccessKeyId", getAccessKeyId());
+ queryMap.put("SignatureMethod", "HMAC-SHA1");
+ queryMap.put("SignatureNonce", IdUtil.randomUUID());
+ queryMap.put("SignatureVersion", "1.0");
+ SimpleDateFormat dateFormat = DateUtil.newSimpleFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.CHINESE, TimeZone.getTimeZone("0"));
+ queryMap.put("Timestamp", DateUtil.format(DateUtil.date(), dateFormat));
+ queryMap.put("Format", "json");
+
+ // 业务API参数
+ queryMap.put("Action", "SendSms");
+ queryMap.put("Version", "2017-05-25");
+ queryMap.put("RegionId", "cn-hangzhou");
+ queryMap.put("PhoneNumbers", phoneNumbers);
+ queryMap.put("SignName", getSignName());
+ queryMap.put("TemplateCode", templateCode);
if (params != null) {
- request.setTemplateParam(params.toString());
+ queryMap.put("TemplateParam", params.toString());
}
- reqResp.setContent(JSONUtil.toJsonStr(request));
- try {
- SendSmsResponse response = getClient().sendSms(request);
- reqResp.setRespBody(JSONUtil.toJsonStr(response.body));
- if (Objects.equals(response.getBody().getCode(), "OK")) {
- reqResp.setResult(1);
- } else {
- reqResp.setToast(response.getBody().getMessage());
- }
- } catch (Exception e) {
- reqResp.setToast("未知异常,请稍后再试");
+ // 构造带签名字符串
+ StringBuilder sortQueryStringTmp = new StringBuilder();
+ for (String key : queryMap.keySet()) {
+ sortQueryStringTmp.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(queryMap.get(key)));
+ }
+ String sortedQueryString = sortQueryStringTmp.substring(1);
+ String stringToSign = "GET" + "&" + specialUrlEncode("/") + "&" + specialUrlEncode(sortedQueryString);
+ String digest = SecureUtil.hmacSha1((getAccessKeySecret() + "&").getBytes(StandardCharsets.UTF_8))
+ .digestBase64(stringToSign, false);
+ String signature = specialUrlEncode(digest);
+ queryMap.put("Signature", signature);
+
+ // 发送请求
+ String response = HttpUtil.get(ENDPOINT + "?Signature=" + signature + sortQueryStringTmp, 10 * 1000);
+ reqResp.setRespBody(response);
+ JSONObject respObj = JSONUtil.parseObj(response);
+ if (!Objects.equals(respObj.getStr("Code"), "OK")) {
+ reqResp.setResult(0);
+ reqResp.setToast(respObj.getStr("Message"));
}
tieshengMessageConfigurer.onMessageSend("阿里云短信", reqResp);
@@ -79,7 +120,6 @@ public class AliyunSmsConfig {
return reqResp;
}
-
///////////////////////////////////////////////////////////////////////////
// setter\getter
///////////////////////////////////////////////////////////////////////////