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