perf:调整阿里云短信,移除官方sdk

This commit is contained in:
曾文豪
2023-01-10 17:20:42 +08:00
parent b28a99a767
commit 21c7344042
6 changed files with 91 additions and 66 deletions

11
pom.xml
View File

@@ -114,17 +114,6 @@
<version>3.1.4</version> <version>3.1.4</version>
</dependency> </dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.2.8</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.23</version>
</dependency>
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-boot-starter</artifactId>

View File

@@ -23,6 +23,12 @@
<groupId>com.tiesheng</groupId> <groupId>com.tiesheng</groupId>
<artifactId>tiesheng-web</artifactId> <artifactId>tiesheng-web</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
</dependency>
</dependencies> </dependencies>
<repositories> <repositories>

View File

@@ -1,6 +1,8 @@
package com.tiesheng.demo.controller; package com.tiesheng.demo.controller;
import cn.hutool.json.JSONUtil;
import com.tiesheng.annotation.token.TokenIgnore; import com.tiesheng.annotation.token.TokenIgnore;
import com.tiesheng.message.config.aliyun.AliyunSmsConfig;
import com.tiesheng.message.pojos.MessageReqResp; import com.tiesheng.message.pojos.MessageReqResp;
import com.tiesheng.util.config.GlobalConfig; import com.tiesheng.util.config.GlobalConfig;
import com.tiesheng.util.pojos.ApiResp; import com.tiesheng.util.pojos.ApiResp;
@@ -19,8 +21,8 @@ public class TestController {
@Autowired @Autowired
GlobalConfig globalConfig; GlobalConfig globalConfig;
// @Autowired @Autowired
// AliyunSmsConfig aliyunSmsConfig; AliyunSmsConfig aliyunSmsConfig;
@RequestMapping("/index") @RequestMapping("/index")
@TokenIgnore @TokenIgnore
@@ -38,9 +40,9 @@ public class TestController {
@RequestMapping("/send") @RequestMapping("/send")
@TokenIgnore @TokenIgnore
public ApiResp<MessageReqResp> sendMessage() { public ApiResp<MessageReqResp> sendMessage() {
// MessageReqResp reqResp = aliyunSmsConfig.sendSms("13567116463", "SMS_126361543", MessageReqResp reqResp = aliyunSmsConfig.sendSms("13567116463", "SMS_154950909",
// JSONUtil.createObj().putOpt("code", "123456")); JSONUtil.createObj().putOpt("code", "123456"));
return ApiResp.respOK(new MessageReqResp()); return ApiResp.respOK(reqResp);
} }

View File

@@ -25,4 +25,4 @@ tiesheng:
aliyun: aliyun:
access-key-id: LTAI5tJtbgBCnTY5eS4SmrTf access-key-id: LTAI5tJtbgBCnTY5eS4SmrTf
access-key-secret: JIHqpRUFffCHhXaJEVvWN31WcexWqG access-key-secret: JIHqpRUFffCHhXaJEVvWN31WcexWqG
sign-name: 智慧校园 sign-name: 阿里云短信测试

View File

@@ -24,18 +24,6 @@
<artifactId>tiesheng-platform</artifactId> <artifactId>tiesheng-platform</artifactId>
</dependency> </dependency>
<!--阿里云短信登录-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -1,28 +1,34 @@
package com.tiesheng.message.config.aliyun; 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.JSONObject;
import cn.hutool.json.JSONUtil; 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.pojos.MessageReqResp;
import com.tiesheng.message.service.TieshengMessageConfigurer; import com.tiesheng.message.service.TieshengMessageConfigurer;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration; 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 * @author admin
*/ */
@Configuration @Configuration
@ConfigurationProperties(prefix = "tiesheng.aliyun") @ConfigurationProperties(prefix = "tiesheng.aliyun")
@ConditionalOnClass(SendSmsResponse.class)
public class AliyunSmsConfig { public class AliyunSmsConfig {
/**
* 请求地址
*/
private static final String ENDPOINT = "https://dysmsapi.aliyuncs.com";
@Autowired @Autowired
TieshengMessageConfigurer tieshengMessageConfigurer; TieshengMessageConfigurer tieshengMessageConfigurer;
@@ -31,47 +37,82 @@ public class AliyunSmsConfig {
private String signName; private String signName;
/** /**
* 获取一个短信发送客户端 * 特殊字符替换
*
* @param value
* @return
*/ */
private Client getClient() throws Exception { private static String specialUrlEncode(String value) {
try {
Config config = new Config() return URLEncoder.encode(value, "UTF-8").replace("+", "%20")
.setAccessKeyId(getAccessKeyId()) .replace("*", "%2A").replace("%7E", "~");
.setAccessKeySecret(getAccessKeySecret()); } catch (Exception ignore) {
config.setEndpoint("dysmsapi.aliyuncs.com"); }
return new Client(config); 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(); MessageReqResp reqResp = new MessageReqResp();
reqResp.setTarget(phones); reqResp.setTarget(phoneNumbers);
reqResp.setResult(0); reqResp.setResult(1);
reqResp.setContent(JSONUtil.createObj()
.putOpt("PhoneNumbers", phoneNumbers)
.putOpt("SignName", getSignName())
.putOpt("TemplateCode", templateCode)
.putOpt("TemplateParam", params)
.toString());
SendSmsRequest request = new SendSmsRequest(); SortedMap<String, String> queryMap = new TreeMap<>();
request.setPhoneNumbers(phones);
request.setSignName(getSignName()); // 系统参数
request.setTemplateCode(templateCode); 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) { if (params != null) {
request.setTemplateParam(params.toString()); queryMap.put("TemplateParam", params.toString());
} }
reqResp.setContent(JSONUtil.toJsonStr(request)); // 构造带签名字符串
try { StringBuilder sortQueryStringTmp = new StringBuilder();
SendSmsResponse response = getClient().sendSms(request); for (String key : queryMap.keySet()) {
reqResp.setRespBody(JSONUtil.toJsonStr(response.body)); sortQueryStringTmp.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(queryMap.get(key)));
if (Objects.equals(response.getBody().getCode(), "OK")) { }
reqResp.setResult(1); String sortedQueryString = sortQueryStringTmp.substring(1);
} else { String stringToSign = "GET" + "&" + specialUrlEncode("/") + "&" + specialUrlEncode(sortedQueryString);
reqResp.setToast(response.getBody().getMessage()); String digest = SecureUtil.hmacSha1((getAccessKeySecret() + "&").getBytes(StandardCharsets.UTF_8))
} .digestBase64(stringToSign, false);
} catch (Exception e) { String signature = specialUrlEncode(digest);
reqResp.setToast("未知异常,请稍后再试"); 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); tieshengMessageConfigurer.onMessageSend("阿里云短信", reqResp);
@@ -79,7 +120,6 @@ public class AliyunSmsConfig {
return reqResp; return reqResp;
} }
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// setter\getter // setter\getter
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////