diff --git a/pom.xml b/pom.xml
index 2954bfc8..6d54319d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,6 @@
4.0.0
-
org.dromara.sms4j
sms4j
${revision}
@@ -15,17 +14,10 @@
sms4j-comm
sms4j-api
+ sms4j-provider
sms4j-core
sms4j-autoimmit
sms4j-spring-boot-starter
- sms4j-aliyun
- sms4j-tencent
- sms4j-unisms
- sms4j-yunpian
- sms4j-huawei
- sms4j-jdcloud
- sms4j-cloopen
- sms4j-emay
@@ -117,51 +109,10 @@
${revision}
+
org.dromara.sms4j
- sms4j-aliyun
- ${revision}
-
-
-
- org.dromara.sms4j
- sms4j-tencent
- ${revision}
-
-
-
- org.dromara.sms4j
- sms4j-unisms
- ${revision}
-
-
-
- org.dromara.sms4j
- sms4j-yunpian
- ${revision}
-
-
-
- org.dromara.sms4j
- sms4j-huawei
- ${revision}
-
-
-
- org.dromara.sms4j
- sms4j-jdcloud
- ${revision}
-
-
-
- org.dromara.sms4j
- sms4j-cloopen
- ${revision}
-
-
-
- org.dromara.sms4j
- sms4j-emay
+ sms4j-provider
${revision}
diff --git a/sms4j-aliyun/pom.xml b/sms4j-aliyun/pom.xml
deleted file mode 100644
index 7a32a122..00000000
--- a/sms4j-aliyun/pom.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
- 4.0.0
-
- org.dromara.sms4j
- sms4j
- ${revision}
- ../pom.xml
-
-
- sms4j-aliyun
- sms4j-aliyun
- sms4j-aliyun
- ${revision}
-
-
-
-
-
-
- org.dromara.sms4j
- sms4j-comm
-
-
-
- org.dromara.sms4j
- sms4j-api
-
-
-
- com.squareup.okhttp3
- okhttp
- 3.14.9
-
-
-
diff --git a/sms4j-aliyun/src/main/resources/application.properties b/sms4j-aliyun/src/main/resources/application.properties
deleted file mode 100644
index 8b137891..00000000
--- a/sms4j-aliyun/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/sms4j-api/pom.xml b/sms4j-api/pom.xml
index 322ad38a..f70d9ef7 100644
--- a/sms4j-api/pom.xml
+++ b/sms4j-api/pom.xml
@@ -10,12 +10,9 @@
sms4j-api
+
sms4j-api
sms4j-api
- ${revision}
-
-
-
diff --git a/sms4j-autoimmit/pom.xml b/sms4j-autoimmit/pom.xml
index a2829372..fcae4c18 100644
--- a/sms4j-autoimmit/pom.xml
+++ b/sms4j-autoimmit/pom.xml
@@ -10,13 +10,10 @@
sms4j-autoimmit
- ${revision}
+
sms4j-autoimmit
sms4j-autoimmit
-
-
-
diff --git a/sms4j-cloopen/pom.xml b/sms4j-cloopen/pom.xml
deleted file mode 100644
index be20714f..00000000
--- a/sms4j-cloopen/pom.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
- 4.0.0
-
- org.dromara.sms4j
- sms4j
- ${revision}
- ../pom.xml
-
-
- sms4j-cloopen
- sms4j-cloopen
- sms4j-cloopen
- ${revision}
-
-
-
- org.dromara.sms4j
- sms4j-comm
-
-
-
- org.dromara.sms4j
- sms4j-api
-
-
-
\ No newline at end of file
diff --git a/sms4j-cloopen/src/main/resources/application.properties b/sms4j-cloopen/src/main/resources/application.properties
deleted file mode 100644
index 8b137891..00000000
--- a/sms4j-cloopen/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/sms4j-comm/pom.xml b/sms4j-comm/pom.xml
index f6dd0754..56074827 100644
--- a/sms4j-comm/pom.xml
+++ b/sms4j-comm/pom.xml
@@ -10,15 +10,11 @@
sms4j-comm
+
sms4j-comm
sms4j-comm
- ${revision}
-
-
-
-
com.alibaba
fastjson
diff --git a/sms4j-core/pom.xml b/sms4j-core/pom.xml
index 15d7749f..ff307628 100644
--- a/sms4j-core/pom.xml
+++ b/sms4j-core/pom.xml
@@ -10,57 +10,14 @@
sms4j-core
- ${revision}
+
sms4j-core
sms4j-core
-
-
-
org.dromara.sms4j
- sms4j-aliyun
-
-
-
- org.dromara.sms4j
- sms4j-tencent
-
-
-
- org.dromara.sms4j
- sms4j-unisms
-
-
-
- org.dromara.sms4j
- sms4j-yunpian
-
-
-
- org.dromara.sms4j
- sms4j-huawei
-
-
-
- org.dromara.sms4j
- sms4j-jdcloud
-
-
-
- org.dromara.sms4j
- sms4j-emay
-
-
-
- org.dromara.sms4j
- sms4j-cloopen
+ sms4j-provider
-
-
-
-
-
diff --git a/sms4j-core/src/main/java/org/dromara/sms4j/core/factory/SmsFactory.java b/sms4j-core/src/main/java/org/dromara/sms4j/core/factory/SmsFactory.java
index 74d7c7ba..72f89624 100644
--- a/sms4j-core/src/main/java/org/dromara/sms4j/core/factory/SmsFactory.java
+++ b/sms4j-core/src/main/java/org/dromara/sms4j/core/factory/SmsFactory.java
@@ -1,8 +1,5 @@
package org.dromara.sms4j.core.factory;
-import org.dromara.sms4j.comm.config.SmsConfig;
-import org.dromara.sms4j.comm.enumerate.ConfigType;
-import org.dromara.sms4j.comm.factory.BeanFactory;
import org.dromara.sms4j.core.SupplierSqlConfig;
import org.dromara.sms4j.emay.config.EmaySmsConfig;
import org.dromara.sms4j.aliyun.config.AlibabaSmsConfig;
diff --git a/sms4j-emay/pom.xml b/sms4j-emay/pom.xml
deleted file mode 100644
index 4ec944b4..00000000
--- a/sms4j-emay/pom.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
- 4.0.0
-
- org.dromara.sms4j
- sms4j
- ${revision}
- ../pom.xml
-
-
- sms4j-emay
- ${revision}
- sms4j-emay
- sms4j-emay
-
-
-
-
-
-
- org.dromara.sms4j
- sms4j-comm
-
-
-
- org.dromara.sms4j
- sms4j-api
-
-
-
diff --git a/sms4j-emay/src/main/resources/application.properties b/sms4j-emay/src/main/resources/application.properties
deleted file mode 100644
index 8b137891..00000000
--- a/sms4j-emay/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/sms4j-huawei/pom.xml b/sms4j-huawei/pom.xml
deleted file mode 100644
index d5eace98..00000000
--- a/sms4j-huawei/pom.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
- 4.0.0
-
- org.dromara.sms4j
- sms4j
- ${revision}
- ../pom.xml
-
-
- sms4j-huawei
- ${revision}
- sms4j-huawei
- sms4j-huawei
-
-
-
-
-
-
- org.dromara.sms4j
- sms4j-comm
-
-
-
- org.dromara.sms4j
- sms4j-api
-
-
-
-
-
-
diff --git a/sms4j-huawei/src/main/resources/application.properties b/sms4j-huawei/src/main/resources/application.properties
deleted file mode 100644
index 8b137891..00000000
--- a/sms4j-huawei/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/sms4j-jdcloud/src/main/resources/application.properties b/sms4j-jdcloud/src/main/resources/application.properties
deleted file mode 100644
index 8b137891..00000000
--- a/sms4j-jdcloud/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/sms4j-jdcloud/pom.xml b/sms4j-provider/pom.xml
similarity index 74%
rename from sms4j-jdcloud/pom.xml
rename to sms4j-provider/pom.xml
index 97caa96d..1925867a 100644
--- a/sms4j-jdcloud/pom.xml
+++ b/sms4j-provider/pom.xml
@@ -7,29 +7,29 @@
org.dromara.sms4j
sms4j
${revision}
- ../pom.xml
- sms4j-jdcloud
- sms4j-jdcloud
- sms4j-jdcloud
- ${revision}
+ sms4j-provider
+
+ sms4j-provider
+ 短信厂商对接模块(国内短信)
+
+ org.dromara.sms4j
+ sms4j-api
+
+
+
+
+ com.apistd.uni
+ uni-sdk
+
+
com.jdcloud.sdk
sms
-
-
- org.dromara.sms4j
- sms4j-comm
-
-
-
- org.dromara.sms4j
- sms4j-api
-
\ No newline at end of file
diff --git a/sms4j-aliyun/src/main/java/org/dromara/sms4j/aliyun/config/AlibabaConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/config/AlibabaConfig.java
similarity index 95%
rename from sms4j-aliyun/src/main/java/org/dromara/sms4j/aliyun/config/AlibabaConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/config/AlibabaConfig.java
index 912b4d16..b10262d7 100644
--- a/sms4j-aliyun/src/main/java/org/dromara/sms4j/aliyun/config/AlibabaConfig.java
+++ b/sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/config/AlibabaConfig.java
@@ -1,44 +1,44 @@
-package org.dromara.sms4j.aliyun.config;
-
-import lombok.Builder;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import lombok.experimental.SuperBuilder;
-import org.dromara.sms4j.comm.config.BaseConfig;
-
-@Data
-@SuperBuilder
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-public class AlibabaConfig extends BaseConfig {
-
- /**
- * 模板变量名称
- */
- private String templateName;
-
- /**
- * 请求地址
- */
- @Builder.Default
- private String requestUrl = "dysmsapi.aliyuncs.com";
-
- /**
- * 接口名称
- */
- @Builder.Default
- private String action = "SendSms";
-
- /**
- * 接口版本号
- */
- @Builder.Default
- private String version = "2017-05-25";
-
- /**
- * 地域信息默认为 cn-hangzhou
- */
- @Builder.Default
- private String regionId = "cn-hangzhou";
-}
+package org.dromara.sms4j.aliyun.config;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
+import org.dromara.sms4j.comm.config.BaseConfig;
+
+@Data
+@SuperBuilder
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class AlibabaConfig extends BaseConfig {
+
+ /**
+ * 模板变量名称
+ */
+ private String templateName;
+
+ /**
+ * 请求地址
+ */
+ @Builder.Default
+ private String requestUrl = "dysmsapi.aliyuncs.com";
+
+ /**
+ * 接口名称
+ */
+ @Builder.Default
+ private String action = "SendSms";
+
+ /**
+ * 接口版本号
+ */
+ @Builder.Default
+ private String version = "2017-05-25";
+
+ /**
+ * 地域信息默认为 cn-hangzhou
+ */
+ @Builder.Default
+ private String regionId = "cn-hangzhou";
+}
diff --git a/sms4j-aliyun/src/main/java/org/dromara/sms4j/aliyun/config/AlibabaSmsConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/config/AlibabaSmsConfig.java
similarity index 96%
rename from sms4j-aliyun/src/main/java/org/dromara/sms4j/aliyun/config/AlibabaSmsConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/config/AlibabaSmsConfig.java
index 813f158c..ce2b6b4d 100644
--- a/sms4j-aliyun/src/main/java/org/dromara/sms4j/aliyun/config/AlibabaSmsConfig.java
+++ b/sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/config/AlibabaSmsConfig.java
@@ -1,62 +1,62 @@
-package org.dromara.sms4j.aliyun.config;
-
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.sms4j.aliyun.service.AlibabaSmsImpl;
-import org.dromara.sms4j.comm.factory.BeanFactory;
-
-
-/**
- * AlibabaSmsConfig
- *
阿里巴巴对象建造者
- *
- * @author :Wind
- * 2023/4/8 14:54
- **/
-@Slf4j
-public class AlibabaSmsConfig {
-
- private static AlibabaSmsImpl alibabaSms;
-
- private static AlibabaSmsConfig alibabaSmsConfig;
-
- /**
- * getAlibabaSms
- *
建造一个短信实现对像
- *
- * @author :Wind
- */
- public static AlibabaSmsImpl createAlibabaSms(AlibabaConfig alibabaConfig) {
- if (alibabaSmsConfig == null) {
- alibabaSmsConfig = new AlibabaSmsConfig();
- }
- if (alibabaSms == null) {
- alibabaSms = new AlibabaSmsImpl(
- alibabaConfig,
- BeanFactory.getExecutor(),
- BeanFactory.getDelayedTime());
- }
- return alibabaSms;
- }
-
- /**
- * refresh
- *
刷新对象
- *
- * @author :Wind
- */
- public static AlibabaSmsImpl refresh(AlibabaConfig alibabaConfig) {
- // 如果配置对象为空则创建一个
- if (alibabaSmsConfig == null) {
- alibabaSmsConfig = new AlibabaSmsConfig();
- }
- //重新构造一个实现对象
- alibabaSms = new AlibabaSmsImpl(
- alibabaConfig,
- BeanFactory.getExecutor(),
- BeanFactory.getDelayedTime());
- return alibabaSms;
- }
-
- private AlibabaSmsConfig() {
- }
-}
+package org.dromara.sms4j.aliyun.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.sms4j.aliyun.service.AlibabaSmsImpl;
+import org.dromara.sms4j.comm.factory.BeanFactory;
+
+
+/**
+ * AlibabaSmsConfig
+ *
阿里巴巴对象建造者
+ *
+ * @author :Wind
+ * 2023/4/8 14:54
+ **/
+@Slf4j
+public class AlibabaSmsConfig {
+
+ private static AlibabaSmsImpl alibabaSms;
+
+ private static AlibabaSmsConfig alibabaSmsConfig;
+
+ /**
+ * getAlibabaSms
+ *
建造一个短信实现对像
+ *
+ * @author :Wind
+ */
+ public static AlibabaSmsImpl createAlibabaSms(AlibabaConfig alibabaConfig) {
+ if (alibabaSmsConfig == null) {
+ alibabaSmsConfig = new AlibabaSmsConfig();
+ }
+ if (alibabaSms == null) {
+ alibabaSms = new AlibabaSmsImpl(
+ alibabaConfig,
+ BeanFactory.getExecutor(),
+ BeanFactory.getDelayedTime());
+ }
+ return alibabaSms;
+ }
+
+ /**
+ * refresh
+ *
刷新对象
+ *
+ * @author :Wind
+ */
+ public static AlibabaSmsImpl refresh(AlibabaConfig alibabaConfig) {
+ // 如果配置对象为空则创建一个
+ if (alibabaSmsConfig == null) {
+ alibabaSmsConfig = new AlibabaSmsConfig();
+ }
+ //重新构造一个实现对象
+ alibabaSms = new AlibabaSmsImpl(
+ alibabaConfig,
+ BeanFactory.getExecutor(),
+ BeanFactory.getDelayedTime());
+ return alibabaSms;
+ }
+
+ private AlibabaSmsConfig() {
+ }
+}
diff --git a/sms4j-aliyun/src/main/java/org/dromara/sms4j/aliyun/service/AlibabaSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/service/AlibabaSmsImpl.java
similarity index 97%
rename from sms4j-aliyun/src/main/java/org/dromara/sms4j/aliyun/service/AlibabaSmsImpl.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/service/AlibabaSmsImpl.java
index 52a3dcaa..6a59bc6f 100644
--- a/sms4j-aliyun/src/main/java/org/dromara/sms4j/aliyun/service/AlibabaSmsImpl.java
+++ b/sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/service/AlibabaSmsImpl.java
@@ -1,196 +1,196 @@
-package org.dromara.sms4j.aliyun.service;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.dtflys.forest.config.ForestConfiguration;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.sms4j.aliyun.config.AlibabaConfig;
-import org.dromara.sms4j.aliyun.utils.AliyunUtils;
-import org.dromara.sms4j.api.SmsBlend;
-import org.dromara.sms4j.api.callback.CallBack;
-import org.dromara.sms4j.api.entity.SmsResponse;
-import org.dromara.sms4j.comm.annotation.Restricted;
-import org.dromara.sms4j.comm.delayedTime.DelayedTime;
-import org.dromara.sms4j.comm.exception.SmsBlendException;
-import org.dromara.sms4j.comm.factory.BeanFactory;
-
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.TimerTask;
-import java.util.concurrent.Executor;
-
-/**
- *
类名: AlibabaSmsImpl
- *
说明: 阿里云短信实现
- *
- * @author :Wind
- * 2023/3/26 17:16
- **/
-
-@Slf4j
-public class AlibabaSmsImpl implements SmsBlend {
-
- private final AlibabaConfig alibabaSmsConfig;
-
- private final Executor pool;
-
- private final DelayedTime delayed;
-
- private final ForestConfiguration http = BeanFactory.getForestConfiguration();
-
- /**
- * AlibabaSmsImpl
- *
构造器,用于构造短信实现模块
- *
- * @author :Wind
- */
-
- public AlibabaSmsImpl(AlibabaConfig alibabaSmsConfig, Executor pool, DelayedTime delayedTime) {
- this.alibabaSmsConfig = alibabaSmsConfig;
- this.pool = pool;
- this.delayed = delayedTime;
- }
-
- @Override
- @Restricted
- public SmsResponse sendMessage(String phone, String message) {
- LinkedHashMap map = new LinkedHashMap<>();
- map.put(alibabaSmsConfig.getTemplateName(), message);
- return sendMessage(phone, alibabaSmsConfig.getTemplateId(), map);
- }
-
- @Override
- @Restricted
- public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap messages) {
- String messageStr = JSON.toJSONString(messages);
- return getSmsResponse(phone, messageStr, templateId);
- }
-
- @Override
- @Restricted
- public SmsResponse massTexting(List phones, String message) {
- LinkedHashMap map = new LinkedHashMap<>();
- map.put(alibabaSmsConfig.getTemplateName(), message);
- return massTexting(phones, alibabaSmsConfig.getTemplateId(), map);
- }
-
- @Override
- @Restricted
- public SmsResponse massTexting(List phones, String templateId, LinkedHashMap messages) {
- String messageStr = JSON.toJSONString(messages);
- return getSmsResponse(arrayToString(phones), messageStr, templateId);
- }
-
- private SmsResponse getSmsResponse(String phone, String message, String templateId) {
- SmsResponse smsResponse = new SmsResponse();
- String requestUrl;
- String paramStr;
- try {
- requestUrl = AliyunUtils.generateSendSmsRequestUrl(this.alibabaSmsConfig, message, phone, templateId);
- paramStr = AliyunUtils.generateParamBody(alibabaSmsConfig, phone, message, templateId);
- } catch (Exception e) {
- log.error("aliyun send message error", e);
- throw new SmsBlendException(e.getMessage());
- }
- log.info("requestUrl {}", requestUrl);
- http.post(requestUrl)
- .addHeader("Content-Type", "application/x-www-form-urlencoded")
- .addBody(paramStr)
- .onSuccess(((data, req, res) -> {
- JSONObject jsonBody = res.get(JSONObject.class);
- log.info(jsonBody.toJSONString());
- }))
- .onError((ex, req, res) -> {
- JSONObject jsonBody = res.get(JSONObject.class);
- log.info(jsonBody.toJSONString());
- })
- .execute();
- return smsResponse;
- }
-
- @Override
- @Restricted
- public void sendMessageAsync(String phone, String message, CallBack callBack) {
- pool.execute(() -> {
- SmsResponse smsResponse = sendMessage(phone, message);
- callBack.callBack(smsResponse);
- });
- }
-
- @Override
- @Restricted
- public void sendMessageAsync(String phone, String message) {
- pool.execute(() -> {
- sendMessage(phone, message);
- });
- }
-
- @Override
- @Restricted
- public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) {
- pool.execute(() -> {
- SmsResponse smsResponse = sendMessage(phone, templateId, messages);
- callBack.callBack(smsResponse);
- });
- }
-
- @Override
- @Restricted
- public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages) {
- pool.execute(() -> {
- sendMessage(phone, templateId, messages);
- });
- }
-
- @Override
- @Restricted
- public void delayedMessage(String phone, String message, Long delayedTime) {
- this.delayed.schedule(new TimerTask() {
- @Override
- public void run() {
- sendMessage(phone, message);
- }
- }, delayedTime);
- }
-
- @Override
- @Restricted
- public void delayedMessage(String phone, String templateId, LinkedHashMap messages, Long delayedTime) {
- this.delayed.schedule(new TimerTask() {
- @Override
- public void run() {
- sendMessage(phone, templateId, messages);
- }
- }, delayedTime);
- }
-
- @Override
- @Restricted
- public void delayMassTexting(List phones, String message, Long delayedTime) {
- this.delayed.schedule(new TimerTask() {
- @Override
- public void run() {
- massTexting(phones, message);
- }
- }, delayedTime);
- }
-
- @Override
- @Restricted
- public void delayMassTexting(List phones, String templateId, LinkedHashMap messages, Long delayedTime) {
- this.delayed.schedule(new TimerTask() {
- @Override
- public void run() {
- massTexting(phones, templateId, messages);
- }
- }, delayedTime);
- }
-
- private String arrayToString(List list) {
- StringBuilder sb = new StringBuilder();
- for (String s : list) {
- sb.append(",").append("+86").append(s);
- }
- return sb.substring(1);
- }
-}
+package org.dromara.sms4j.aliyun.service;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.config.ForestConfiguration;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.sms4j.aliyun.config.AlibabaConfig;
+import org.dromara.sms4j.aliyun.utils.AliyunUtils;
+import org.dromara.sms4j.api.SmsBlend;
+import org.dromara.sms4j.api.callback.CallBack;
+import org.dromara.sms4j.api.entity.SmsResponse;
+import org.dromara.sms4j.comm.annotation.Restricted;
+import org.dromara.sms4j.comm.delayedTime.DelayedTime;
+import org.dromara.sms4j.comm.exception.SmsBlendException;
+import org.dromara.sms4j.comm.factory.BeanFactory;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.TimerTask;
+import java.util.concurrent.Executor;
+
+/**
+ * 类名: AlibabaSmsImpl
+ *
说明: 阿里云短信实现
+ *
+ * @author :Wind
+ * 2023/3/26 17:16
+ **/
+
+@Slf4j
+public class AlibabaSmsImpl implements SmsBlend {
+
+ private final AlibabaConfig alibabaSmsConfig;
+
+ private final Executor pool;
+
+ private final DelayedTime delayed;
+
+ private final ForestConfiguration http = BeanFactory.getForestConfiguration();
+
+ /**
+ * AlibabaSmsImpl
+ *
构造器,用于构造短信实现模块
+ *
+ * @author :Wind
+ */
+
+ public AlibabaSmsImpl(AlibabaConfig alibabaSmsConfig, Executor pool, DelayedTime delayedTime) {
+ this.alibabaSmsConfig = alibabaSmsConfig;
+ this.pool = pool;
+ this.delayed = delayedTime;
+ }
+
+ @Override
+ @Restricted
+ public SmsResponse sendMessage(String phone, String message) {
+ LinkedHashMap map = new LinkedHashMap<>();
+ map.put(alibabaSmsConfig.getTemplateName(), message);
+ return sendMessage(phone, alibabaSmsConfig.getTemplateId(), map);
+ }
+
+ @Override
+ @Restricted
+ public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap messages) {
+ String messageStr = JSON.toJSONString(messages);
+ return getSmsResponse(phone, messageStr, templateId);
+ }
+
+ @Override
+ @Restricted
+ public SmsResponse massTexting(List phones, String message) {
+ LinkedHashMap map = new LinkedHashMap<>();
+ map.put(alibabaSmsConfig.getTemplateName(), message);
+ return massTexting(phones, alibabaSmsConfig.getTemplateId(), map);
+ }
+
+ @Override
+ @Restricted
+ public SmsResponse massTexting(List phones, String templateId, LinkedHashMap messages) {
+ String messageStr = JSON.toJSONString(messages);
+ return getSmsResponse(arrayToString(phones), messageStr, templateId);
+ }
+
+ private SmsResponse getSmsResponse(String phone, String message, String templateId) {
+ SmsResponse smsResponse = new SmsResponse();
+ String requestUrl;
+ String paramStr;
+ try {
+ requestUrl = AliyunUtils.generateSendSmsRequestUrl(this.alibabaSmsConfig, message, phone, templateId);
+ paramStr = AliyunUtils.generateParamBody(alibabaSmsConfig, phone, message, templateId);
+ } catch (Exception e) {
+ log.error("aliyun send message error", e);
+ throw new SmsBlendException(e.getMessage());
+ }
+ log.info("requestUrl {}", requestUrl);
+ http.post(requestUrl)
+ .addHeader("Content-Type", "application/x-www-form-urlencoded")
+ .addBody(paramStr)
+ .onSuccess(((data, req, res) -> {
+ JSONObject jsonBody = res.get(JSONObject.class);
+ log.info(jsonBody.toJSONString());
+ }))
+ .onError((ex, req, res) -> {
+ JSONObject jsonBody = res.get(JSONObject.class);
+ log.info(jsonBody.toJSONString());
+ })
+ .execute();
+ return smsResponse;
+ }
+
+ @Override
+ @Restricted
+ public void sendMessageAsync(String phone, String message, CallBack callBack) {
+ pool.execute(() -> {
+ SmsResponse smsResponse = sendMessage(phone, message);
+ callBack.callBack(smsResponse);
+ });
+ }
+
+ @Override
+ @Restricted
+ public void sendMessageAsync(String phone, String message) {
+ pool.execute(() -> {
+ sendMessage(phone, message);
+ });
+ }
+
+ @Override
+ @Restricted
+ public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) {
+ pool.execute(() -> {
+ SmsResponse smsResponse = sendMessage(phone, templateId, messages);
+ callBack.callBack(smsResponse);
+ });
+ }
+
+ @Override
+ @Restricted
+ public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages) {
+ pool.execute(() -> {
+ sendMessage(phone, templateId, messages);
+ });
+ }
+
+ @Override
+ @Restricted
+ public void delayedMessage(String phone, String message, Long delayedTime) {
+ this.delayed.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ sendMessage(phone, message);
+ }
+ }, delayedTime);
+ }
+
+ @Override
+ @Restricted
+ public void delayedMessage(String phone, String templateId, LinkedHashMap messages, Long delayedTime) {
+ this.delayed.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ sendMessage(phone, templateId, messages);
+ }
+ }, delayedTime);
+ }
+
+ @Override
+ @Restricted
+ public void delayMassTexting(List phones, String message, Long delayedTime) {
+ this.delayed.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ massTexting(phones, message);
+ }
+ }, delayedTime);
+ }
+
+ @Override
+ @Restricted
+ public void delayMassTexting(List phones, String templateId, LinkedHashMap messages, Long delayedTime) {
+ this.delayed.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ massTexting(phones, templateId, messages);
+ }
+ }, delayedTime);
+ }
+
+ private String arrayToString(List list) {
+ StringBuilder sb = new StringBuilder();
+ for (String s : list) {
+ sb.append(",").append("+86").append(s);
+ }
+ return sb.substring(1);
+ }
+}
diff --git a/sms4j-aliyun/src/main/java/org/dromara/sms4j/aliyun/utils/AliyunUtils.java b/sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/utils/AliyunUtils.java
similarity index 97%
rename from sms4j-aliyun/src/main/java/org/dromara/sms4j/aliyun/utils/AliyunUtils.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/utils/AliyunUtils.java
index e406d0e0..55af6c42 100644
--- a/sms4j-aliyun/src/main/java/org/dromara/sms4j/aliyun/utils/AliyunUtils.java
+++ b/sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/utils/AliyunUtils.java
@@ -1,124 +1,124 @@
-package org.dromara.sms4j.aliyun.utils;
-
-import cn.hutool.core.codec.Base64;
-import org.dromara.sms4j.aliyun.config.AlibabaConfig;
-import org.dromara.sms4j.comm.constant.Constant;
-
-import javax.crypto.Mac;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
-/**
- * @author Richard
- * @date 2023/4/20 16:55
- */
-public class AliyunUtils {
-
- /**
- * 加密方式
- */
- private static final String ALGORITHM = "HMAC-SHA1";
-
- private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
-
- public static String generateSendSmsRequestUrl(AlibabaConfig alibabaConfig, String message, String phone, String templateId) throws Exception {
- // 这里一定要设置GMT时区
- sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));
- Map paras = new HashMap<>();
- // 1. 公共请求参数
- paras.put("SignatureMethod", ALGORITHM);
- paras.put("SignatureNonce", UUID.randomUUID().toString());
- paras.put("AccessKeyId", alibabaConfig.getAccessKeyId());
- paras.put("SignatureVersion", "1.0");
- paras.put("Timestamp", sdf.format(new Date()));
- paras.put("Format", "JSON");
- paras.put("Action", alibabaConfig.getAction());
- paras.put("Version", alibabaConfig.getVersion());
- paras.put("RegionId", alibabaConfig.getRegionId());
- // 2. 业务API参数
- Map paramMap = generateParamMap(alibabaConfig, phone, message, templateId);
- // 3. 参数KEY排序
- Map sortParas = new TreeMap<>(paras);
- sortParas.putAll(paramMap);
- // 4. 构造待签名的字符串
- Iterator it = sortParas.keySet().iterator();
- StringBuilder sortQueryStringTmp = new StringBuilder();
- while (it.hasNext()) {
- String key = it.next();
- sortQueryStringTmp.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(sortParas.get(key)));
- }
-
- String stringToSign = "POST" + "&" +
- specialUrlEncode("/") + "&" +
- specialUrlEncode(sortQueryStringTmp.substring(1));
- String signature = sign(alibabaConfig.getAccessKeySecret() + "&", stringToSign);
- // 5. 生成请求的url参数
- StringBuilder sortQueryString = new StringBuilder();
- it = paras.keySet().iterator();
- while (it.hasNext()) {
- String key = it.next();
- sortQueryString.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(paras.get(key)));
- }
- // 6.生成合法请求URL
- return Constant.HTTPS_PREFIX + alibabaConfig.getRequestUrl() + "/?Signature=" + signature + sortQueryString;
- }
-
- /**
- * url编码
- */
- private static String specialUrlEncode(String value) throws Exception {
- return URLEncoder.encode(value, StandardCharsets.UTF_8.name()).replace("+", "%20")
- .replace("*", "%2A").replace("%7E", "~");
- }
-
- /**
- * 生成签名
- *
- * @param accessSecret accessSecret
- * @param stringToSign 待生成签名的字符串
- */
- private static String sign(String accessSecret, String stringToSign) throws Exception {
- Mac mac = Mac.getInstance("HmacSHA1");
- mac.init(new javax.crypto.spec.SecretKeySpec(accessSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA1"));
- byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
- return Base64.encode(signData);
- }
-
- /**
- * 生成请求body参数
- *
- * @param alibabaConfig 配置数据
- * @param phone 手机号
- * @param message 短信内容
- * @param templateId 模板id
- */
- public static Map generateParamMap(AlibabaConfig alibabaConfig, String phone, String message, String templateId) {
- Map paramMap = new HashMap<>();
- paramMap.put("PhoneNumbers", phone);
- paramMap.put("SignName", alibabaConfig.getSignature());
- paramMap.put("TemplateParam", message);
- paramMap.put("TemplateCode", templateId);
- return paramMap;
- }
-
- /**
- * 生成请求参数body字符串
- *
- * @param alibabaConfig
- * @param phone
- * @param message
- * @param templateId
- */
- public static String generateParamBody(AlibabaConfig alibabaConfig, String phone, String message, String templateId) throws Exception {
- Map paramMap = generateParamMap(alibabaConfig, phone, message, templateId);
- StringBuilder sortQueryString = new StringBuilder();
- for (String key : paramMap.keySet()) {
- sortQueryString.append("&").append(specialUrlEncode(key)).append("=")
- .append(specialUrlEncode(paramMap.get(key)));
- }
- return sortQueryString.substring(1);
- }
-
-}
+package org.dromara.sms4j.aliyun.utils;
+
+import cn.hutool.core.codec.Base64;
+import org.dromara.sms4j.aliyun.config.AlibabaConfig;
+import org.dromara.sms4j.comm.constant.Constant;
+
+import javax.crypto.Mac;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @author Richard
+ * @date 2023/4/20 16:55
+ */
+public class AliyunUtils {
+
+ /**
+ * 加密方式
+ */
+ private static final String ALGORITHM = "HMAC-SHA1";
+
+ private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+
+ public static String generateSendSmsRequestUrl(AlibabaConfig alibabaConfig, String message, String phone, String templateId) throws Exception {
+ // 这里一定要设置GMT时区
+ sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));
+ Map paras = new HashMap<>();
+ // 1. 公共请求参数
+ paras.put("SignatureMethod", ALGORITHM);
+ paras.put("SignatureNonce", UUID.randomUUID().toString());
+ paras.put("AccessKeyId", alibabaConfig.getAccessKeyId());
+ paras.put("SignatureVersion", "1.0");
+ paras.put("Timestamp", sdf.format(new Date()));
+ paras.put("Format", "JSON");
+ paras.put("Action", alibabaConfig.getAction());
+ paras.put("Version", alibabaConfig.getVersion());
+ paras.put("RegionId", alibabaConfig.getRegionId());
+ // 2. 业务API参数
+ Map paramMap = generateParamMap(alibabaConfig, phone, message, templateId);
+ // 3. 参数KEY排序
+ Map sortParas = new TreeMap<>(paras);
+ sortParas.putAll(paramMap);
+ // 4. 构造待签名的字符串
+ Iterator it = sortParas.keySet().iterator();
+ StringBuilder sortQueryStringTmp = new StringBuilder();
+ while (it.hasNext()) {
+ String key = it.next();
+ sortQueryStringTmp.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(sortParas.get(key)));
+ }
+
+ String stringToSign = "POST" + "&" +
+ specialUrlEncode("/") + "&" +
+ specialUrlEncode(sortQueryStringTmp.substring(1));
+ String signature = sign(alibabaConfig.getAccessKeySecret() + "&", stringToSign);
+ // 5. 生成请求的url参数
+ StringBuilder sortQueryString = new StringBuilder();
+ it = paras.keySet().iterator();
+ while (it.hasNext()) {
+ String key = it.next();
+ sortQueryString.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(paras.get(key)));
+ }
+ // 6.生成合法请求URL
+ return Constant.HTTPS_PREFIX + alibabaConfig.getRequestUrl() + "/?Signature=" + signature + sortQueryString;
+ }
+
+ /**
+ * url编码
+ */
+ private static String specialUrlEncode(String value) throws Exception {
+ return URLEncoder.encode(value, StandardCharsets.UTF_8.name()).replace("+", "%20")
+ .replace("*", "%2A").replace("%7E", "~");
+ }
+
+ /**
+ * 生成签名
+ *
+ * @param accessSecret accessSecret
+ * @param stringToSign 待生成签名的字符串
+ */
+ private static String sign(String accessSecret, String stringToSign) throws Exception {
+ Mac mac = Mac.getInstance("HmacSHA1");
+ mac.init(new javax.crypto.spec.SecretKeySpec(accessSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA1"));
+ byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
+ return Base64.encode(signData);
+ }
+
+ /**
+ * 生成请求body参数
+ *
+ * @param alibabaConfig 配置数据
+ * @param phone 手机号
+ * @param message 短信内容
+ * @param templateId 模板id
+ */
+ public static Map generateParamMap(AlibabaConfig alibabaConfig, String phone, String message, String templateId) {
+ Map paramMap = new HashMap<>();
+ paramMap.put("PhoneNumbers", phone);
+ paramMap.put("SignName", alibabaConfig.getSignature());
+ paramMap.put("TemplateParam", message);
+ paramMap.put("TemplateCode", templateId);
+ return paramMap;
+ }
+
+ /**
+ * 生成请求参数body字符串
+ *
+ * @param alibabaConfig
+ * @param phone
+ * @param message
+ * @param templateId
+ */
+ public static String generateParamBody(AlibabaConfig alibabaConfig, String phone, String message, String templateId) throws Exception {
+ Map paramMap = generateParamMap(alibabaConfig, phone, message, templateId);
+ StringBuilder sortQueryString = new StringBuilder();
+ for (String key : paramMap.keySet()) {
+ sortQueryString.append("&").append(specialUrlEncode(key)).append("=")
+ .append(specialUrlEncode(paramMap.get(key)));
+ }
+ return sortQueryString.substring(1);
+ }
+
+}
diff --git a/sms4j-cloopen/src/main/java/org/dromara/sms4j/cloopen/api/CloopenRestApi.java b/sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/api/CloopenRestApi.java
similarity index 100%
rename from sms4j-cloopen/src/main/java/org/dromara/sms4j/cloopen/api/CloopenRestApi.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/api/CloopenRestApi.java
diff --git a/sms4j-cloopen/src/main/java/org/dromara/sms4j/cloopen/config/CloopenConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/config/CloopenConfig.java
similarity index 100%
rename from sms4j-cloopen/src/main/java/org/dromara/sms4j/cloopen/config/CloopenConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/config/CloopenConfig.java
diff --git a/sms4j-cloopen/src/main/java/org/dromara/sms4j/cloopen/config/CloopenSmsConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/config/CloopenSmsConfig.java
similarity index 100%
rename from sms4j-cloopen/src/main/java/org/dromara/sms4j/cloopen/config/CloopenSmsConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/config/CloopenSmsConfig.java
diff --git a/sms4j-cloopen/src/main/java/org/dromara/sms4j/cloopen/service/CloopenSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/service/CloopenSmsImpl.java
similarity index 100%
rename from sms4j-cloopen/src/main/java/org/dromara/sms4j/cloopen/service/CloopenSmsImpl.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/service/CloopenSmsImpl.java
diff --git a/sms4j-cloopen/src/main/java/org/dromara/sms4j/cloopen/util/CloopenHelper.java b/sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/util/CloopenHelper.java
similarity index 100%
rename from sms4j-cloopen/src/main/java/org/dromara/sms4j/cloopen/util/CloopenHelper.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/util/CloopenHelper.java
diff --git a/sms4j-emay/src/main/java/org/dromara/sms4j/emay/config/EmayConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/emay/config/EmayConfig.java
similarity index 100%
rename from sms4j-emay/src/main/java/org/dromara/sms4j/emay/config/EmayConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/emay/config/EmayConfig.java
diff --git a/sms4j-emay/src/main/java/org/dromara/sms4j/emay/config/EmaySmsConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/emay/config/EmaySmsConfig.java
similarity index 100%
rename from sms4j-emay/src/main/java/org/dromara/sms4j/emay/config/EmaySmsConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/emay/config/EmaySmsConfig.java
diff --git a/sms4j-emay/src/main/java/org/dromara/sms4j/emay/service/EmaySmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/emay/service/EmaySmsImpl.java
similarity index 100%
rename from sms4j-emay/src/main/java/org/dromara/sms4j/emay/service/EmaySmsImpl.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/emay/service/EmaySmsImpl.java
diff --git a/sms4j-emay/src/main/java/org/dromara/sms4j/emay/util/EmayBuilder.java b/sms4j-provider/src/main/java/org/dromara/sms4j/emay/util/EmayBuilder.java
similarity index 100%
rename from sms4j-emay/src/main/java/org/dromara/sms4j/emay/util/EmayBuilder.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/emay/util/EmayBuilder.java
diff --git a/sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/config/HuaweiConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/huawei/config/HuaweiConfig.java
similarity index 100%
rename from sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/config/HuaweiConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/huawei/config/HuaweiConfig.java
diff --git a/sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/config/HuaweiSmsConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/huawei/config/HuaweiSmsConfig.java
similarity index 100%
rename from sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/config/HuaweiSmsConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/huawei/config/HuaweiSmsConfig.java
diff --git a/sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/entity/HuaweiError.java b/sms4j-provider/src/main/java/org/dromara/sms4j/huawei/entity/HuaweiError.java
similarity index 100%
rename from sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/entity/HuaweiError.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/huawei/entity/HuaweiError.java
diff --git a/sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/entity/HuaweiResponse.java b/sms4j-provider/src/main/java/org/dromara/sms4j/huawei/entity/HuaweiResponse.java
similarity index 100%
rename from sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/entity/HuaweiResponse.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/huawei/entity/HuaweiResponse.java
diff --git a/sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/entity/SmsId.java b/sms4j-provider/src/main/java/org/dromara/sms4j/huawei/entity/SmsId.java
similarity index 100%
rename from sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/entity/SmsId.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/huawei/entity/SmsId.java
diff --git a/sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/service/HuaweiSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/huawei/service/HuaweiSmsImpl.java
similarity index 100%
rename from sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/service/HuaweiSmsImpl.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/huawei/service/HuaweiSmsImpl.java
diff --git a/sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/utils/HuaweiBuilder.java b/sms4j-provider/src/main/java/org/dromara/sms4j/huawei/utils/HuaweiBuilder.java
similarity index 100%
rename from sms4j-huawei/src/main/java/org/dromara/sms4j/huawei/utils/HuaweiBuilder.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/huawei/utils/HuaweiBuilder.java
diff --git a/sms4j-jdcloud/src/main/java/org/dromara/sms4j/jdcloud/config/JdCloudConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/jdcloud/config/JdCloudConfig.java
similarity index 100%
rename from sms4j-jdcloud/src/main/java/org/dromara/sms4j/jdcloud/config/JdCloudConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/jdcloud/config/JdCloudConfig.java
diff --git a/sms4j-jdcloud/src/main/java/org/dromara/sms4j/jdcloud/config/JdCloudSmsConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/jdcloud/config/JdCloudSmsConfig.java
similarity index 100%
rename from sms4j-jdcloud/src/main/java/org/dromara/sms4j/jdcloud/config/JdCloudSmsConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/jdcloud/config/JdCloudSmsConfig.java
diff --git a/sms4j-jdcloud/src/main/java/org/dromara/sms4j/jdcloud/service/JdCloudSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/jdcloud/service/JdCloudSmsImpl.java
similarity index 100%
rename from sms4j-jdcloud/src/main/java/org/dromara/sms4j/jdcloud/service/JdCloudSmsImpl.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/jdcloud/service/JdCloudSmsImpl.java
diff --git a/sms4j-tencent/src/main/java/org/dromara/sms4j/tencent/config/TencentConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/config/TencentConfig.java
similarity index 95%
rename from sms4j-tencent/src/main/java/org/dromara/sms4j/tencent/config/TencentConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/tencent/config/TencentConfig.java
index 170a698a..7143ab75 100644
--- a/sms4j-tencent/src/main/java/org/dromara/sms4j/tencent/config/TencentConfig.java
+++ b/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/config/TencentConfig.java
@@ -1,52 +1,52 @@
-package org.dromara.sms4j.tencent.config;
-
-import lombok.Builder;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import lombok.experimental.SuperBuilder;
-import org.dromara.sms4j.comm.config.BaseConfig;
-
-@Data
-@SuperBuilder
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-public class TencentConfig extends BaseConfig {
-
- /**
- * 短信sdkAppId
- */
- private String sdkAppId;
-
- /**
- * 地域信息默认为 ap-guangzhou
- */
- @Builder.Default
- private String territory = "ap-guangzhou";
-
- /**
- * 请求超时时间
- */
- @Builder.Default
- private Integer connTimeout = 60;
- /** 请求地址*/
- @Builder.Default
- private String requestUrl = "sms.tencentcloudapi.com";
- /**
- * 接口名称
- */
- @Builder.Default
- private String action = "SendSms";
-
- /**
- * 接口版本
- */
- @Builder.Default
- private String version = "2021-01-11";
-
- /**
- * 服务名
- */
- @Builder.Default
- private String service = "sms";
-}
+package org.dromara.sms4j.tencent.config;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
+import org.dromara.sms4j.comm.config.BaseConfig;
+
+@Data
+@SuperBuilder
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class TencentConfig extends BaseConfig {
+
+ /**
+ * 短信sdkAppId
+ */
+ private String sdkAppId;
+
+ /**
+ * 地域信息默认为 ap-guangzhou
+ */
+ @Builder.Default
+ private String territory = "ap-guangzhou";
+
+ /**
+ * 请求超时时间
+ */
+ @Builder.Default
+ private Integer connTimeout = 60;
+ /** 请求地址*/
+ @Builder.Default
+ private String requestUrl = "sms.tencentcloudapi.com";
+ /**
+ * 接口名称
+ */
+ @Builder.Default
+ private String action = "SendSms";
+
+ /**
+ * 接口版本
+ */
+ @Builder.Default
+ private String version = "2021-01-11";
+
+ /**
+ * 服务名
+ */
+ @Builder.Default
+ private String service = "sms";
+}
diff --git a/sms4j-tencent/src/main/java/org/dromara/sms4j/tencent/config/TencentSmsConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/config/TencentSmsConfig.java
similarity index 96%
rename from sms4j-tencent/src/main/java/org/dromara/sms4j/tencent/config/TencentSmsConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/tencent/config/TencentSmsConfig.java
index e6cada2d..dee0cc4f 100644
--- a/sms4j-tencent/src/main/java/org/dromara/sms4j/tencent/config/TencentSmsConfig.java
+++ b/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/config/TencentSmsConfig.java
@@ -1,52 +1,52 @@
-package org.dromara.sms4j.tencent.config;
-
-import org.dromara.sms4j.comm.factory.BeanFactory;
-import org.dromara.sms4j.tencent.service.TencentSmsImpl;
-
-/**
- * TencentSmsConfig
- * 建造腾讯云短信
- *
- * @author :Wind
- * 2023/4/8 16:05
- **/
-public class TencentSmsConfig {
- private TencentSmsConfig() {
- }
-
- private static TencentSmsImpl tencentSms;
-
- private static TencentSmsConfig tencentSmsConfig;
-
- /**
- * 建造一个腾讯云的短信实现
- */
- public static TencentSmsImpl createTencentSms(TencentConfig tencentConfig) {
- if (tencentSmsConfig == null) {
- tencentSmsConfig = new TencentSmsConfig();
- }
- if (tencentSms == null) {
- tencentSms = new TencentSmsImpl(
- tencentConfig,
- BeanFactory.getExecutor(),
- BeanFactory.getDelayedTime()
- );
- }
- return tencentSms;
- }
-
- /**
- * 刷新对象
- */
- public static TencentSmsImpl refresh(TencentConfig tencentConfig) {
- if (tencentSmsConfig == null) {
- tencentSmsConfig = new TencentSmsConfig();
- }
- tencentSms = new TencentSmsImpl(
- tencentConfig,
- BeanFactory.getExecutor(),
- BeanFactory.getDelayedTime()
- );
- return tencentSms;
- }
-}
+package org.dromara.sms4j.tencent.config;
+
+import org.dromara.sms4j.comm.factory.BeanFactory;
+import org.dromara.sms4j.tencent.service.TencentSmsImpl;
+
+/**
+ * TencentSmsConfig
+ *
建造腾讯云短信
+ *
+ * @author :Wind
+ * 2023/4/8 16:05
+ **/
+public class TencentSmsConfig {
+ private TencentSmsConfig() {
+ }
+
+ private static TencentSmsImpl tencentSms;
+
+ private static TencentSmsConfig tencentSmsConfig;
+
+ /**
+ * 建造一个腾讯云的短信实现
+ */
+ public static TencentSmsImpl createTencentSms(TencentConfig tencentConfig) {
+ if (tencentSmsConfig == null) {
+ tencentSmsConfig = new TencentSmsConfig();
+ }
+ if (tencentSms == null) {
+ tencentSms = new TencentSmsImpl(
+ tencentConfig,
+ BeanFactory.getExecutor(),
+ BeanFactory.getDelayedTime()
+ );
+ }
+ return tencentSms;
+ }
+
+ /**
+ * 刷新对象
+ */
+ public static TencentSmsImpl refresh(TencentConfig tencentConfig) {
+ if (tencentSmsConfig == null) {
+ tencentSmsConfig = new TencentSmsConfig();
+ }
+ tencentSms = new TencentSmsImpl(
+ tencentConfig,
+ BeanFactory.getExecutor(),
+ BeanFactory.getDelayedTime()
+ );
+ return tencentSms;
+ }
+}
diff --git a/sms4j-tencent/src/main/java/org/dromara/sms4j/tencent/service/TencentSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/service/TencentSmsImpl.java
similarity index 97%
rename from sms4j-tencent/src/main/java/org/dromara/sms4j/tencent/service/TencentSmsImpl.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/tencent/service/TencentSmsImpl.java
index 7ad82729..6637a712 100644
--- a/sms4j-tencent/src/main/java/org/dromara/sms4j/tencent/service/TencentSmsImpl.java
+++ b/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/service/TencentSmsImpl.java
@@ -1,205 +1,205 @@
-package org.dromara.sms4j.tencent.service;
-
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.dtflys.forest.config.ForestConfiguration;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.sms4j.api.SmsBlend;
-import org.dromara.sms4j.api.callback.CallBack;
-import org.dromara.sms4j.api.entity.SmsResponse;
-import org.dromara.sms4j.comm.annotation.Restricted;
-import org.dromara.sms4j.comm.constant.Constant;
-import org.dromara.sms4j.comm.delayedTime.DelayedTime;
-import org.dromara.sms4j.comm.exception.SmsBlendException;
-import org.dromara.sms4j.comm.factory.BeanFactory;
-import org.dromara.sms4j.tencent.config.TencentConfig;
-import org.dromara.sms4j.tencent.utils.TencentUtils;
-
-import java.util.*;
-import java.util.concurrent.Executor;
-
-@Slf4j
-public class TencentSmsImpl implements SmsBlend {
-
- private TencentConfig tencentSmsConfig;
-
- private Executor pool;
-
- private DelayedTime delayed;
-
- private final ForestConfiguration http = BeanFactory.getForestConfiguration();
-
- public TencentSmsImpl(TencentConfig tencentSmsConfig, Executor pool, DelayedTime delayed) {
- this.tencentSmsConfig = tencentSmsConfig;
- this.pool = pool;
- this.delayed = delayed;
- }
-
- @Override
- @Restricted
- public SmsResponse sendMessage(String phone, String message) {
- String[] split = message.split("&");
- LinkedHashMap map = new LinkedHashMap<>();
- for (int i = 0; i < split.length; i++) {
- map.put(String.valueOf(i), split[i]);
- }
- return sendMessage(phone, tencentSmsConfig.getTemplateId(), map);
- }
-
- @Override
- @Restricted
- public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap messages) {
- List list = new ArrayList<>();
- for (Map.Entry entry : messages.entrySet()) {
- list.add(entry.getValue());
- }
- String[] s = new String[list.size()];
- return getSmsResponse(new String[]{"+86" + phone}, list.toArray(s), templateId);
- }
-
- @Override
- @Restricted
- public SmsResponse massTexting(List phones, String message) {
- String[] split = message.split("&");
- LinkedHashMap map = new LinkedHashMap<>();
- for (int i = 0; i < split.length; i++) {
- map.put(String.valueOf(i), split[i]);
- }
- return massTexting(phones, tencentSmsConfig.getTemplateId(), map);
- }
-
- @Override
- @Restricted
- public SmsResponse massTexting(List phones, String templateId, LinkedHashMap messages) {
- List list = new ArrayList<>();
- for (Map.Entry entry : messages.entrySet()) {
- list.add(entry.getValue());
- }
- String[] s = new String[list.size()];
- return getSmsResponse(arrayToString(phones), list.toArray(s), templateId);
- }
-
- private SmsResponse getSmsResponse(String[] phones, String[] messages, String templateId) {
- String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
- String signature;
- try {
- signature = TencentUtils.generateSignature(this.tencentSmsConfig, templateId, messages, phones, timestamp);
- } catch (Exception e) {
- log.error("tencent send message error", e);
- throw new SmsBlendException(e.getMessage());
- }
- Map headsMap = TencentUtils.generateHeadsMap(signature, timestamp, tencentSmsConfig.getAction(),
- tencentSmsConfig.getVersion(), tencentSmsConfig.getTerritory(), tencentSmsConfig.getRequestUrl());
- Map requestBody = TencentUtils.generateRequestBody(phones, tencentSmsConfig.getSdkAppId(),
- tencentSmsConfig.getSignature(), templateId, messages);
- SmsResponse smsResponse = new SmsResponse();
- String url = Constant.HTTPS_PREFIX + tencentSmsConfig.getRequestUrl();
- http.post(url)
- .addHeader(headsMap)
- .addBody(requestBody)
- .onSuccess(((data, req, res) -> {
- JSONObject jsonBody = res.get(JSONObject.class);
- JSONObject response = jsonBody.getJSONObject("Response");
- JSONArray sendStatusSet = response.getJSONArray("SendStatusSet");
- smsResponse.setBizId(sendStatusSet.getJSONObject(0).getString("SerialNo"));
- smsResponse.setMessage(sendStatusSet.getJSONObject(0).getString("Message"));
- smsResponse.setCode(sendStatusSet.getJSONObject(0).getString("Code"));
- }))
- .onError((ex, req, res) -> {
- JSONObject jsonBody = res.get(JSONObject.class);
- JSONObject response = jsonBody.getJSONObject("Response");
- JSONArray sendStatusSet = response.getJSONArray("SendStatusSet");
- smsResponse.setErrMessage(sendStatusSet.getJSONObject(0).getString("Message"));
- smsResponse.setErrorCode(sendStatusSet.getJSONObject(0).getString("Code"));
- })
- .execute();
- return smsResponse;
- }
-
- @Override
- @Restricted
- public void sendMessageAsync(String phone, String message, CallBack callBack) {
- pool.execute(() -> {
- SmsResponse smsResponse = sendMessage(phone, message);
- callBack.callBack(smsResponse);
- });
- }
-
- @Override
- @Restricted
- public void sendMessageAsync(String phone, String message) {
- pool.execute(() -> {
- sendMessage(phone, message);
- });
- }
-
- @Override
- @Restricted
- public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) {
- pool.execute(() -> {
- SmsResponse smsResponse = sendMessage(phone, templateId, messages);
- callBack.callBack(smsResponse);
- });
- }
-
- @Override
- @Restricted
- public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages) {
- pool.execute(() -> {
- sendMessage(phone, templateId, messages);
- });
- }
-
- @Override
- @Restricted
- public void delayedMessage(String phone, String message, Long delayedTime) {
- this.delayed.schedule(new TimerTask() {
- @Override
- public void run() {
- sendMessage(phone, message);
- }
- }, delayedTime);
- }
-
- @Override
- @Restricted
- public void delayedMessage(String phone, String templateId, LinkedHashMap messages, Long delayedTime) {
- this.delayed.schedule(new TimerTask() {
- @Override
- public void run() {
- sendMessage(phone, templateId, messages);
- }
- }, delayedTime);
- }
-
- @Override
- @Restricted
- public void delayMassTexting(List phones, String message, Long delayedTime) {
- this.delayed.schedule(new TimerTask() {
- @Override
- public void run() {
- massTexting(phones, message);
- }
- }, delayedTime);
- }
-
- @Override
- @Restricted
- public void delayMassTexting(List phones, String templateId, LinkedHashMap messages, Long delayedTime) {
- this.delayed.schedule(new TimerTask() {
- @Override
- public void run() {
- massTexting(phones, templateId, messages);
- }
- }, delayedTime);
- }
-
- private String[] arrayToString(List list) {
- String[] strs = new String[list.size()];
- List toStr = new ArrayList<>();
- for (String s : list) {
- toStr.add("+86" + s);
- }
- return toStr.toArray(strs);
- }
-}
+package org.dromara.sms4j.tencent.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.config.ForestConfiguration;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.sms4j.api.SmsBlend;
+import org.dromara.sms4j.api.callback.CallBack;
+import org.dromara.sms4j.api.entity.SmsResponse;
+import org.dromara.sms4j.comm.annotation.Restricted;
+import org.dromara.sms4j.comm.constant.Constant;
+import org.dromara.sms4j.comm.delayedTime.DelayedTime;
+import org.dromara.sms4j.comm.exception.SmsBlendException;
+import org.dromara.sms4j.comm.factory.BeanFactory;
+import org.dromara.sms4j.tencent.config.TencentConfig;
+import org.dromara.sms4j.tencent.utils.TencentUtils;
+
+import java.util.*;
+import java.util.concurrent.Executor;
+
+@Slf4j
+public class TencentSmsImpl implements SmsBlend {
+
+ private TencentConfig tencentSmsConfig;
+
+ private Executor pool;
+
+ private DelayedTime delayed;
+
+ private final ForestConfiguration http = BeanFactory.getForestConfiguration();
+
+ public TencentSmsImpl(TencentConfig tencentSmsConfig, Executor pool, DelayedTime delayed) {
+ this.tencentSmsConfig = tencentSmsConfig;
+ this.pool = pool;
+ this.delayed = delayed;
+ }
+
+ @Override
+ @Restricted
+ public SmsResponse sendMessage(String phone, String message) {
+ String[] split = message.split("&");
+ LinkedHashMap map = new LinkedHashMap<>();
+ for (int i = 0; i < split.length; i++) {
+ map.put(String.valueOf(i), split[i]);
+ }
+ return sendMessage(phone, tencentSmsConfig.getTemplateId(), map);
+ }
+
+ @Override
+ @Restricted
+ public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap messages) {
+ List list = new ArrayList<>();
+ for (Map.Entry entry : messages.entrySet()) {
+ list.add(entry.getValue());
+ }
+ String[] s = new String[list.size()];
+ return getSmsResponse(new String[]{"+86" + phone}, list.toArray(s), templateId);
+ }
+
+ @Override
+ @Restricted
+ public SmsResponse massTexting(List phones, String message) {
+ String[] split = message.split("&");
+ LinkedHashMap map = new LinkedHashMap<>();
+ for (int i = 0; i < split.length; i++) {
+ map.put(String.valueOf(i), split[i]);
+ }
+ return massTexting(phones, tencentSmsConfig.getTemplateId(), map);
+ }
+
+ @Override
+ @Restricted
+ public SmsResponse massTexting(List phones, String templateId, LinkedHashMap messages) {
+ List list = new ArrayList<>();
+ for (Map.Entry entry : messages.entrySet()) {
+ list.add(entry.getValue());
+ }
+ String[] s = new String[list.size()];
+ return getSmsResponse(arrayToString(phones), list.toArray(s), templateId);
+ }
+
+ private SmsResponse getSmsResponse(String[] phones, String[] messages, String templateId) {
+ String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+ String signature;
+ try {
+ signature = TencentUtils.generateSignature(this.tencentSmsConfig, templateId, messages, phones, timestamp);
+ } catch (Exception e) {
+ log.error("tencent send message error", e);
+ throw new SmsBlendException(e.getMessage());
+ }
+ Map headsMap = TencentUtils.generateHeadsMap(signature, timestamp, tencentSmsConfig.getAction(),
+ tencentSmsConfig.getVersion(), tencentSmsConfig.getTerritory(), tencentSmsConfig.getRequestUrl());
+ Map requestBody = TencentUtils.generateRequestBody(phones, tencentSmsConfig.getSdkAppId(),
+ tencentSmsConfig.getSignature(), templateId, messages);
+ SmsResponse smsResponse = new SmsResponse();
+ String url = Constant.HTTPS_PREFIX + tencentSmsConfig.getRequestUrl();
+ http.post(url)
+ .addHeader(headsMap)
+ .addBody(requestBody)
+ .onSuccess(((data, req, res) -> {
+ JSONObject jsonBody = res.get(JSONObject.class);
+ JSONObject response = jsonBody.getJSONObject("Response");
+ JSONArray sendStatusSet = response.getJSONArray("SendStatusSet");
+ smsResponse.setBizId(sendStatusSet.getJSONObject(0).getString("SerialNo"));
+ smsResponse.setMessage(sendStatusSet.getJSONObject(0).getString("Message"));
+ smsResponse.setCode(sendStatusSet.getJSONObject(0).getString("Code"));
+ }))
+ .onError((ex, req, res) -> {
+ JSONObject jsonBody = res.get(JSONObject.class);
+ JSONObject response = jsonBody.getJSONObject("Response");
+ JSONArray sendStatusSet = response.getJSONArray("SendStatusSet");
+ smsResponse.setErrMessage(sendStatusSet.getJSONObject(0).getString("Message"));
+ smsResponse.setErrorCode(sendStatusSet.getJSONObject(0).getString("Code"));
+ })
+ .execute();
+ return smsResponse;
+ }
+
+ @Override
+ @Restricted
+ public void sendMessageAsync(String phone, String message, CallBack callBack) {
+ pool.execute(() -> {
+ SmsResponse smsResponse = sendMessage(phone, message);
+ callBack.callBack(smsResponse);
+ });
+ }
+
+ @Override
+ @Restricted
+ public void sendMessageAsync(String phone, String message) {
+ pool.execute(() -> {
+ sendMessage(phone, message);
+ });
+ }
+
+ @Override
+ @Restricted
+ public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) {
+ pool.execute(() -> {
+ SmsResponse smsResponse = sendMessage(phone, templateId, messages);
+ callBack.callBack(smsResponse);
+ });
+ }
+
+ @Override
+ @Restricted
+ public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages) {
+ pool.execute(() -> {
+ sendMessage(phone, templateId, messages);
+ });
+ }
+
+ @Override
+ @Restricted
+ public void delayedMessage(String phone, String message, Long delayedTime) {
+ this.delayed.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ sendMessage(phone, message);
+ }
+ }, delayedTime);
+ }
+
+ @Override
+ @Restricted
+ public void delayedMessage(String phone, String templateId, LinkedHashMap messages, Long delayedTime) {
+ this.delayed.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ sendMessage(phone, templateId, messages);
+ }
+ }, delayedTime);
+ }
+
+ @Override
+ @Restricted
+ public void delayMassTexting(List phones, String message, Long delayedTime) {
+ this.delayed.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ massTexting(phones, message);
+ }
+ }, delayedTime);
+ }
+
+ @Override
+ @Restricted
+ public void delayMassTexting(List phones, String templateId, LinkedHashMap messages, Long delayedTime) {
+ this.delayed.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ massTexting(phones, templateId, messages);
+ }
+ }, delayedTime);
+ }
+
+ private String[] arrayToString(List list) {
+ String[] strs = new String[list.size()];
+ List toStr = new ArrayList<>();
+ for (String s : list) {
+ toStr.add("+86" + s);
+ }
+ return toStr.toArray(strs);
+ }
+}
diff --git a/sms4j-tencent/src/main/java/org/dromara/sms4j/tencent/utils/TencentUtils.java b/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/utils/TencentUtils.java
similarity index 97%
rename from sms4j-tencent/src/main/java/org/dromara/sms4j/tencent/utils/TencentUtils.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/tencent/utils/TencentUtils.java
index 043fb50d..9742a5e4 100644
--- a/sms4j-tencent/src/main/java/org/dromara/sms4j/tencent/utils/TencentUtils.java
+++ b/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/utils/TencentUtils.java
@@ -1,138 +1,138 @@
-package org.dromara.sms4j.tencent.utils;
-
-import com.alibaba.fastjson.JSON;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.sms4j.tencent.config.TencentConfig;
-
-import javax.crypto.Mac;
-import javax.crypto.spec.SecretKeySpec;
-import javax.xml.bind.DatatypeConverter;
-import java.nio.charset.StandardCharsets;
-import java.security.MessageDigest;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TimeZone;
-
-
-/**
- * @author Richard
- * @date 2023-04-18 19:50
- */
-@Slf4j
-public class TencentUtils {
- /**
- * 加密方式
- */
- private static final String ALGORITHM = "TC3-HMAC-SHA256";
- /**
- * 请求方式
- */
- private static final String HTTP_REQUEST_METHOD = "POST";
-
- private static final String CT_JSON = "application/json; charset=utf-8";
-
-
- private static byte[] hmac256(byte[] key, String msg) throws Exception {
- Mac mac = Mac.getInstance("HmacSHA256");
- SecretKeySpec secretKeySpec = new SecretKeySpec(key, mac.getAlgorithm());
- mac.init(secretKeySpec);
- return mac.doFinal(msg.getBytes(StandardCharsets.UTF_8));
- }
-
- private static String sha256Hex(String s) throws Exception {
- MessageDigest md = MessageDigest.getInstance("SHA-256");
- byte[] d = md.digest(s.getBytes(StandardCharsets.UTF_8));
- return DatatypeConverter.printHexBinary(d).toLowerCase();
- }
-
- /**
- * 生成腾讯云发送短信接口签名
- *
- * @param templateId 模板id
- * @param messages 短信内容
- * @param phones 手机号
- * @param timestamp 时间戳
- * @throws Exception
- */
- public static String generateSignature(TencentConfig tencentConfig, String templateId, String[] messages, String[] phones,
- String timestamp) throws Exception {
- // ************* 步骤 1:拼接规范请求串 *************
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
- String date = sdf.format(new Date(Long.parseLong(timestamp + "000")));
- String canonicalUri = "/";
- String canonicalQueryString = "";
- String canonicalHeaders = "content-type:application/json; charset=utf-8\n" + "host:" + tencentConfig.getRequestUrl() + "\n";
- String signedHeaders = "content-type;host";
- HashMap params = new HashMap<>();
- // 实际调用需要更新参数,这里仅作为演示签名验证通过的例子
- params.put("PhoneNumberSet", phones);
- params.put("SmsSdkAppId", tencentConfig.getSdkAppId());
- params.put("SignName", tencentConfig.getSignature());
- params.put("TemplateId", templateId);
- params.put("TemplateParamSet", messages);
- String payload = JSON.toJSONString(params);
- String hashedRequestPayload = sha256Hex(payload);
- String canonicalRequest = HTTP_REQUEST_METHOD + "\n" + canonicalUri + "\n" + canonicalQueryString + "\n"
- + canonicalHeaders + "\n" + signedHeaders + "\n" + hashedRequestPayload;
- // ************* 步骤 2:拼接待签名字符串 *************
- String credentialScope = date + "/" + tencentConfig.getService() + "/" + "tc3_request";
- String hashedCanonicalRequest = sha256Hex(canonicalRequest);
- String stringToSign = ALGORITHM + "\n" + timestamp + "\n" + credentialScope + "\n" + hashedCanonicalRequest;
- // ************* 步骤 3:计算签名 *************
- byte[] secretDate = hmac256(("TC3" + tencentConfig.getAccessKeySecret()).getBytes(StandardCharsets.UTF_8), date);
- byte[] secretService = hmac256(secretDate, tencentConfig.getService());
- byte[] secretSigning = hmac256(secretService, "tc3_request");
- String signature = DatatypeConverter.printHexBinary(hmac256(secretSigning, stringToSign)).toLowerCase();
- // ************* 步骤 4:拼接 Authorization *************
- return ALGORITHM + " " + "Credential=" + tencentConfig.getAccessKeyId() + "/" + credentialScope + ", "
- + "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature;
- }
-
- /**
- * 生成腾讯云短信请求头map
- *
- * @param authorization 签名信息
- * @param timestamp 时间戳
- * @param action 接口名称
- * @param version 接口版本
- * @param territory 服务器地区
- * @param requestUrl 请求地址
- */
- public static Map generateHeadsMap(String authorization, String timestamp, String action,
- String version, String territory, String requestUrl) {
- Map headers = new HashMap<>();
- headers.put("Authorization", authorization);
- headers.put("Content-Type", CT_JSON);
- headers.put("Host", requestUrl);
- headers.put("X-TC-Action", action);
- headers.put("X-TC-Timestamp", timestamp);
- headers.put("X-TC-Version", version);
- headers.put("X-TC-Region", territory);
- return headers;
- }
-
- /**
- * 生成腾讯云短信请求body
- *
- * @param phones 手机号
- * @param sdkAppId appid
- * @param signatureName 短信签名
- * @param templateId 模板id
- * @param templateParamSet 模板参数
- * @return
- */
- public static Map generateRequestBody(String[] phones, String sdkAppId, String signatureName,
- String templateId, String[] templateParamSet) {
- Map requestBody = new HashMap<>();
- requestBody.put("PhoneNumberSet", phones);
- requestBody.put("SmsSdkAppId", sdkAppId);
- requestBody.put("SignName", signatureName);
- requestBody.put("TemplateId", templateId);
- requestBody.put("TemplateParamSet", templateParamSet);
- return requestBody;
- }
-
+package org.dromara.sms4j.tencent.utils;
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.sms4j.tencent.config.TencentConfig;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import javax.xml.bind.DatatypeConverter;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TimeZone;
+
+
+/**
+ * @author Richard
+ * @date 2023-04-18 19:50
+ */
+@Slf4j
+public class TencentUtils {
+ /**
+ * 加密方式
+ */
+ private static final String ALGORITHM = "TC3-HMAC-SHA256";
+ /**
+ * 请求方式
+ */
+ private static final String HTTP_REQUEST_METHOD = "POST";
+
+ private static final String CT_JSON = "application/json; charset=utf-8";
+
+
+ private static byte[] hmac256(byte[] key, String msg) throws Exception {
+ Mac mac = Mac.getInstance("HmacSHA256");
+ SecretKeySpec secretKeySpec = new SecretKeySpec(key, mac.getAlgorithm());
+ mac.init(secretKeySpec);
+ return mac.doFinal(msg.getBytes(StandardCharsets.UTF_8));
+ }
+
+ private static String sha256Hex(String s) throws Exception {
+ MessageDigest md = MessageDigest.getInstance("SHA-256");
+ byte[] d = md.digest(s.getBytes(StandardCharsets.UTF_8));
+ return DatatypeConverter.printHexBinary(d).toLowerCase();
+ }
+
+ /**
+ * 生成腾讯云发送短信接口签名
+ *
+ * @param templateId 模板id
+ * @param messages 短信内容
+ * @param phones 手机号
+ * @param timestamp 时间戳
+ * @throws Exception
+ */
+ public static String generateSignature(TencentConfig tencentConfig, String templateId, String[] messages, String[] phones,
+ String timestamp) throws Exception {
+ // ************* 步骤 1:拼接规范请求串 *************
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+ String date = sdf.format(new Date(Long.parseLong(timestamp + "000")));
+ String canonicalUri = "/";
+ String canonicalQueryString = "";
+ String canonicalHeaders = "content-type:application/json; charset=utf-8\n" + "host:" + tencentConfig.getRequestUrl() + "\n";
+ String signedHeaders = "content-type;host";
+ HashMap params = new HashMap<>();
+ // 实际调用需要更新参数,这里仅作为演示签名验证通过的例子
+ params.put("PhoneNumberSet", phones);
+ params.put("SmsSdkAppId", tencentConfig.getSdkAppId());
+ params.put("SignName", tencentConfig.getSignature());
+ params.put("TemplateId", templateId);
+ params.put("TemplateParamSet", messages);
+ String payload = JSON.toJSONString(params);
+ String hashedRequestPayload = sha256Hex(payload);
+ String canonicalRequest = HTTP_REQUEST_METHOD + "\n" + canonicalUri + "\n" + canonicalQueryString + "\n"
+ + canonicalHeaders + "\n" + signedHeaders + "\n" + hashedRequestPayload;
+ // ************* 步骤 2:拼接待签名字符串 *************
+ String credentialScope = date + "/" + tencentConfig.getService() + "/" + "tc3_request";
+ String hashedCanonicalRequest = sha256Hex(canonicalRequest);
+ String stringToSign = ALGORITHM + "\n" + timestamp + "\n" + credentialScope + "\n" + hashedCanonicalRequest;
+ // ************* 步骤 3:计算签名 *************
+ byte[] secretDate = hmac256(("TC3" + tencentConfig.getAccessKeySecret()).getBytes(StandardCharsets.UTF_8), date);
+ byte[] secretService = hmac256(secretDate, tencentConfig.getService());
+ byte[] secretSigning = hmac256(secretService, "tc3_request");
+ String signature = DatatypeConverter.printHexBinary(hmac256(secretSigning, stringToSign)).toLowerCase();
+ // ************* 步骤 4:拼接 Authorization *************
+ return ALGORITHM + " " + "Credential=" + tencentConfig.getAccessKeyId() + "/" + credentialScope + ", "
+ + "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature;
+ }
+
+ /**
+ * 生成腾讯云短信请求头map
+ *
+ * @param authorization 签名信息
+ * @param timestamp 时间戳
+ * @param action 接口名称
+ * @param version 接口版本
+ * @param territory 服务器地区
+ * @param requestUrl 请求地址
+ */
+ public static Map generateHeadsMap(String authorization, String timestamp, String action,
+ String version, String territory, String requestUrl) {
+ Map headers = new HashMap<>();
+ headers.put("Authorization", authorization);
+ headers.put("Content-Type", CT_JSON);
+ headers.put("Host", requestUrl);
+ headers.put("X-TC-Action", action);
+ headers.put("X-TC-Timestamp", timestamp);
+ headers.put("X-TC-Version", version);
+ headers.put("X-TC-Region", territory);
+ return headers;
+ }
+
+ /**
+ * 生成腾讯云短信请求body
+ *
+ * @param phones 手机号
+ * @param sdkAppId appid
+ * @param signatureName 短信签名
+ * @param templateId 模板id
+ * @param templateParamSet 模板参数
+ * @return
+ */
+ public static Map generateRequestBody(String[] phones, String sdkAppId, String signatureName,
+ String templateId, String[] templateParamSet) {
+ Map requestBody = new HashMap<>();
+ requestBody.put("PhoneNumberSet", phones);
+ requestBody.put("SmsSdkAppId", sdkAppId);
+ requestBody.put("SignName", signatureName);
+ requestBody.put("TemplateId", templateId);
+ requestBody.put("TemplateParamSet", templateParamSet);
+ return requestBody;
+ }
+
}
\ No newline at end of file
diff --git a/sms4j-unisms/src/main/java/org/dromara/sms4j/unisms/config/UniConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/config/UniConfig.java
similarity index 100%
rename from sms4j-unisms/src/main/java/org/dromara/sms4j/unisms/config/UniConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/unisms/config/UniConfig.java
diff --git a/sms4j-unisms/src/main/java/org/dromara/sms4j/unisms/config/UniSmsConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/config/UniSmsConfig.java
similarity index 100%
rename from sms4j-unisms/src/main/java/org/dromara/sms4j/unisms/config/UniSmsConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/unisms/config/UniSmsConfig.java
diff --git a/sms4j-unisms/src/main/java/org/dromara/sms4j/unisms/service/UniSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/service/UniSmsImpl.java
similarity index 99%
rename from sms4j-unisms/src/main/java/org/dromara/sms4j/unisms/service/UniSmsImpl.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/unisms/service/UniSmsImpl.java
index e40129bf..0a0efcbf 100644
--- a/sms4j-unisms/src/main/java/org/dromara/sms4j/unisms/service/UniSmsImpl.java
+++ b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/service/UniSmsImpl.java
@@ -9,7 +9,6 @@ import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.comm.annotation.Restricted;
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
import org.dromara.sms4j.comm.exception.SmsBlendException;
-import org.dromara.sms4j.comm.utils.http.HttpJsonTool;
import org.dromara.sms4j.unisms.config.UniConfig;
import lombok.extern.slf4j.Slf4j;
diff --git a/sms4j-yunpian/src/main/java/org/dromara/sms4j/yunpian/config/YunPianSmsConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/config/YunPianSmsConfig.java
similarity index 100%
rename from sms4j-yunpian/src/main/java/org/dromara/sms4j/yunpian/config/YunPianSmsConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/config/YunPianSmsConfig.java
diff --git a/sms4j-yunpian/src/main/java/org/dromara/sms4j/yunpian/config/YunpianConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/config/YunpianConfig.java
similarity index 100%
rename from sms4j-yunpian/src/main/java/org/dromara/sms4j/yunpian/config/YunpianConfig.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/config/YunpianConfig.java
diff --git a/sms4j-yunpian/src/main/java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java
similarity index 100%
rename from sms4j-yunpian/src/main/java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java
rename to sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java
diff --git a/sms4j-spring-boot-starter/pom.xml b/sms4j-spring-boot-starter/pom.xml
index e6ef98c5..4dd606a1 100644
--- a/sms4j-spring-boot-starter/pom.xml
+++ b/sms4j-spring-boot-starter/pom.xml
@@ -10,13 +10,10 @@
sms4j-spring-boot-starter
- sms4j-spring-boot-starter
- sms4j-spring-boot-starter
- ${revision}
jar
-
-
+ sms4j-spring-boot-starter
+ sms4j-spring-boot-starter
@@ -37,9 +34,4 @@
spring-boot-starter
-
-
-
-
-
diff --git a/sms4j-tencent/pom.xml b/sms4j-tencent/pom.xml
deleted file mode 100644
index ac4a9517..00000000
--- a/sms4j-tencent/pom.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
- 4.0.0
-
- org.dromara.sms4j
- sms4j
- ${revision}
- ../pom.xml
-
-
- sms4j-tencent
- sms4j-tencent
- sms4j-tencent
- ${revision}
-
-
-
-
-
-
- org.dromara.sms4j
- sms4j-comm
-
-
- org.dromara.sms4j
- sms4j-api
-
-
- com.squareup.okhttp3
- okhttp
-
-
-
diff --git a/sms4j-tencent/src/main/resources/application.properties b/sms4j-tencent/src/main/resources/application.properties
deleted file mode 100644
index 8b137891..00000000
--- a/sms4j-tencent/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/sms4j-unisms/pom.xml b/sms4j-unisms/pom.xml
deleted file mode 100644
index d6e8fcae..00000000
--- a/sms4j-unisms/pom.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
- 4.0.0
-
- org.dromara.sms4j
- sms4j
- ${revision}
- ../pom.xml
-
-
- sms4j-unisms
- sms4j-unisms
- sms4j-unisms
- ${revision}
-
-
-
-
-
-
- com.apistd.uni
- uni-sdk
-
-
-
- com.squareup.okhttp3
- okhttp
-
-
-
- org.dromara.sms4j
- sms4j-comm
-
-
-
- org.dromara.sms4j
- sms4j-api
-
-
-
diff --git a/sms4j-unisms/src/main/resources/application.properties b/sms4j-unisms/src/main/resources/application.properties
deleted file mode 100644
index 8b137891..00000000
--- a/sms4j-unisms/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/sms4j-yunpian/pom.xml b/sms4j-yunpian/pom.xml
deleted file mode 100644
index 42434a09..00000000
--- a/sms4j-yunpian/pom.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
- 4.0.0
-
- org.dromara.sms4j
- sms4j
- ${revision}
- ../pom.xml
-
-
- sms4j-yunpian
- sms4j-yunpian
- sms4j-yunpian
- ${revision}
-
-
-
-
-
-
- org.dromara.sms4j
- sms4j-comm
-
-
- org.dromara.sms4j
- sms4j-api
-
-
-
diff --git a/sms4j-yunpian/src/main/resources/application.properties b/sms4j-yunpian/src/main/resources/application.properties
deleted file mode 100644
index 8b137891..00000000
--- a/sms4j-yunpian/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-