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 ///////////////////////////////////////////////////////////////////////////