From f0e018b8555d7a62b3e526ef5782daacb9fd71b3 Mon Sep 17 00:00:00 2001 From: moat Date: Wed, 31 Jul 2024 11:45:13 +0800 Subject: [PATCH 01/23] =?UTF-8?q?add=20=E8=81=94=E9=80=9A=E4=B8=80?= =?UTF-8?q?=E4=BF=A1=E9=80=9A=E5=B9=B3=E5=8F=B0=E7=9F=AD=E4=BF=A1=E9=80=9A?= =?UTF-8?q?=E9=81=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms4j/comm/constant/SupplierConstant.java | 4 + .../sms4j/javase/config/SEInitializer.java | 2 + .../yixintong/config/YiXintongConfig.java | 43 ++++++ .../yixintong/config/YiXintongFactory.java | 46 +++++++ .../yixintong/service/YiXintongSmsImpl.java | 128 ++++++++++++++++++ .../sms4j/yixintong/utils/YiXintongUtils.java | 54 ++++++++ .../solon/config/SmsBlendsInitializer.java | 2 + .../src/main/resources/application.yml | 7 + .../org/dromara/sms4j/example/Sms4jTest.java | 28 ++++ .../starter/config/SmsBlendsInitializer.java | 2 + 10 files changed, 316 insertions(+) create mode 100644 sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/config/YiXintongConfig.java create mode 100644 sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/config/YiXintongFactory.java create mode 100644 sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/service/YiXintongSmsImpl.java create mode 100644 sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/utils/YiXintongUtils.java diff --git a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/constant/SupplierConstant.java b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/constant/SupplierConstant.java index 59de4921..31057f38 100644 --- a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/constant/SupplierConstant.java +++ b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/constant/SupplierConstant.java @@ -93,4 +93,8 @@ public abstract class SupplierConstant { * danmi sms */ public static final String DAN_MI = "danmi"; + /** + * 联通一信通 sms + */ + public static final String YIXINTONG = "yixintong"; } diff --git a/sms4j-javase-plugin/src/main/java/org/dromara/sms4j/javase/config/SEInitializer.java b/sms4j-javase-plugin/src/main/java/org/dromara/sms4j/javase/config/SEInitializer.java index 3bd6ce6d..13c04793 100644 --- a/sms4j-javase-plugin/src/main/java/org/dromara/sms4j/javase/config/SEInitializer.java +++ b/sms4j-javase-plugin/src/main/java/org/dromara/sms4j/javase/config/SEInitializer.java @@ -51,6 +51,7 @@ import org.dromara.sms4j.qiniu.config.QiNiuFactory; import org.dromara.sms4j.submail.config.SubMailFactory; import org.dromara.sms4j.tencent.config.TencentFactory; import org.dromara.sms4j.unisms.config.UniFactory; +import org.dromara.sms4j.yixintong.config.YiXintongFactory; import org.dromara.sms4j.yunpian.config.YunPianFactory; import org.dromara.sms4j.zhutong.config.ZhutongFactory; @@ -269,6 +270,7 @@ public class SEInitializer { ProviderFactoryHolder.registerFactory(LuoSiMaoFactory.instance()); ProviderFactoryHolder.registerFactory(SubMailFactory.instance()); ProviderFactoryHolder.registerFactory(DanMiFactory.instance()); + ProviderFactoryHolder.registerFactory(YiXintongFactory.instance()); if (SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { ProviderFactoryHolder.registerFactory(JdCloudFactory.instance()); } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/config/YiXintongConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/config/YiXintongConfig.java new file mode 100644 index 00000000..430d182c --- /dev/null +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/config/YiXintongConfig.java @@ -0,0 +1,43 @@ +package org.dromara.sms4j.yixintong.config; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.sms4j.comm.constant.SupplierConstant; +import org.dromara.sms4j.provider.config.BaseConfig; + +/** + *

类名: YiXintongConfig + *

说明:联通一信通平台配置类 + *

所用到配置项:spCode、f、accessKeyId(用户名)、accessKeySecret(接口密钥)、templateId、retryInterval、maxRetries + * + * @author moat + * @create 2024-07-30 16:50 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class YiXintongConfig extends BaseConfig { + + /** + * 短信发送请求地址 + */ + private String requestUrl = "https://api.ums86.com:9600/sms/Api/Send.do"; + + /** + * 企业编号 + */ + private String spCode; + + /** + * 提交时检测方式 + * 1 --- 提交号码中有效的号码仍正常发出短信,无效的号码在返回参数faillist中列出 + * + * 不为1 或该参数不存在 --- 提交号码中只要有无效的号码,那么所有的号码都不发出短信,无效号码在返回参数faillist中列出 + */ + private String f = "1"; + + + @Override + public String getSupplier() { + return SupplierConstant.YIXINTONG; + } +} diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/config/YiXintongFactory.java b/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/config/YiXintongFactory.java new file mode 100644 index 00000000..4c9573ea --- /dev/null +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/config/YiXintongFactory.java @@ -0,0 +1,46 @@ +package org.dromara.sms4j.yixintong.config; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.sms4j.comm.constant.SupplierConstant; +import org.dromara.sms4j.provider.factory.AbstractProviderFactory; +import org.dromara.sms4j.yixintong.service.YiXintongSmsImpl; + +/** + *

类名: YiXintongFactory + *

说明:联通一信通平台短信对象建造 + * + * @author moat + * @create 2024-07-30 17:10 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class YiXintongFactory extends AbstractProviderFactory { + + private static final YiXintongFactory INSTANCE = new YiXintongFactory(); + + /** + * 获取建造者实例 + * @return 建造者实例 + */ + public static YiXintongFactory instance() { + return INSTANCE; + } + + /** + * createSms + *

建造一个短信实现对像 + */ + @Override + public YiXintongSmsImpl createSms(YiXintongConfig yiXintongConfig) { + return new YiXintongSmsImpl(yiXintongConfig); + } + + /** + * 获取供应商 + * @return 供应商 + */ + @Override + public String getSupplier() { + return SupplierConstant.YIXINTONG; + } +} diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/service/YiXintongSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/service/YiXintongSmsImpl.java new file mode 100644 index 00000000..4711e5ae --- /dev/null +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/service/YiXintongSmsImpl.java @@ -0,0 +1,128 @@ +package org.dromara.sms4j.yixintong.service; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.api.utils.SmsRespUtils; +import org.dromara.sms4j.comm.constant.SupplierConstant; +import org.dromara.sms4j.comm.delayedTime.DelayedTime; +import org.dromara.sms4j.comm.exception.SmsBlendException; +import org.dromara.sms4j.comm.utils.SmsUtils; +import org.dromara.sms4j.provider.service.AbstractSmsBlend; +import org.dromara.sms4j.yixintong.config.YiXintongConfig; +import org.dromara.sms4j.yixintong.utils.YiXintongUtils; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executor; + +/** + *

类名: YiXintongSmsImpl + *

说明:联通一信通 sms + * + * @author moat + * @create 2024-07-30 16:59 + */ +@Slf4j +public class YiXintongSmsImpl extends AbstractSmsBlend { + + private int retry = 0; + + public YiXintongSmsImpl(YiXintongConfig config, Executor pool, DelayedTime delayedTime) { + super(config, pool, delayedTime); + } + + public YiXintongSmsImpl(YiXintongConfig config) { + super(config); + } + + @Override + public String getSupplier() { + return SupplierConstant.YIXINTONG; + } + + @Override + public SmsResponse sendMessage(String phone, String message) { + return getSmsResponse(phone, message, getConfig().getTemplateId()); + } + + @Override + public SmsResponse massTexting(List phones, String message) { + return getSmsResponse(SmsUtils.joinComma(phones), message, getConfig().getTemplateId()); + } + + @Override + public SmsResponse sendMessage(String phone, LinkedHashMap messages) { + throw new SmsBlendException("不支持此方法"); + } + + @Override + public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap messages) { + throw new SmsBlendException("不支持此方法"); + } + + @Override + public SmsResponse massTexting(List phones, String templateId, LinkedHashMap messages) { + throw new SmsBlendException("不支持此方法"); + } + + + private SmsResponse getSmsResponse(String phone, String message, String templateId) { + final YiXintongConfig config = getConfig(); + if (StrUtil.isBlank(phone)){ + log.error("phone is required."); + throw new SmsBlendException("phone is required."); + } + if (StrUtil.isBlank(message)){ + log.error("message is required."); + throw new SmsBlendException("message is required."); + } + // 生成20位流水号 + String serialNumber = SmsUtils.getRandomInt(20); + + Map forms = new HashMap<>(); + forms.put("SpCode", config.getSpCode()); + forms.put("LoginName", config.getAccessKeyId()); + forms.put("Password", config.getAccessKeySecret()); + forms.put("MessageContent", message); + forms.put("UserNumber", phone); + forms.put("templateId", templateId); + forms.put("SerialNumber", serialNumber); + forms.put("ScheduleTime", ""); // 立即发送 + forms.put("f", config.getF()); + + SmsResponse smsResponse; + try { + smsResponse = getResponse(YiXintongUtils.postForm(config.getRequestUrl(), forms)); + } catch (SmsBlendException e) { + smsResponse = errorResp(e.message); + } + if (smsResponse.isSuccess() || retry == config.getMaxRetries()) { + retry = 0; + return smsResponse; + } + return requestRetry(phone, message, templateId); + } + + + + private SmsResponse requestRetry(String phone, String message, String templateId) { + http.safeSleep(getConfig().getRetryInterval()); + retry ++; + log.warn("The SMS has been resent for the {}th time.", retry); + return getSmsResponse(phone, message, templateId); + } + + + /** + * 构造统一短信返回信息 + * @param body 原始响应信息 + * @return 短信返回信息 + */ + private SmsResponse getResponse(String body) { + return SmsRespUtils.resp(body, StrUtil.contains(body, "result=0&"), getConfigId()); + } + +} diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/utils/YiXintongUtils.java b/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/utils/YiXintongUtils.java new file mode 100644 index 00000000..83cb665c --- /dev/null +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/utils/YiXintongUtils.java @@ -0,0 +1,54 @@ +package org.dromara.sms4j.yixintong.utils; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import org.dromara.sms4j.comm.exception.SmsBlendException; + +import java.util.Map; + +/** + *

类名: YiXintongUtils + *

说明:联通一信通工具类 + * + * @author moat + * @create 2024-07-31 9:55 + */ +public class YiXintongUtils { + + + + /** + * 发送post form请求 + * + * @param url 请求地址 + * @param forms 表单参数 + * @return 返回体 + */ + public static String postForm(String url, Map forms) { + return postForm(url, null, forms, "gbk"); + } + + + /** + * 发送post form请求 + * + * @param url 请求地址 + * @param headers 请求头 + * @param forms 表单参数 + * @param charset 字符集编码 + * @return 返回体 + */ + public static String postForm(String url, Map headers, Map forms, String charset) { + try (HttpResponse response = HttpRequest.post(url) + .addHeaders(headers) + .form(forms) + .charset(charset) + .execute()) { + return response.body(); + } catch (Exception e) { + throw new SmsBlendException(e.getMessage()); + } + } + + +} diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java index 0442aa34..1533bfc8 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java @@ -41,6 +41,7 @@ import org.dromara.sms4j.solon.holder.SolonSmsDaoHolder; import org.dromara.sms4j.submail.config.SubMailFactory; import org.dromara.sms4j.tencent.config.TencentFactory; import org.dromara.sms4j.unisms.config.UniFactory; +import org.dromara.sms4j.yixintong.config.YiXintongFactory; import org.dromara.sms4j.yunpian.config.YunPianFactory; import org.dromara.sms4j.zhutong.config.ZhutongFactory; import org.noear.solon.core.AppContext; @@ -137,6 +138,7 @@ public class SmsBlendsInitializer { ProviderFactoryHolder.registerFactory(LuoSiMaoFactory.instance()); ProviderFactoryHolder.registerFactory(SubMailFactory.instance()); ProviderFactoryHolder.registerFactory(DanMiFactory.instance()); + ProviderFactoryHolder.registerFactory(YiXintongFactory.instance()); if(SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { ProviderFactoryHolder.registerFactory(JdCloudFactory.instance()); } diff --git a/sms4j-spring-boot-example/src/main/resources/application.yml b/sms4j-spring-boot-example/src/main/resources/application.yml index 1780baae..d43fe466 100644 --- a/sms4j-spring-boot-example/src/main/resources/application.yml +++ b/sms4j-spring-boot-example/src/main/resources/application.yml @@ -155,6 +155,13 @@ sms: accessKeyId: ACCOUNT SID accessKeySecret: AUTH TOKEN action: 默认请求方法 distributor/sendSMS + # 一信通 + yixintong: + sp-code: xxxxxx #(必填)企业编号 + access-key-id: xxxxxx #(必填)用户名 + access-key-secret: 324gaxxxxxxxxxxxxxxxxx9sdf89 #(必填)接口密钥(正式帐户需要登陆平台,接口业务-接口申请右侧钥匙状图标查看或获取,接口密钥获取后十分钟生效) + template-id: #(可选)模板编号(若配置此参数,则会默认使用该模板,以便提高服务方性能) + f: 1 #(可选)默认为1,提交时检测方式 sms-oa: config-type: yaml diff --git a/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java index a45a69c8..14e216a8 100644 --- a/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java +++ b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java @@ -1,5 +1,6 @@ package org.dromara.sms4j.example; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.UUID; @@ -526,4 +527,31 @@ public class Sms4jTest { Assert.isTrue(smsResponse5.isSuccess()); } + + /** + * 联通一信通模板 + */ + @Test + public void yixintongSmsTest() { + if (StrUtil.isBlank(PHONE)) { + return; + } + + //短信发送模板:你有一项编号为{xxxxxxxxx}的事务需要处理{x} + //其中的{xxxxxx}代表短信模板中的变量部分,可变化,一个x代表一个字或者字符,{}为变量标识,在发送时不用传。实发变量字数小于等于x的个数。 + + // 单发 + String message1 = StrUtil.format("你有一项编号为{}的事务需要处理。", SmsUtils.getRandomInt(6)); + SmsResponse smsResponse1 = SmsFactory.getBySupplier(SupplierConstant.YIXINTONG).sendMessage(PHONE, message1); + log.info(JSONUtil.toJsonStr(smsResponse1)); + Assert.isTrue(smsResponse1.isSuccess()); + + // 群发 + List phones = CollectionUtil.toList("2222222222"); + String message2 = StrUtil.format("你有一项编号为{}的事务需要处理。", SmsUtils.getRandomInt(6)); + SmsResponse smsResponse2 = SmsFactory.getBySupplier(SupplierConstant.YIXINTONG).massTexting(phones, message2); + log.info(JSONUtil.toJsonStr(smsResponse2)); + Assert.isTrue(smsResponse2.isSuccess()); + } + } diff --git a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java index 6e85edd9..6f0f5ed7 100644 --- a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java +++ b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java @@ -43,6 +43,7 @@ import org.dromara.sms4j.starter.adepter.ConfigCombineMapAdaptor; import org.dromara.sms4j.submail.config.SubMailFactory; import org.dromara.sms4j.tencent.config.TencentFactory; import org.dromara.sms4j.unisms.config.UniFactory; +import org.dromara.sms4j.yixintong.config.YiXintongFactory; import org.dromara.sms4j.yunpian.config.YunPianFactory; import org.dromara.sms4j.zhutong.config.ZhutongFactory; import org.springframework.beans.factory.ObjectProvider; @@ -152,6 +153,7 @@ public class SmsBlendsInitializer { ProviderFactoryHolder.registerFactory(LuoSiMaoFactory.instance()); ProviderFactoryHolder.registerFactory(SubMailFactory.instance()); ProviderFactoryHolder.registerFactory(DanMiFactory.instance()); + ProviderFactoryHolder.registerFactory(YiXintongFactory.instance()); if (SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { if (SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { ProviderFactoryHolder.registerFactory(JdCloudFactory.instance()); From d921679af402116de5f63b0aef959db7846c7c4c Mon Sep 17 00:00:00 2001 From: moat Date: Fri, 2 Aug 2024 10:09:30 +0800 Subject: [PATCH 02/23] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E7=9F=AD?= =?UTF-8?q?=E4=BF=A1=E5=89=8D=E7=BD=AE=E7=AD=BE=E5=90=8D=E7=BC=96=E5=8F=B7?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/sms4j/yixintong/config/YiXintongConfig.java | 7 ++++++- .../dromara/sms4j/yixintong/service/YiXintongSmsImpl.java | 1 + .../src/main/resources/application.yml | 1 + .../src/test/java/org/dromara/sms4j/example/Sms4jTest.java | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/config/YiXintongConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/config/YiXintongConfig.java index 430d182c..36fabb2e 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/config/YiXintongConfig.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/config/YiXintongConfig.java @@ -8,7 +8,7 @@ import org.dromara.sms4j.provider.config.BaseConfig; /** *

类名: YiXintongConfig *

说明:联通一信通平台配置类 - *

所用到配置项:spCode、f、accessKeyId(用户名)、accessKeySecret(接口密钥)、templateId、retryInterval、maxRetries + *

所用到配置项:spCode、f、accessKeyId(用户名)、accessKeySecret(接口密钥)、signCode、templateId、retryInterval、maxRetries * * @author moat * @create 2024-07-30 16:50 @@ -27,6 +27,11 @@ public class YiXintongConfig extends BaseConfig { */ private String spCode; + /** + * 签名编号 + */ + private String signCode; + /** * 提交时检测方式 * 1 --- 提交号码中有效的号码仍正常发出短信,无效的号码在返回参数faillist中列出 diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/service/YiXintongSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/service/YiXintongSmsImpl.java index 4711e5ae..c6b2996b 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/service/YiXintongSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/yixintong/service/YiXintongSmsImpl.java @@ -92,6 +92,7 @@ public class YiXintongSmsImpl extends AbstractSmsBlend { forms.put("SerialNumber", serialNumber); forms.put("ScheduleTime", ""); // 立即发送 forms.put("f", config.getF()); + forms.put("signCode", config.getSignCode()); SmsResponse smsResponse; try { diff --git a/sms4j-spring-boot-example/src/main/resources/application.yml b/sms4j-spring-boot-example/src/main/resources/application.yml index d43fe466..4b906f27 100644 --- a/sms4j-spring-boot-example/src/main/resources/application.yml +++ b/sms4j-spring-boot-example/src/main/resources/application.yml @@ -161,6 +161,7 @@ sms: access-key-id: xxxxxx #(必填)用户名 access-key-secret: 324gaxxxxxxxxxxxxxxxxx9sdf89 #(必填)接口密钥(正式帐户需要登陆平台,接口业务-接口申请右侧钥匙状图标查看或获取,接口密钥获取后十分钟生效) template-id: #(可选)模板编号(若配置此参数,则会默认使用该模板,以便提高服务方性能) + sign-code: #(可选)短信前置签名编号(登陆平台-接口业务-我的签名查看) f: 1 #(可选)默认为1,提交时检测方式 sms-oa: diff --git a/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java index 14e216a8..cca4a1f3 100644 --- a/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java +++ b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java @@ -547,7 +547,7 @@ public class Sms4jTest { Assert.isTrue(smsResponse1.isSuccess()); // 群发 - List phones = CollectionUtil.toList("2222222222"); + List phones = CollectionUtil.toList(PHONE); String message2 = StrUtil.format("你有一项编号为{}的事务需要处理。", SmsUtils.getRandomInt(6)); SmsResponse smsResponse2 = SmsFactory.getBySupplier(SupplierConstant.YIXINTONG).massTexting(phones, message2); log.info(JSONUtil.toJsonStr(smsResponse2)); From 3f9c22a04d25a56a6288253c2cfdc774d6fda36e Mon Sep 17 00:00:00 2001 From: dongfeng Date: Thu, 17 Oct 2024 22:36:52 +0800 Subject: [PATCH 03/23] =?UTF-8?q?=E4=BF=AE=E5=A4=8Doa=E7=9A=84yml=E6=A1=88?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms4j-spring-boot-example/src/main/resources/application.yml b/sms4j-spring-boot-example/src/main/resources/application.yml index 4b906f27..6018467c 100644 --- a/sms4j-spring-boot-example/src/main/resources/application.yml +++ b/sms4j-spring-boot-example/src/main/resources/application.yml @@ -169,15 +169,15 @@ sms-oa: oas: oaDingTalkByYaml: # configId isEnable: true # 表示该配置是否生效(默认生效,false表示不生效) - supplier: dingding # 厂商标识 + supplier: ding_ding # 厂商标识 tokenId: 您的accessKey sign: 您的sign oaByteTalkByYaml: # configId - supplier: feishu # 厂商标识 + supplier: byte_talk # 厂商标识 tokenId: 您的accessKey sign: 您的sign oaWeTalkByYaml: - supplier: wetalk # 厂商标识 + supplier: we_talk # 厂商标识 tokenId: 您的sign core-pool-size: 20 queue-capacity: 20 From 95601131cd600db827c8256ec12cc1caf05d1ea6 Mon Sep 17 00:00:00 2001 From: dongfeng Date: Thu, 17 Oct 2024 22:39:01 +0800 Subject: [PATCH 04/23] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20Qualifier=20?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E9=85=8D=E7=BD=AEMap=E6=B3=A8=E5=85=A5Bean?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E5=86=B3OA=E4=B8=8ESms=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E5=AD=98=E5=9C=A8Bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/oa/core/config/OaSupplierConfig.java | 3 ++- .../org/dromara/sms4j/starter/config/SupplierConfig.java | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java index bc56064d..e4dbbb6f 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java @@ -3,6 +3,7 @@ package org.dromara.oa.core.config; import org.dromara.oa.api.OaSender; import org.dromara.oa.core.provider.config.OaConfig; import org.dromara.oa.core.provider.factory.OaBaseProviderFactory; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -31,7 +32,7 @@ public class OaSupplierConfig { protected OaBlendsInitializer smsOasInitializer( List> factoryList, OaConfig oaConfig, - Map> oas) { + @Qualifier("oas") Map> oas) { return new OaBlendsInitializer(factoryList,oaConfig,oas); } } diff --git a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SupplierConfig.java b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SupplierConfig.java index a4760904..db71fbe4 100644 --- a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SupplierConfig.java +++ b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SupplierConfig.java @@ -9,6 +9,7 @@ import org.dromara.sms4j.core.datainterface.SmsReadConfig; import org.dromara.sms4j.provider.config.SmsConfig; import org.dromara.sms4j.provider.factory.BaseProviderFactory; import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -34,7 +35,7 @@ public class SupplierConfig { @Bean @ConditionalOnBean({SmsConfig.class}) @SneakyThrows - protected List> factoryList(Map> blends, SmsConfig smsConfig) { + protected List> factoryList(@Qualifier("blends") Map> blends, SmsConfig smsConfig) { //注入自定义实现工厂 List> factoryList = new ArrayList<>(); if (ConfigType.YAML.equals(smsConfig.getConfigType())) { @@ -55,7 +56,7 @@ public class SupplierConfig { @Bean protected SmsBlendsInitializer smsBlendsInitializer(List> factoryList, SmsConfig smsConfig, - Map> blends, + @Qualifier("blends") Map> blends, ObjectProvider extendsSmsConfigs) { return new SmsBlendsInitializer(factoryList, smsConfig, blends, extendsSmsConfigs); } From 1a31bb5189ef16de8f7c8b6246198d109cf1f9d0 Mon Sep 17 00:00:00 2001 From: Bleachtred Date: Wed, 23 Oct 2024 03:07:44 +0000 Subject: [PATCH 05/23] =?UTF-8?q?update=20sms4j-provider/src/main/java/org?= =?UTF-8?q?/dromara/sms4j/submail/service/SubMailSmsImpl.java.=20fix=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8DSubMail=E8=8E=B7=E5=8F=96timestamp=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E7=94=B1=E4=BA=8E=E5=8F=96=E5=80=BCkey=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=AF=BC=E8=87=B4=E6=97=A0=E6=B3=95=E8=8E=B7=E5=8F=96?= =?UTF-8?q?timestamp=EF=BC=8C=E5=AF=BC=E8=87=B4=E7=9F=AD=E4=BF=A1=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bleachtred --- .../java/org/dromara/sms4j/submail/service/SubMailSmsImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/submail/service/SubMailSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/submail/service/SubMailSmsImpl.java index 9ead7692..16f8ccab 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/submail/service/SubMailSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/submail/service/SubMailSmsImpl.java @@ -360,6 +360,6 @@ public class SubMailSmsImpl extends AbstractSmsBlend { private String timestamp(){ JSONObject resp = http.getUrl("https://api-v4.mysubmail.com/service/timestamp"); - return resp.getStr("resp"); + return resp.getStr("timestamp"); } } \ No newline at end of file From 8aca0fd95766e4e4e5bd4f4c7f0a35d10c0e63d2 Mon Sep 17 00:00:00 2001 From: Bleachtred Date: Wed, 23 Oct 2024 03:13:00 +0000 Subject: [PATCH 06/23] =?UTF-8?q?update=20sms4j-provider/src/main/java/org?= =?UTF-8?q?/dromara/sms4j/mas/utils/MasUtils.java.=20fix=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=B8=AD=E5=9B=BD=E7=A7=BB=E5=8A=A8=20=E4=BA=91MAS=20?= =?UTF-8?q?addSerial=E5=8F=82=E6=95=B0=E4=B8=BA=E7=A9=BA=E6=97=B6=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E6=94=BE=E5=88=B0map=E4=B8=AD=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E5=8F=91=E9=80=81=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bleachtred --- .../src/main/java/org/dromara/sms4j/mas/utils/MasUtils.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/mas/utils/MasUtils.java b/sms4j-provider/src/main/java/org/dromara/sms4j/mas/utils/MasUtils.java index 7c64e78d..f3e7be43 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/mas/utils/MasUtils.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/mas/utils/MasUtils.java @@ -65,6 +65,8 @@ public class MasUtils { if (StrUtil.isNotEmpty(config.getAddSerial())){ map.put("addSerial", config.getAddSerial().trim()); sb.append(config.getAddSerial().trim()); + }else { + map.put("addSerial", ""); } map.put("mac", DigestUtil.md5Hex(sb.toString(), StandardCharsets.UTF_8)); From 8a0dd4bc3ddd5ea60dc13eb2f8da670fa2e9bc6e Mon Sep 17 00:00:00 2001 From: bleachtred Date: Wed, 23 Oct 2024 11:23:40 +0800 Subject: [PATCH 07/23] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E7=99=BE=E5=BA=A6=E6=8E=A5=E5=8F=A3=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E7=BC=BA=E5=B0=91=E8=AF=B7=E6=B1=82=E5=A4=B4=20#IAR2RU?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dromara/sms4j/baidu/utils/BaiduUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/utils/BaiduUtils.java b/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/utils/BaiduUtils.java index fe609a0b..6234a865 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/utils/BaiduUtils.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/utils/BaiduUtils.java @@ -98,6 +98,7 @@ public class BaiduUtils { Map headers = new HashMap<>(2); headers.put(Constant.AUTHORIZATION, authorization); headers.put("host", config.getHost()); + headers.put("x-bce-date", SmsDateUtils.normDateGmt8(new Date())); return headers; } From 30c4488cde0580edfc3a6075f9be85e0e5885050 Mon Sep 17 00:00:00 2001 From: bleachtred Date: Wed, 23 Oct 2024 11:27:07 +0800 Subject: [PATCH 08/23] =?UTF-8?q?update=20=E5=8C=85=E5=90=8Dadepter=20=3D>?= =?UTF-8?q?=20adaptor=20#I98OR2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starter/{adepter => adaptor}/ConfigCombineMapAdaptor.java | 2 +- .../org/dromara/sms4j/starter/config/SmsBlendsInitializer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/{adepter => adaptor}/ConfigCombineMapAdaptor.java (97%) diff --git a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/adepter/ConfigCombineMapAdaptor.java b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/adaptor/ConfigCombineMapAdaptor.java similarity index 97% rename from sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/adepter/ConfigCombineMapAdaptor.java rename to sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/adaptor/ConfigCombineMapAdaptor.java index 1320e42f..c6d2c335 100644 --- a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/adepter/ConfigCombineMapAdaptor.java +++ b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/adaptor/ConfigCombineMapAdaptor.java @@ -1,4 +1,4 @@ -package org.dromara.sms4j.starter.adepter; +package org.dromara.sms4j.starter.adaptor; import cn.hutool.core.bean.BeanUtil; import org.dromara.sms4j.core.datainterface.SmsReadConfig; diff --git a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java index cb373ddf..95787d73 100644 --- a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java +++ b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java @@ -38,7 +38,7 @@ import org.dromara.sms4j.provider.config.SmsConfig; import org.dromara.sms4j.provider.factory.BaseProviderFactory; import org.dromara.sms4j.provider.factory.ProviderFactoryHolder; import org.dromara.sms4j.qiniu.config.QiNiuFactory; -import org.dromara.sms4j.starter.adepter.ConfigCombineMapAdaptor; +import org.dromara.sms4j.starter.adaptor.ConfigCombineMapAdaptor; import org.dromara.sms4j.submail.config.SubMailFactory; import org.dromara.sms4j.tencent.config.TencentFactory; import org.dromara.sms4j.unisms.config.UniFactory; From 109f50cfd138e9478ed7e148b167a0d101df3d3a Mon Sep 17 00:00:00 2001 From: bleachtred Date: Wed, 23 Oct 2024 13:21:58 +0800 Subject: [PATCH 09/23] =?UTF-8?q?fix=20=E4=B8=A4=E4=B8=AA=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E6=8F=92=E4=BB=B6=E6=A0=B8=E5=BF=83=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E6=AD=A5=20#I9CWJI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../email/jakarta/api/package-info.java | 6 +++++ .../jakarta/comm/entity/MailMessage.java | 19 +++++++++++++ .../email/jakarta/comm/package-info.java | 6 +++++ .../email/jakarta/comm/utils/HtmlUtil.java | 16 ++++++----- .../email/jakarta/comm/utils/ZipUtils.java | 6 +---- .../jakarta/core/factory/MailFactory.java | 6 ++--- .../jakarta/core/factory/MonitorFactory.java | 10 +++---- .../email/jakarta/core/service/MailBuild.java | 4 +-- .../jakarta/core/service/MailService.java | 27 ++++++++++++++----- 9 files changed, 71 insertions(+), 29 deletions(-) create mode 100644 sms4j-email-jakarta/sms4j-email-jakarta-api/src/main/java/org/dromara/email/jakarta/api/package-info.java create mode 100644 sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/package-info.java diff --git a/sms4j-email-jakarta/sms4j-email-jakarta-api/src/main/java/org/dromara/email/jakarta/api/package-info.java b/sms4j-email-jakarta/sms4j-email-jakarta-api/src/main/java/org/dromara/email/jakarta/api/package-info.java new file mode 100644 index 00000000..9332030e --- /dev/null +++ b/sms4j-email-jakarta/sms4j-email-jakarta-api/src/main/java/org/dromara/email/jakarta/api/package-info.java @@ -0,0 +1,6 @@ +/** + *

邮件插件api模块 + * @author :Wind + * 2024/10/23 10:58 + **/ +package org.dromara.email.jakarta.api; \ No newline at end of file diff --git a/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/entity/MailMessage.java b/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/entity/MailMessage.java index 829715ad..827264c3 100644 --- a/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/entity/MailMessage.java +++ b/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/entity/MailMessage.java @@ -3,6 +3,7 @@ package org.dromara.email.jakarta.comm.entity; import lombok.Getter; import org.dromara.email.jakarta.comm.utils.ReflectUtil; +import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; @@ -27,6 +28,12 @@ public class MailMessage { /** html模板文件的输入流,可来自任意可读取位置*/ private InputStream htmlInputStream; + /** html内容,可以存在模板变量*/ + private String htmlContent; + + /** html 模板文件的File对象*/ + private File htmlFile; + /** html 模板参数*/ private Map htmlValues; @@ -141,6 +148,18 @@ public class MailMessage { return this; } + /** html模板文件的File对象*/ + public MailsBuilder html(File htmlFile){ + mailMessage.htmlFile = htmlFile; + return this; + } + + /** html内容直接输入*/ + public MailsBuilder htmlContent(String htmlContent){ + mailMessage.htmlContent = htmlContent; + return this; + } + /** html 模板参数*/ public MailsBuilder htmlValues(String key, String value){ if (mailMessage.htmlValues == null){ diff --git a/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/package-info.java b/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/package-info.java new file mode 100644 index 00000000..c6ad6bc4 --- /dev/null +++ b/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/package-info.java @@ -0,0 +1,6 @@ +/** + *

邮件插件通用模块 + * @author :Wind + * 2024/10/23 10:58 + **/ +package org.dromara.email.jakarta.comm; \ No newline at end of file diff --git a/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/HtmlUtil.java b/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/HtmlUtil.java index 376aa5c6..61b79d17 100644 --- a/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/HtmlUtil.java +++ b/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/HtmlUtil.java @@ -2,11 +2,7 @@ package org.dromara.email.jakarta.comm.utils; import org.dromara.email.jakarta.comm.errors.MailException; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; +import java.io.*; import java.nio.file.Files; import java.util.ArrayList; import java.util.List; @@ -32,8 +28,8 @@ public final class HtmlUtil { * @param name 模板文件名 * @author :Wind */ - public static List readHtml(String name) throws MailException { - try (InputStream is = HtmlUtil.class.getResourceAsStream("/template/" + name)) { + public static List readHtml(String name,Class clazz) throws MailException { + try (InputStream is = clazz.getResourceAsStream("/template/" + name)) { return readHtml(is); } catch (IOException e) { throw new MailException(e); @@ -75,6 +71,12 @@ public final class HtmlUtil { } } catch (IOException e) { throw new MailException(e); + } finally { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } } return data; } diff --git a/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/ZipUtils.java b/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/ZipUtils.java index d41fad89..a10d19d6 100644 --- a/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/ZipUtils.java +++ b/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/ZipUtils.java @@ -11,11 +11,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; -import java.nio.channels.Channels; -import java.nio.channels.FileChannel; -import java.nio.channels.Pipe; -import java.nio.channels.ReadableByteChannel; -import java.nio.channels.WritableByteChannel; +import java.nio.channels.*; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.zip.ZipEntry; diff --git a/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/factory/MailFactory.java b/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/factory/MailFactory.java index 644298d4..5c284d1c 100644 --- a/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/factory/MailFactory.java +++ b/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/factory/MailFactory.java @@ -24,7 +24,7 @@ public class MailFactory{ *

从工厂获取一个邮件发送实例 * @param key 配置的标识key * @author :Wind - */ + */ public static MailClient createMailClient(Object key){ try { return MailBuild.build(CONFIGS.get(key)); @@ -40,7 +40,7 @@ public class MailFactory{ * @param key 配置的标识key * @param blacklist 黑名单接口,实例将从这里获取黑名单数据 * @author :Wind - */ + */ public static MailClient createMailClient(Object key, Blacklist blacklist){ try { return MailBuild.build(CONFIGS.get(key),blacklist); @@ -55,7 +55,7 @@ public class MailFactory{ * @param key 标识 * @param config 配置对象 * @author :Wind - */ + */ public static void put(Object key, MailSmtpConfig config){ CONFIGS.put(key,config); } diff --git a/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/factory/MonitorFactory.java b/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/factory/MonitorFactory.java index 39c0af66..ac67bb9a 100644 --- a/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/factory/MonitorFactory.java +++ b/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/factory/MonitorFactory.java @@ -28,7 +28,7 @@ public class MonitorFactory { * @param config 监听配置 * @param monitor 回调对象 * @author :Wind - */ + */ public static void put(String key, MailImapConfig config, Monitor monitor){ SERVICES.put(key,new MonitorService(config,monitor)); } @@ -38,9 +38,9 @@ public class MonitorFactory { *

开始监听指定标识的邮箱 * @param key 标识 * @author :Wind - */ + */ public static void start(String key){ - SERVICES.get(key).start(); + SERVICES.get(key).start(); } /** @@ -48,7 +48,7 @@ public class MonitorFactory { *

停止监听指定标识的邮箱 * @param key 标识 * @author :Wind - */ + */ public static void stop(String key){ SERVICES.get(key).stop(); } @@ -58,7 +58,7 @@ public class MonitorFactory { *

获取指定标识的配置信息 * @param key 标识 * @author :Wind - */ + */ public static MailImapConfig getConfig(String key) { return SERVICES.get(key).getMailImapConfig(); } diff --git a/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/service/MailBuild.java b/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/service/MailBuild.java index fcf339c0..272590a9 100644 --- a/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/service/MailBuild.java +++ b/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/service/MailBuild.java @@ -99,7 +99,7 @@ public class MailBuild { return MailService.instance(new MailBuild(config)); } public static MailClient build(MailSmtpConfig config,Blacklist blacklist)throws MessagingException { - return MailService.instance(new MailBuild(config,blacklist)); + return MailService.instance(new MailBuild(config,blacklist)); } /** @@ -120,7 +120,7 @@ public class MailBuild { list.add(s); } } - return InternetAddress.parse(CollUtil.join(list, ",")); + return InternetAddress.parse(CollUtil.join(list, ",")); } catch (AddressException e) { throw new MailException(e); } diff --git a/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/service/MailService.java b/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/service/MailService.java index d7fbd3b4..139419eb 100644 --- a/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/service/MailService.java +++ b/sms4j-email-jakarta/sms4j-email-jakarta-core/src/main/java/org/dromara/email/jakarta/core/service/MailService.java @@ -26,6 +26,7 @@ import org.dromara.email.jakarta.comm.utils.ZipUtils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -50,8 +51,14 @@ public class MailService implements MailClient { if (mailMessage.getHtmlInputStream() != null) { html = HtmlUtil.readHtml(mailMessage.getHtmlInputStream()); } - if (StrUtil.isNotBlank(mailMessage.getHtmlPath())){ - html = HtmlUtil.readHtml(mailMessage.getHtmlPath()); + if (StrUtil.isNotBlank(mailMessage.getHtmlPath())) { + html = HtmlUtil.readHtml(mailMessage.getHtmlPath(), MailService.class); + } + if (mailMessage.getHtmlFile() != null) { + html = HtmlUtil.readHtml(mailMessage.getHtmlFile()); + } + if (StrUtil.isNotBlank(mailMessage.getHtmlContent())) { + html = Arrays.asList(mailMessage.getHtmlContent().split("\n")); } send(mailMessage.getMailAddress(), mailMessage.getTitle(), @@ -186,11 +193,17 @@ public class MailService implements MailClient { message.setSubject(title); Multipart multipart = new MimeMultipart("alternative"); - if (CollUtil.isNotEmpty(html) && MapUtil.isNotEmpty(parameter)) { - //读取模板并进行变量替换 - List strings = HtmlUtil.replacePlaceholder(html, parameter); - //拼合HTML数据 - String htmlData = HtmlUtil.pieceHtml(strings); + if (CollUtil.isNotEmpty(html)) { + String htmlData; + List strings; + if (MapUtil.isNotEmpty(parameter)) { + //读取模板并进行变量替换 + strings = HtmlUtil.replacePlaceholder(html, parameter); + //拼合HTML数据 + htmlData = HtmlUtil.pieceHtml(strings); + }else { + htmlData = HtmlUtil.pieceHtml(html); + } MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(htmlData, "text/html;charset=UTF-8"); multipart.addBodyPart(htmlPart); From 46f3ccfbf27840aa2f7b996b5a27fcab3fc37526 Mon Sep 17 00:00:00 2001 From: handy Date: Fri, 25 Oct 2024 14:27:42 +0800 Subject: [PATCH 10/23] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/sms4j/comm/utils/SmsUtils.java | 7 ++++++- .../org/dromara/email/jakarta/comm/utils/HtmlUtil.java | 6 +++++- .../org/dromara/email/jakarta/comm/utils/ZipUtils.java | 6 +++++- .../org/dromara/sms4j/javase/config/SEInitializer.java | 10 +++------- .../org/dromara/sms4j/baidu/config/BaiduFactory.java | 2 +- .../org/dromara/sms4j/baidu/service/BaiduSmsImpl.java | 4 ++-- .../java/org/dromara/sms4j/baidu/utils/BaiduUtils.java | 5 ++++- .../org/dromara/sms4j/danmi/service/DanMiSmsImpl.java | 2 -- .../main/java/org/dromara/sms4j/jg/util/JgUtils.java | 7 ++++++- .../sms4j/luosimao/service/LuoSiMaoSmsImpl.java | 6 +++++- .../dromara/sms4j/submail/service/SubMailSmsImpl.java | 5 ++++- .../test/java/org/dromara/sms4j/example/Sms4jTest.java | 7 ++++++- .../sms4j/solon/config/SmsBlendsInitializer.java | 6 ++---- .../test/java/org/dromara/sms4j/example/Sms4jTest.java | 7 ++++++- .../sms4j/starter/config/SmsBlendsInitializer.java | 4 +--- 15 files changed, 56 insertions(+), 28 deletions(-) diff --git a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/utils/SmsUtils.java b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/utils/SmsUtils.java index 257b94e2..b6bf505a 100644 --- a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/utils/SmsUtils.java +++ b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/utils/SmsUtils.java @@ -10,7 +10,12 @@ import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.function.Function; import java.util.function.Predicate; diff --git a/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/HtmlUtil.java b/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/HtmlUtil.java index 61b79d17..2fd7bd1d 100644 --- a/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/HtmlUtil.java +++ b/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/HtmlUtil.java @@ -2,7 +2,11 @@ package org.dromara.email.jakarta.comm.utils; import org.dromara.email.jakarta.comm.errors.MailException; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.nio.file.Files; import java.util.ArrayList; import java.util.List; diff --git a/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/ZipUtils.java b/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/ZipUtils.java index a10d19d6..d41fad89 100644 --- a/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/ZipUtils.java +++ b/sms4j-email-jakarta/sms4j-email-jakarta-comm/src/main/java/org/dromara/email/jakarta/comm/utils/ZipUtils.java @@ -11,7 +11,11 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; -import java.nio.channels.*; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.Pipe; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.zip.ZipEntry; diff --git a/sms4j-javase-plugin/src/main/java/org/dromara/sms4j/javase/config/SEInitializer.java b/sms4j-javase-plugin/src/main/java/org/dromara/sms4j/javase/config/SEInitializer.java index 18b718ef..bc263536 100644 --- a/sms4j-javase-plugin/src/main/java/org/dromara/sms4j/javase/config/SEInitializer.java +++ b/sms4j-javase-plugin/src/main/java/org/dromara/sms4j/javase/config/SEInitializer.java @@ -18,6 +18,7 @@ import org.dromara.sms4j.api.universal.SupplierConfig; import org.dromara.sms4j.api.verify.PhoneVerify; import org.dromara.sms4j.baidu.config.BaiduFactory; import org.dromara.sms4j.budingyun.config.BudingV2Factory; +import org.dromara.sms4j.chuanglan.config.ChuangLanFactory; import org.dromara.sms4j.cloopen.config.CloopenFactory; import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.exception.SmsBlendException; @@ -36,7 +37,6 @@ import org.dromara.sms4j.emay.config.EmayFactory; import org.dromara.sms4j.huawei.config.HuaweiFactory; import org.dromara.sms4j.javase.util.YamlUtils; import org.dromara.sms4j.jdcloud.config.JdCloudFactory; -import org.dromara.sms4j.chuanglan.config.ChuangLanFactory; import org.dromara.sms4j.jg.config.JgFactory; import org.dromara.sms4j.lianlu.config.LianLuFactory; import org.dromara.sms4j.luosimao.config.LuoSiMaoFactory; @@ -145,9 +145,7 @@ public class SEInitializer { //如果手机号校验器存在实现,则注册手机号校验器 ServiceLoader loader = ServiceLoader.load(PhoneVerify.class); if (loader.iterator().hasNext()) { - loader.forEach(f -> { - SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(f)); - }); + loader.forEach(f -> SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(f))); } else { SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(null)); } @@ -218,9 +216,7 @@ public class SEInitializer { //如果手机号校验器存在实现,则注册手机号校验器 ServiceLoader loader = ServiceLoader.load(PhoneVerify.class); if (loader.iterator().hasNext()) { - loader.forEach(f -> { - SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(f)); - }); + loader.forEach(f -> SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(f))); } else { SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(null)); } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/config/BaiduFactory.java b/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/config/BaiduFactory.java index b59dd6ce..cd7ef78a 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/config/BaiduFactory.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/config/BaiduFactory.java @@ -2,8 +2,8 @@ package org.dromara.sms4j.baidu.config; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.dromara.sms4j.comm.constant.SupplierConstant; import org.dromara.sms4j.baidu.service.BaiduSmsImpl; +import org.dromara.sms4j.comm.constant.SupplierConstant; import org.dromara.sms4j.provider.factory.AbstractProviderFactory; /** diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/service/BaiduSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/service/BaiduSmsImpl.java index 3b88c154..cd9ab456 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/service/BaiduSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/service/BaiduSmsImpl.java @@ -6,12 +6,12 @@ import cn.hutool.json.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.api.entity.SmsResponse; import org.dromara.sms4j.api.utils.SmsRespUtils; +import org.dromara.sms4j.baidu.config.BaiduConfig; +import org.dromara.sms4j.baidu.utils.BaiduUtils; import org.dromara.sms4j.comm.constant.SupplierConstant; import org.dromara.sms4j.comm.delayedTime.DelayedTime; import org.dromara.sms4j.comm.exception.SmsBlendException; import org.dromara.sms4j.comm.utils.SmsUtils; -import org.dromara.sms4j.baidu.config.BaiduConfig; -import org.dromara.sms4j.baidu.utils.BaiduUtils; import org.dromara.sms4j.provider.service.AbstractSmsBlend; import java.util.LinkedHashMap; diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/utils/BaiduUtils.java b/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/utils/BaiduUtils.java index 6234a865..27f6ab9f 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/utils/BaiduUtils.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/baidu/utils/BaiduUtils.java @@ -12,7 +12,10 @@ import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.utils.SmsDateUtils; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/danmi/service/DanMiSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/danmi/service/DanMiSmsImpl.java index 5287433c..1d5a62d7 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/danmi/service/DanMiSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/danmi/service/DanMiSmsImpl.java @@ -2,7 +2,6 @@ package org.dromara.sms4j.danmi.service; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.api.entity.SmsResponse; import org.dromara.sms4j.api.utils.SmsRespUtils; @@ -17,7 +16,6 @@ import org.dromara.sms4j.provider.service.AbstractSmsBlend; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; -import java.util.Objects; import java.util.concurrent.Executor; /** diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/jg/util/JgUtils.java b/sms4j-provider/src/main/java/org/dromara/sms4j/jg/util/JgUtils.java index a7f6cf98..64028ff8 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/jg/util/JgUtils.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/jg/util/JgUtils.java @@ -9,7 +9,12 @@ import org.dromara.sms4j.comm.utils.SmsUtils; import org.dromara.sms4j.jg.config.JgConfig; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; /** diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/luosimao/service/LuoSiMaoSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/luosimao/service/LuoSiMaoSmsImpl.java index 6447e1d2..4c223a31 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/luosimao/service/LuoSiMaoSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/luosimao/service/LuoSiMaoSmsImpl.java @@ -13,7 +13,11 @@ import org.dromara.sms4j.luosimao.config.LuoSiMaoConfig; import org.dromara.sms4j.luosimao.utils.LuoSiMaoUtils; import org.dromara.sms4j.provider.service.AbstractSmsBlend; -import java.util.*; +import java.util.Collections; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Objects; import java.util.concurrent.Executor; /** diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/submail/service/SubMailSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/submail/service/SubMailSmsImpl.java index 16f8ccab..e577072d 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/submail/service/SubMailSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/submail/service/SubMailSmsImpl.java @@ -17,7 +17,10 @@ import org.dromara.sms4j.provider.service.AbstractSmsBlend; import org.dromara.sms4j.submail.config.SubMailConfig; import org.dromara.sms4j.submail.utils.SubMailUtils; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; import java.util.concurrent.Executor; /** diff --git a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java index af1f2c43..50ffda29 100644 --- a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java +++ b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java @@ -22,7 +22,12 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.noear.solon.test.SolonJUnit5Extension; import org.noear.solon.test.SolonTest; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @Slf4j @ExtendWith(SolonJUnit5Extension.class) diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java index 6b658299..9f8ed655 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java @@ -10,6 +10,7 @@ import org.dromara.sms4j.api.universal.SupplierConfig; import org.dromara.sms4j.api.verify.PhoneVerify; import org.dromara.sms4j.baidu.config.BaiduFactory; import org.dromara.sms4j.budingyun.config.BudingV2Factory; +import org.dromara.sms4j.chuanglan.config.ChuangLanFactory; import org.dromara.sms4j.cloopen.config.CloopenFactory; import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.utils.SmsUtils; @@ -26,7 +27,6 @@ import org.dromara.sms4j.dingzhong.config.DingZhongFactory; import org.dromara.sms4j.emay.config.EmayFactory; import org.dromara.sms4j.huawei.config.HuaweiFactory; import org.dromara.sms4j.jdcloud.config.JdCloudFactory; -import org.dromara.sms4j.chuanglan.config.ChuangLanFactory; import org.dromara.sms4j.jg.config.JgFactory; import org.dromara.sms4j.lianlu.config.LianLuFactory; import org.dromara.sms4j.luosimao.config.LuoSiMaoFactory; @@ -85,9 +85,7 @@ public class SmsBlendsInitializer { //如果手机号校验器存在实现,则注册手机号校验器 ServiceLoader loader = ServiceLoader.load(PhoneVerify.class); if (loader.iterator().hasNext()) { - loader.forEach(f -> { - SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(f)); - }); + loader.forEach(f -> SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(f))); } else { SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(null)); } diff --git a/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java index cca4a1f3..1ed3ab3a 100644 --- a/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java +++ b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java @@ -21,7 +21,12 @@ import org.dromara.sms4j.luosimao.service.LuoSiMaoSmsImpl; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @Slf4j @SpringBootTest diff --git a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java index 95787d73..34327577 100644 --- a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java +++ b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java @@ -79,9 +79,7 @@ public class SmsBlendsInitializer { //如果手机号校验器存在实现,则注册手机号校验器(暂不可用) ServiceLoader loader = ServiceLoader.load(PhoneVerify.class); if (loader.iterator().hasNext()) { - loader.forEach(f -> { - SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(f)); - }); + loader.forEach(f -> SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(f))); } else { SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(null)); } From 1c0d518fdb2a785b7534788d6e2878f1dd116e80 Mon Sep 17 00:00:00 2001 From: LiYaoheng Date: Mon, 4 Nov 2024 17:07:09 +0800 Subject: [PATCH 11/23] =?UTF-8?q?fix=20luosimao=E7=9A=84=E6=89=8B=E6=9C=BA?= =?UTF-8?q?=E5=8F=B7=E4=B8=8D=E9=9C=80=E8=A6=81+86=E5=89=8D=E7=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/sms4j/luosimao/utils/LuoSiMaoUtils.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/luosimao/utils/LuoSiMaoUtils.java b/sms4j-provider/src/main/java/org/dromara/sms4j/luosimao/utils/LuoSiMaoUtils.java index 3f3a6356..ece889be 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/luosimao/utils/LuoSiMaoUtils.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/luosimao/utils/LuoSiMaoUtils.java @@ -1,6 +1,5 @@ package org.dromara.sms4j.luosimao.utils; -import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.utils.SmsDateUtils; @@ -13,24 +12,24 @@ import java.util.List; @Slf4j public class LuoSiMaoUtils { - public static LinkedHashMap buildHeaders(){ + public static LinkedHashMap buildHeaders() { LinkedHashMap headers = new LinkedHashMap<>(1); headers.put(Constant.CONTENT_TYPE, Constant.APPLICATION_FROM_URLENCODED); return headers; } - public static LinkedHashMap buildBody(String phone, String message){ + public static LinkedHashMap buildBody(String phone, String message) { LinkedHashMap body = new LinkedHashMap<>(2); - body.put("mobile", StrUtil.addPrefixIfNot(phone, "+86")); + body.put("mobile", phone); body.put("message", message); return body; } - public static LinkedHashMap buildBody(List phones, String message, Date date){ + public static LinkedHashMap buildBody(List phones, String message, Date date) { LinkedHashMap body = new LinkedHashMap<>(2); - body.put("mobile", SmsUtils.addCodePrefixIfNot(phones)); + body.put("mobile", SmsUtils.joinComma(phones)); body.put("message", message); - if (date != null){ + if (date != null) { body.put("time", SmsDateUtils.normDatetimeGmt8(date)); } return body; From f9f197935a0e17fe50e4dd716b645e8d83a8e9dc Mon Sep 17 00:00:00 2001 From: dongfeng Date: Mon, 11 Nov 2024 19:33:25 +0800 Subject: [PATCH 12/23] =?UTF-8?q?=E4=BF=AE=E5=A4=8Doa=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84cpu=E8=BF=87=E9=AB=98=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oa/core/provider/service/AbstractOaBlend.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java index cb7eb16a..fd197671 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java @@ -2,6 +2,7 @@ package org.dromara.oa.core.provider.service; import cn.hutool.core.util.StrUtil; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; import org.dromara.oa.api.OaCallBack; import org.dromara.oa.api.OaSender; import org.dromara.oa.comm.config.OaSupplierConfig; @@ -19,6 +20,7 @@ import java.util.concurrent.PriorityBlockingQueue; * @author dongfeng * 2023-10-22 21:03 */ +@Slf4j public abstract class AbstractOaBlend implements OaSender { @Getter @@ -57,12 +59,16 @@ public abstract class AbstractOaBlend implements OaS pool.execute(() -> { Thread.currentThread().setName("oa-priorityQueueMap-thread"); while (!Thread.currentThread().isInterrupted()) { - Request request = priorityQueueMap.poll(); - if (!Objects.isNull(request)) { + try{ + Request request = priorityQueueMap.take() ; pool.execute(() -> { - System.out.println("优先级为"+request.getPriority()+"已发送"); + log.info("优先级为"+request.getPriority()+"已发送"); sender(request, request.getMessageType()); }); + }catch (InterruptedException e){ + log.info("[Dispatcher]-priorityQueueMap-task-dispatcher has been interrupt to close."); + Thread.currentThread().interrupt(); + break; } } }); From 76e9ec060e8b54c84328cd87a5d604f906b64a76 Mon Sep 17 00:00:00 2001 From: noear Date: Fri, 3 Jan 2025 16:27:46 +0800 Subject: [PATCH 13/23] =?UTF-8?q?sms4j-solon-plugin-example=20=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/test/java/org/dromara/sms4j/example/Sms4jTest.java | 3 --- .../src/test/java/org/dromara/sms4j/example/SmsOaTest.java | 3 --- .../test/java/org/dromara/sms4j/example/SmsProcessorTest.java | 3 --- .../src/test/java/org/dromara/sms4j/example/SmsUtilsTest.java | 3 --- 4 files changed, 12 deletions(-) diff --git a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java index 50ffda29..677a034a 100644 --- a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java +++ b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java @@ -18,8 +18,6 @@ import org.dromara.sms4j.jg.service.JgSmsImpl; import org.dromara.sms4j.lianlu.service.LianLuSmsImpl; import org.dromara.sms4j.luosimao.service.LuoSiMaoSmsImpl; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.noear.solon.test.SolonJUnit5Extension; import org.noear.solon.test.SolonTest; import java.util.ArrayList; @@ -30,7 +28,6 @@ import java.util.List; import java.util.Map; @Slf4j -@ExtendWith(SolonJUnit5Extension.class) @SolonTest public class Sms4jTest { diff --git a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java index f1c1d76d..4ec1653f 100644 --- a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java +++ b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java @@ -10,8 +10,6 @@ import org.dromara.oa.core.dingTalk.config.DingTalkConfig; import org.dromara.oa.core.provider.factory.OaFactory; import org.dromara.oa.core.weTalk.config.WeTalkConfig; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.noear.solon.test.SolonJUnit5Extension; import org.noear.solon.test.SolonTest; import java.util.ArrayList; @@ -20,7 +18,6 @@ import java.util.concurrent.CountDownLatch; @Slf4j -@ExtendWith(SolonJUnit5Extension.class) @SolonTest public class SmsOaTest { //***********************DingTalk-Test************************// diff --git a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsProcessorTest.java b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsProcessorTest.java index c5f28537..9e318f35 100644 --- a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsProcessorTest.java +++ b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsProcessorTest.java @@ -9,8 +9,6 @@ import org.dromara.sms4j.comm.exception.SmsBlendException; import org.dromara.sms4j.comm.utils.SmsUtils; import org.dromara.sms4j.core.factory.SmsFactory; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.noear.solon.test.SolonJUnit5Extension; import org.noear.solon.test.SolonTest; import java.util.ArrayList; @@ -21,7 +19,6 @@ import java.util.LinkedHashMap; * @author sh1yu */ @Slf4j -@ExtendWith(SolonJUnit5Extension.class) @SolonTest public class SmsProcessorTest { /** diff --git a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsUtilsTest.java b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsUtilsTest.java index 3c294863..c5dda3f2 100644 --- a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsUtilsTest.java +++ b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/SmsUtilsTest.java @@ -5,8 +5,6 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.aliyun.config.AlibabaConfig; import org.dromara.sms4j.comm.utils.SmsUtils; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.noear.solon.test.SolonJUnit5Extension; import org.noear.solon.test.SolonTest; import java.util.ArrayList; @@ -16,7 +14,6 @@ import java.util.List; * @author handy */ @Slf4j -@ExtendWith(SolonJUnit5Extension.class) @SolonTest public class SmsUtilsTest { From ff4d6d8bf483fd1618b1a5187a18b2294d4db624 Mon Sep 17 00:00:00 2001 From: noear Date: Fri, 3 Jan 2025 16:28:38 +0800 Subject: [PATCH 14/23] =?UTF-8?q?solon=20=E5=8D=87=E4=B8=BA=203.0.1?= =?UTF-8?q?=EF=BC=88=E5=85=BC=E5=AE=B9=202.x=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/org/dromara/sms4j/solon/config/SupplierConfig.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 3a5dd1cd..44094081 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ UTF-8 UTF-8 2.7.18 - 2.6.5 + 3.0.1 3.17.0 1.3.3 5.8.28 diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java index 194ceedd..b9a092a9 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java @@ -30,13 +30,13 @@ public class SupplierConfig { } @Bean - protected Map> blends() { + public Map> blends() { return injectObj("sms.blends", new LinkedHashMap<>()); } @Bean - protected SmsBlendsInitializer smsBlendsInitializer(List factoryList, + public SmsBlendsInitializer smsBlendsInitializer(List factoryList, SmsConfig smsConfig, Map> blends) { From 98e779376d9a3fe0ae49af1d2703835716f06b82 Mon Sep 17 00:00:00 2001 From: noear Date: Fri, 3 Jan 2025 17:19:58 +0800 Subject: [PATCH 15/23] =?UTF-8?q?sms4j-solon-plugin=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20SupplierConfig=20=E9=80=82=E9=85=8D=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms4j/solon/config/SupplierConfig.java | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java index b9a092a9..31a6905e 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java @@ -1,6 +1,9 @@ package org.dromara.sms4j.solon.config; +import cn.hutool.core.util.ObjectUtil; import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.comm.constant.Constant; +import org.dromara.sms4j.comm.enums.ConfigType; import org.dromara.sms4j.provider.config.SmsConfig; import org.dromara.sms4j.provider.factory.BaseProviderFactory; import org.noear.solon.annotation.Bean; @@ -29,16 +32,37 @@ public class SupplierConfig { return obj; } - @Bean + @Bean("blends") public Map> blends() { return injectObj("sms.blends", new LinkedHashMap<>()); } + @Bean + @Condition(onBean = SmsConfig.class) + public List factoryList(@Inject("blends") Map> blends, SmsConfig smsConfig) throws Exception { + //注入自定义实现工厂 + List factoryList = new ArrayList<>(); + if (ConfigType.YAML.equals(smsConfig.getConfigType())) { + for (String configId : blends.keySet()) { + Map configMap = blends.get(configId); + Object factoryPath = configMap.get(Constant.FACTORY_PATH); + if (ObjectUtil.isNotEmpty(factoryPath)) { + //反射创建实例 + Class> newClass = (Class>) Class.forName(factoryPath.toString()); + BaseProviderFactory factory = newClass.newInstance(); + factoryList.add(factory); + } + } + } + + return factoryList; + } + @Bean public SmsBlendsInitializer smsBlendsInitializer(List factoryList, - SmsConfig smsConfig, - Map> blends) { + SmsConfig smsConfig, + @Inject("blends") Map> blends) { //todo: solon 不支持泛型的 List[Bean] 注入 List> factoryList2 = new ArrayList<>(factoryList.size()); From 49c5af9f7032e0c0d2a67189c250c5c5e70a1265 Mon Sep 17 00:00:00 2001 From: noear Date: Sat, 4 Jan 2025 18:33:57 +0800 Subject: [PATCH 16/23] =?UTF-8?q?sms4j-solon-plugin=EF=BC=9A=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E9=80=82=E9=85=8D=EF=BC=88=E5=90=8C=E6=AD=A5=20spring?= =?UTF-8?q?boot=20=E7=9A=84=E9=80=82=E9=85=8D=E4=BB=A3=E7=A0=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/sms4j/solon/Sms4jPlugin.java | 17 ++++ .../org/dromara/sms4j/solon/XPluginImpl.java | 17 ---- .../adaptor/ConfigCombineMapAdaptor.java | 40 +++++++++ .../solon/config/SmsAutowiredConfig.java | 60 ------------- .../solon/config/SmsBlendsInitializer.java | 88 +++++++++++-------- .../sms4j/solon/config/SmsMainConfigure.java | 34 +++++++ ...lierConfig.java => SupplierConfigure.java} | 35 ++++---- .../sms4j/solon/holder/SolonSmsDaoHolder.java | 18 +--- .../solon/sms4j-solon-plugin.properties | 4 +- 9 files changed, 166 insertions(+), 147 deletions(-) create mode 100644 sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/Sms4jPlugin.java delete mode 100644 sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/XPluginImpl.java create mode 100644 sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/adaptor/ConfigCombineMapAdaptor.java delete mode 100644 sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsAutowiredConfig.java create mode 100644 sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsMainConfigure.java rename sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/{SupplierConfig.java => SupplierConfigure.java} (60%) diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/Sms4jPlugin.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/Sms4jPlugin.java new file mode 100644 index 00000000..240598d2 --- /dev/null +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/Sms4jPlugin.java @@ -0,0 +1,17 @@ +package org.dromara.sms4j.solon; + +import org.dromara.sms4j.solon.config.SmsMainConfigure; +import org.dromara.sms4j.solon.config.SupplierConfigure; +import org.noear.solon.core.AppContext; +import org.noear.solon.core.Plugin; + +/** + * @author noear 2023/5/16 created + */ +public class Sms4jPlugin implements Plugin { + @Override + public void start(AppContext context) { + context.beanMake(SmsMainConfigure.class); + context.beanMake(SupplierConfigure.class); + } +} diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/XPluginImpl.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/XPluginImpl.java deleted file mode 100644 index fea6bb21..00000000 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/XPluginImpl.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.dromara.sms4j.solon; - -import org.dromara.sms4j.solon.config.SmsAutowiredConfig; -import org.dromara.sms4j.solon.config.SupplierConfig; -import org.noear.solon.core.AppContext; -import org.noear.solon.core.Plugin; - -/** - * @author noear 2023/5/16 created - */ -public class XPluginImpl implements Plugin { - @Override - public void start(AppContext context) { - context.beanMake(SmsAutowiredConfig.class); - context.beanMake(SupplierConfig.class); - } -} diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/adaptor/ConfigCombineMapAdaptor.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/adaptor/ConfigCombineMapAdaptor.java new file mode 100644 index 00000000..560be275 --- /dev/null +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/adaptor/ConfigCombineMapAdaptor.java @@ -0,0 +1,40 @@ +package org.dromara.sms4j.solon.adaptor; + +import cn.hutool.core.bean.BeanUtil; +import org.dromara.sms4j.core.datainterface.SmsReadConfig; +import org.dromara.sms4j.provider.config.BaseConfig; + +import java.util.*; + +public class ConfigCombineMapAdaptor extends HashMap { + @Override + public M get(Object key) { + Object o = super.get(key); + if (null == o){ + Set configKeySet = this.keySet(); + for (Object insideMapKey : configKeySet) { + if (((String)insideMapKey).startsWith(SmsReadConfig.class.getSimpleName())){ + Map smsBlendsConfigInsideMap = (Map) this.get(insideMapKey); + SmsReadConfig config = (SmsReadConfig) smsBlendsConfigInsideMap.get(insideMapKey); + BaseConfig supplierConfig = config.getSupplierConfig((String)key); + List supplierConfigList = config.getSupplierConfigList(); + if (null == supplierConfigList){ + supplierConfigList = new ArrayList<>(); + } + if (null != supplierConfig){ + supplierConfigList.add(supplierConfig); + } + for (BaseConfig baseConfig : supplierConfigList) { + if (key.equals(baseConfig.getConfigId())){ + Map configMap = BeanUtil.beanToMap(baseConfig); + this.put(baseConfig.getConfigId(),configMap); + return (M)configMap; + } + } + } + } + return null; + } + return (M)o; + } +} diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsAutowiredConfig.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsAutowiredConfig.java deleted file mode 100644 index 55a5ddfc..00000000 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsAutowiredConfig.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.dromara.sms4j.solon.config; - -import lombok.extern.slf4j.Slf4j; -import org.dromara.sms4j.comm.constant.Constant; -import org.dromara.sms4j.comm.delayedTime.DelayedTime; -import org.dromara.sms4j.provider.config.SmsBanner; -import org.dromara.sms4j.provider.config.SmsConfig; -import org.dromara.sms4j.provider.factory.BeanFactory; -import org.noear.solon.annotation.Bean; -import org.noear.solon.annotation.Configuration; -import org.noear.solon.annotation.Inject; -import org.noear.solon.core.AppContext; -import org.noear.solon.core.bean.LifecycleBean; - -import java.util.concurrent.Executor; - -@Slf4j -@Configuration -public class SmsAutowiredConfig implements LifecycleBean { - - @Inject - AppContext context; - - private T injectObj(String prefix, T obj) { - //@Inject 只支持在字段、参数、类型上注入 - context.cfg().getProp(prefix).bindTo(obj); - return obj; - } - - @Bean - public SmsConfig smsConfig() { - return injectObj("sms", BeanFactory.getSmsConfig()); - } - - /** - * 注入一个定时器 - */ - @Bean - public DelayedTime delayedTime() { - return BeanFactory.getDelayedTime(); - } - - /** - * 注入线程池 - */ - @Bean("smsExecutor") - public Executor taskExecutor(@Inject SmsConfig config) { - return BeanFactory.setExecutor(config); - } - - - //是在 solon 容器扫描完成之后执行的 - @Override - public void start() { - //打印banner - if (BeanFactory.getSmsConfig().getIsPrint()) { - SmsBanner.PrintBanner(Constant.VERSION); - } - } -} diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java index 9f8ed655..7c891076 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsBlendsInitializer.java @@ -13,7 +13,9 @@ import org.dromara.sms4j.budingyun.config.BudingV2Factory; import org.dromara.sms4j.chuanglan.config.ChuangLanFactory; import org.dromara.sms4j.cloopen.config.CloopenFactory; import org.dromara.sms4j.comm.constant.Constant; +import org.dromara.sms4j.comm.enums.ConfigType; import org.dromara.sms4j.comm.utils.SmsUtils; +import org.dromara.sms4j.core.datainterface.SmsReadConfig; import org.dromara.sms4j.core.factory.SmsFactory; import org.dromara.sms4j.core.proxy.EnvirmentHolder; import org.dromara.sms4j.core.proxy.SmsProxyFactory; @@ -36,15 +38,15 @@ import org.dromara.sms4j.provider.config.SmsConfig; import org.dromara.sms4j.provider.factory.BaseProviderFactory; import org.dromara.sms4j.provider.factory.ProviderFactoryHolder; import org.dromara.sms4j.qiniu.config.QiNiuFactory; -import org.dromara.sms4j.solon.holder.SolonSmsDaoHolder; +import org.dromara.sms4j.solon.adaptor.ConfigCombineMapAdaptor; import org.dromara.sms4j.submail.config.SubMailFactory; import org.dromara.sms4j.tencent.config.TencentFactory; import org.dromara.sms4j.unisms.config.UniFactory; import org.dromara.sms4j.yixintong.config.YiXintongFactory; import org.dromara.sms4j.yunpian.config.YunPianFactory; import org.dromara.sms4j.zhutong.config.ZhutongFactory; -import org.noear.solon.core.AppContext; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ServiceLoader; @@ -56,56 +58,69 @@ public class SmsBlendsInitializer { private final SmsConfig smsConfig; private final Map> blends; - private final AppContext context; + private final List extendsSmsConfigs; public SmsBlendsInitializer(List> factoryList, SmsConfig smsConfig, Map> blends, - AppContext context - ){ + List extendsSmsConfigs){ this.factoryList = factoryList; this.smsConfig = smsConfig; this.blends = blends; - this.context = context; - onApplicationEvent(); + this.extendsSmsConfigs = extendsSmsConfigs; + + this.initDo(); } - public void onApplicationEvent() { + private void initDo() { this.registerDefaultFactory(); // 注册短信对象工厂 ProviderFactoryHolder.registerFactory(factoryList); - //持有初始化配置信息 - EnvirmentHolder.frozenEnvirmet(smsConfig, blends); - //框架依赖持有缓存扩展 - new SolonSmsDaoHolder(context); - //注册执行器实现 - SmsProxyFactory.addPreProcessor(new RestrictedProcessor()); - SmsProxyFactory.addPreProcessor(new BlackListProcessor()); - SmsProxyFactory.addPreProcessor(new BlackListRecordingProcessor()); - //如果手机号校验器存在实现,则注册手机号校验器 + //如果手机号校验器存在实现,则注册手机号校验器(暂不可用) ServiceLoader loader = ServiceLoader.load(PhoneVerify.class); if (loader.iterator().hasNext()) { loader.forEach(f -> SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(f))); } else { SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(null)); } - // 解析供应商配置 - for(String configId : blends.keySet()) { - Map configMap = blends.get(configId); - Object supplierObj = configMap.get(Constant.SUPPLIER_KEY); - String supplier = supplierObj == null ? "" : String.valueOf(supplierObj); - supplier = StrUtil.isEmpty(supplier) ? configId : supplier; - BaseProviderFactory providerFactory = (BaseProviderFactory) ProviderFactoryHolder.requireForSupplier(supplier); - if(providerFactory == null) { - log.warn("创建\"{}\"的短信服务失败,未找到供应商为\"{}\"的服务", configId, supplier); - continue; - } - configMap.put("config-id", configId); - SmsUtils.replaceKeysSeparator(configMap, "-", "_"); - JSONObject configJson = new JSONObject(configMap); - SupplierConfig supplierConfig = JSONUtil.toBean(configJson, providerFactory.getConfigClass()); - SmsFactory.createSmsBlend(supplierConfig); + //注册执行器实现 + if(this.smsConfig.getRestricted()){ + SmsProxyFactory.addPreProcessor(new RestrictedProcessor()); + SmsProxyFactory.addPreProcessor(new BlackListProcessor()); + SmsProxyFactory.addPreProcessor(new BlackListRecordingProcessor()); } + if (ConfigType.YAML.equals(this.smsConfig.getConfigType())) { + //持有初始化配置信息 + Map> blendsInclude = new ConfigCombineMapAdaptor>(); + blendsInclude.putAll(this.blends); + int num = 0; + for (SmsReadConfig smsReadConfig : extendsSmsConfigs) { + String key = SmsReadConfig.class.getSimpleName() + num; + Map insideMap = new HashMap<>(); + insideMap.put(key, smsReadConfig); + blendsInclude.put(key, insideMap); + num++; + } + EnvirmentHolder.frozenEnvirmet(smsConfig, blendsInclude); + // 解析供应商配置 + for (String configId : blends.keySet()) { + Map configMap = blends.get(configId); + Object supplierObj = configMap.get(Constant.SUPPLIER_KEY); + String supplier = supplierObj == null ? "" : String.valueOf(supplierObj); + supplier = StrUtil.isEmpty(supplier) ? configId : supplier; + BaseProviderFactory providerFactory = (BaseProviderFactory) ProviderFactoryHolder.requireForSupplier(supplier); + if (providerFactory == null) { + log.warn("创建\"{}\"的短信服务失败,未找到供应商为\"{}\"的服务", configId, supplier); + continue; + } + configMap.put("config-id", configId); + SmsUtils.replaceKeysSeparator(configMap, "-", "_"); + JSONObject configJson = new JSONObject(configMap); + org.dromara.sms4j.api.universal.SupplierConfig supplierConfig = JSONUtil.toBean(configJson, providerFactory.getConfigClass()); + SmsFactory.createSmsBlend(supplierConfig); + } + } + } @@ -135,8 +150,11 @@ public class SmsBlendsInitializer { ProviderFactoryHolder.registerFactory(SubMailFactory.instance()); ProviderFactoryHolder.registerFactory(DanMiFactory.instance()); ProviderFactoryHolder.registerFactory(YiXintongFactory.instance()); - if(SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { - ProviderFactoryHolder.registerFactory(JdCloudFactory.instance()); + if (SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { + if (SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { + ProviderFactoryHolder.registerFactory(JdCloudFactory.instance()); + } + log.debug("加载内置运营商完成!"); } } diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsMainConfigure.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsMainConfigure.java new file mode 100644 index 00000000..08120099 --- /dev/null +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SmsMainConfigure.java @@ -0,0 +1,34 @@ +package org.dromara.sms4j.solon.config; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.sms4j.comm.constant.Constant; +import org.dromara.sms4j.provider.config.SmsBanner; +import org.dromara.sms4j.provider.config.SmsConfig; +import org.dromara.sms4j.provider.factory.BeanFactory; +import org.noear.solon.annotation.Bean; +import org.noear.solon.annotation.Configuration; +import org.noear.solon.annotation.Init; +import org.noear.solon.annotation.Inject; +import org.noear.solon.core.AppContext; + +@Slf4j +@Configuration +public class SmsMainConfigure { + @Inject + AppContext context; + + @Bean + public SmsConfig smsConfig() { + return context.cfg().getProp("sms") + .bindTo(BeanFactory.getSmsConfig()); + } + + //是在 solon 容器扫描完成之后执行的 + @Init + public void init() { + //打印banner + if (BeanFactory.getSmsConfig().getIsPrint()) { + SmsBanner.PrintBanner(Constant.VERSION); + } + } +} diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfigure.java similarity index 60% rename from sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java rename to sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfigure.java index 31a6905e..9aa0c06b 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfig.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfigure.java @@ -2,8 +2,10 @@ package org.dromara.sms4j.solon.config; import cn.hutool.core.util.ObjectUtil; import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.universal.SupplierConfig; import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.enums.ConfigType; +import org.dromara.sms4j.core.datainterface.SmsReadConfig; import org.dromara.sms4j.provider.config.SmsConfig; import org.dromara.sms4j.provider.factory.BaseProviderFactory; import org.noear.solon.annotation.Bean; @@ -18,11 +20,11 @@ import java.util.List; import java.util.Map; /** - * smsConfig参数意义为确保注入时smsConfig已经存在 + * smsConfig 参数意义为确保注入时 smsConfig 已经存在 */ @Condition(onProperty = "${sms.configType}=yaml") @Configuration -public class SupplierConfig { +public class SupplierConfigure { @Inject AppContext context; @@ -33,44 +35,43 @@ public class SupplierConfig { } @Bean("blends") + @Condition(onProperty = "${sms.configType} = yaml") public Map> blends() { - return injectObj("sms.blends", new LinkedHashMap<>()); + return context.cfg().getProp("sms.blends").bindTo(new LinkedHashMap<>()); } @Bean @Condition(onBean = SmsConfig.class) - public List factoryList(@Inject("blends") Map> blends, SmsConfig smsConfig) throws Exception { + public List> factoryList( + @Inject("blends") Map> blends, + SmsConfig smsConfig) throws Exception { //注入自定义实现工厂 - List factoryList = new ArrayList<>(); + List> factoryList = new ArrayList<>(); if (ConfigType.YAML.equals(smsConfig.getConfigType())) { for (String configId : blends.keySet()) { Map configMap = blends.get(configId); Object factoryPath = configMap.get(Constant.FACTORY_PATH); if (ObjectUtil.isNotEmpty(factoryPath)) { //反射创建实例 - Class> newClass = (Class>) Class.forName(factoryPath.toString()); - BaseProviderFactory factory = newClass.newInstance(); + Class> newClass = (Class>) Class.forName(factoryPath.toString()); + BaseProviderFactory factory = newClass.newInstance(); factoryList.add(factory); } } } - return factoryList; } @Bean - public SmsBlendsInitializer smsBlendsInitializer(List factoryList, + public SmsBlendsInitializer smsBlendsInitializer(List> factoryList, SmsConfig smsConfig, - @Inject("blends") Map> blends) { - - //todo: solon 不支持泛型的 List[Bean] 注入 - List> factoryList2 = new ArrayList<>(factoryList.size()); - for (BaseProviderFactory factory : factoryList) { - factoryList2.add((BaseProviderFactory) factory); + @Inject("blends") Map> blends, + @Inject(required = false) List extendsSmsConfigs) { + if (extendsSmsConfigs == null) { + extendsSmsConfigs = new ArrayList<>(); } - - return new SmsBlendsInitializer(factoryList2, smsConfig, blends, context); + return new SmsBlendsInitializer(factoryList, smsConfig, blends, extendsSmsConfigs); } } diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/holder/SolonSmsDaoHolder.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/holder/SolonSmsDaoHolder.java index cef3c875..e5a28eed 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/holder/SolonSmsDaoHolder.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/holder/SolonSmsDaoHolder.java @@ -1,22 +1,10 @@ package org.dromara.sms4j.solon.holder; import org.dromara.sms4j.api.dao.SmsDao; -import org.dromara.sms4j.api.dao.SmsDaoDefaultImpl; -import org.dromara.sms4j.comm.utils.SmsUtils; -import org.noear.solon.core.AppContext; - -public class SolonSmsDaoHolder{ - - private static SmsDao smsDao; - - public SolonSmsDaoHolder(AppContext context) { - context.getBeanAsync(SmsDao.class, bean -> smsDao = bean); - } +import org.noear.solon.Solon; +public class SolonSmsDaoHolder { public static SmsDao getSmsDao() { - if (SmsUtils.isEmpty(smsDao)){ - smsDao = SmsDaoDefaultImpl.getInstance(); - } - return smsDao; + return Solon.context().getBean(SmsDao.class); } } diff --git a/sms4j-solon-plugin/src/main/resources/META-INF/solon/sms4j-solon-plugin.properties b/sms4j-solon-plugin/src/main/resources/META-INF/solon/sms4j-solon-plugin.properties index 07519a28..1c2e6360 100644 --- a/sms4j-solon-plugin/src/main/resources/META-INF/solon/sms4j-solon-plugin.properties +++ b/sms4j-solon-plugin/src/main/resources/META-INF/solon/sms4j-solon-plugin.properties @@ -1,4 +1,2 @@ -#??????? -solon.plugin=org.dromara.sms4j.solon.XPluginImpl -#?????????????????0 +solon.plugin=org.dromara.sms4j.solon.Sms4jPlugin solon.plugin.priority=1 \ No newline at end of file From 44287e62d47241dddf0dcd7869431164feb8804c Mon Sep 17 00:00:00 2001 From: noear Date: Sat, 4 Jan 2025 18:44:27 +0800 Subject: [PATCH 17/23] =?UTF-8?q?sms4j-solon-plugin-example=EF=BC=9A=20spr?= =?UTF-8?q?ingboot=20=E7=9A=84=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/zhangjun/ZhangJunSmsImpl.java | 11 ++------ .../src/main/resources/app.yml | 28 ++++++++++++------- .../org/dromara/sms4j/example/Sms4jTest.java | 28 +++++++++++++++++++ 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/sms4j-solon-plugin-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java b/sms4j-solon-plugin-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java index fc99662e..bcb6ef29 100644 --- a/sms4j-solon-plugin-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java +++ b/sms4j-solon-plugin-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java @@ -4,6 +4,7 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.api.utils.SmsRespUtils; import org.dromara.sms4j.comm.delayedTime.DelayedTime; import org.dromara.sms4j.comm.exception.SmsBlendException; import org.dromara.sms4j.comm.utils.SmsUtils; @@ -90,9 +91,7 @@ public class ZhangJunSmsImpl extends AbstractSmsBlend { try { smsResponse = getResponse(http.postJson(getConfig().getUrl(), null, message)); } catch (SmsBlendException e) { - smsResponse = new SmsResponse(); - smsResponse.setSuccess(false); - smsResponse.setData(e.getMessage()); + smsResponse = errorResp(e.message); } if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { retry = 0; @@ -109,11 +108,7 @@ public class ZhangJunSmsImpl extends AbstractSmsBlend { } private SmsResponse getResponse(JSONObject resJson) { - SmsResponse smsResponse = new SmsResponse(); - smsResponse.setSuccess("OK".equals(resJson.getStr("Code"))); - smsResponse.setData(resJson); - smsResponse.setConfigId(getConfigId()); - return smsResponse; + return SmsRespUtils.resp(resJson, "OK".equals(resJson.getStr("Code")), getConfigId()); } } \ No newline at end of file diff --git a/sms4j-solon-plugin-example/src/main/resources/app.yml b/sms4j-solon-plugin-example/src/main/resources/app.yml index 1780baae..63ef4e5a 100644 --- a/sms4j-solon-plugin-example/src/main/resources/app.yml +++ b/sms4j-solon-plugin-example/src/main/resources/app.yml @@ -79,13 +79,13 @@ sms: access-key-secret: 你的Access Key Secret sdkAppId: 你的应用ID #自定义广州掌骏短信,添加factory全路径。config,factory,SmsImpl复制其他默认实现即可,修改对应的supplier和发送核心逻辑即可 -# zhangjun: -# supplier: zhangjun -# factory: org.dromara.sms4j.example.zhangjun.ZhangJunFactory -# templateId: d2a****777 -# appId: 64c52d2a****77775fe72e3 -# sid: d2a****777 -# url: https://sms.idowe.com/**/**/**/send + # zhangjun: + # supplier: zhangjun + # factory: org.dromara.sms4j.example.zhangjun.ZhangJunFactory + # templateId: d2a****777 + # appId: 64c52d2a****77775fe72e3 + # sid: d2a****777 + # url: https://sms.idowe.com/**/**/**/send qiniu: access-key-id: EQcDflLTCYnU1******CmqIYLhog1lkWHb2 access-key-secret: NeS2ptvZQoIy*****err2DdLe7wxFfQvji1 @@ -155,21 +155,29 @@ sms: accessKeyId: ACCOUNT SID accessKeySecret: AUTH TOKEN action: 默认请求方法 distributor/sendSMS + # 一信通 + yixintong: + sp-code: xxxxxx #(必填)企业编号 + access-key-id: xxxxxx #(必填)用户名 + access-key-secret: 324gaxxxxxxxxxxxxxxxxx9sdf89 #(必填)接口密钥(正式帐户需要登陆平台,接口业务-接口申请右侧钥匙状图标查看或获取,接口密钥获取后十分钟生效) + template-id: #(可选)模板编号(若配置此参数,则会默认使用该模板,以便提高服务方性能) + sign-code: #(可选)短信前置签名编号(登陆平台-接口业务-我的签名查看) + f: 1 #(可选)默认为1,提交时检测方式 sms-oa: config-type: yaml oas: oaDingTalkByYaml: # configId isEnable: true # 表示该配置是否生效(默认生效,false表示不生效) - supplier: dingding # 厂商标识 + supplier: ding_ding # 厂商标识 tokenId: 您的accessKey sign: 您的sign oaByteTalkByYaml: # configId - supplier: feishu # 厂商标识 + supplier: byte_talk # 厂商标识 tokenId: 您的accessKey sign: 您的sign oaWeTalkByYaml: - supplier: wetalk # 厂商标识 + supplier: we_talk # 厂商标识 tokenId: 您的sign core-pool-size: 20 queue-capacity: 20 diff --git a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java index 677a034a..12534da3 100644 --- a/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java +++ b/sms4j-solon-plugin-example/src/test/java/org/dromara/sms4j/example/Sms4jTest.java @@ -1,5 +1,6 @@ package org.dromara.sms4j.example; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.UUID; @@ -530,4 +531,31 @@ public class Sms4jTest { SmsResponse smsResponse5 = danMiSms.voiceTemplate(PHONE, "opipedlqza", "111,222,333"); Assert.isTrue(smsResponse5.isSuccess()); } + + + /** + * 联通一信通模板 + */ + @Test + public void yixintongSmsTest() { + if (StrUtil.isBlank(PHONE)) { + return; + } + + //短信发送模板:你有一项编号为{xxxxxxxxx}的事务需要处理{x} + //其中的{xxxxxx}代表短信模板中的变量部分,可变化,一个x代表一个字或者字符,{}为变量标识,在发送时不用传。实发变量字数小于等于x的个数。 + + // 单发 + String message1 = StrUtil.format("你有一项编号为{}的事务需要处理。", SmsUtils.getRandomInt(6)); + SmsResponse smsResponse1 = SmsFactory.getBySupplier(SupplierConstant.YIXINTONG).sendMessage(PHONE, message1); + log.info(JSONUtil.toJsonStr(smsResponse1)); + Assert.isTrue(smsResponse1.isSuccess()); + + // 群发 + List phones = CollectionUtil.toList(PHONE); + String message2 = StrUtil.format("你有一项编号为{}的事务需要处理。", SmsUtils.getRandomInt(6)); + SmsResponse smsResponse2 = SmsFactory.getBySupplier(SupplierConstant.YIXINTONG).massTexting(phones, message2); + log.info(JSONUtil.toJsonStr(smsResponse2)); + Assert.isTrue(smsResponse2.isSuccess()); + } } From 2ef232d9ff6c51a9d93f7dac764a13c7552454e1 Mon Sep 17 00:00:00 2001 From: noear Date: Sun, 5 Jan 2025 08:15:05 +0800 Subject: [PATCH 18/23] =?UTF-8?q?sms4j-solon-plugin:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=80=82=E9=85=8D=EF=BC=8C=E4=BF=9D=E6=8C=81=E4=B8=8E=20spring?= =?UTF-8?q?=20=E7=9A=84=E4=BD=93=E9=AA=8C=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/sms4j/solon/config/SupplierConfigure.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfigure.java b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfigure.java index 9aa0c06b..d4568950 100644 --- a/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfigure.java +++ b/sms4j-solon-plugin/src/main/java/org/dromara/sms4j/solon/config/SupplierConfigure.java @@ -22,7 +22,6 @@ import java.util.Map; /** * smsConfig 参数意义为确保注入时 smsConfig 已经存在 */ -@Condition(onProperty = "${sms.configType}=yaml") @Configuration public class SupplierConfigure { @Inject @@ -35,8 +34,8 @@ public class SupplierConfigure { } @Bean("blends") - @Condition(onProperty = "${sms.configType} = yaml") public Map> blends() { + //确保能产生(给下面用)//springboot 就算没产生,也会给个默认 return context.cfg().getProp("sms.blends").bindTo(new LinkedHashMap<>()); } @@ -67,11 +66,7 @@ public class SupplierConfigure { public SmsBlendsInitializer smsBlendsInitializer(List> factoryList, SmsConfig smsConfig, @Inject("blends") Map> blends, - @Inject(required = false) List extendsSmsConfigs) { - if (extendsSmsConfigs == null) { - extendsSmsConfigs = new ArrayList<>(); - } - + List extendsSmsConfigs) { return new SmsBlendsInitializer(factoryList, smsConfig, blends, extendsSmsConfigs); } } From 8498fafa65aac9b9e19b455db06b549df0658564 Mon Sep 17 00:00:00 2001 From: wind Date: Wed, 26 Feb 2025 19:16:39 +0800 Subject: [PATCH 19/23] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=8C=E4=BA=91?= =?UTF-8?q?=E7=89=87=E7=9F=AD=E4=BF=A1=E6=97=A0=E9=99=90=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java index a5c4b930..f6a5c842 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java @@ -92,7 +92,7 @@ public class YunPianSmsImpl extends AbstractSmsBlend { try { smsResponse = getResponse(http.postFrom(Constant.YUNPIAN_URL + "/sms/tpl_single_send.json", headers, body)); } catch (SmsBlendException e) { - return requestRetry(phone, templateId, messages); + smsResponse = errorResp(e.message); } if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { retry = 0; From a62bca40b69bc52d2ca0167a28124c27bbcf49a4 Mon Sep 17 00:00:00 2001 From: wind Date: Wed, 26 Feb 2025 19:25:31 +0800 Subject: [PATCH 20/23] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E6=AF=8F?= =?UTF-8?q?=E6=97=A5=E6=9C=80=E5=A4=A7=E5=8F=91=E9=80=81=E9=87=8F=E8=AE=A1?= =?UTF-8?q?=E6=97=B6=E6=88=AA=E6=AD=A2=E6=AF=8F=E6=97=A50=E7=82=B9?= =?UTF-8?q?=EF=BC=8C=E8=80=8C=E4=B8=8D=E6=98=AF=E6=8C=81=E7=BB=AD24?= =?UTF-8?q?=E5=B0=8F=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../proxy/processor/RestrictedProcessor.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/processor/RestrictedProcessor.java b/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/processor/RestrictedProcessor.java index 21f187ca..e92a071d 100644 --- a/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/processor/RestrictedProcessor.java +++ b/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/processor/RestrictedProcessor.java @@ -10,6 +10,8 @@ import org.dromara.sms4j.comm.utils.SmsUtils; import org.dromara.sms4j.provider.config.SmsConfig; import org.dromara.sms4j.provider.factory.BeanFactory; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; @@ -26,7 +28,6 @@ import java.util.Objects; @Slf4j public class RestrictedProcessor implements CoreMethodProcessor, SmsDaoAware { static Long minTimer = 60 * 1000L; - static Long accTimer = 24 * 60 * 60 * 1000L; private static final String REDIS_KEY = "sms:restricted:"; /** @@ -59,6 +60,13 @@ public class RestrictedProcessor implements CoreMethodProcessor, SmsDaoAware { doRestricted(phones); } + private long calculateExpiryTime() { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime tomorrowMidnight = now.toLocalDate().plusDays(1).atStartOfDay(); + Duration duration = Duration.between(now, tomorrowMidnight); + return duration.getSeconds(); + } + public void doRestricted(List phones) { if (Objects.isNull(smsDao)) { throw new SmsBlendException("The smsDao tool could not be found"); @@ -86,12 +94,12 @@ public class RestrictedProcessor implements CoreMethodProcessor, SmsDaoAware { if (dailyMaxLimitExists) { Integer dailyCount = (Integer) smsDao.get(accountMaxKey); if (SmsUtils.isEmpty(dailyCount)) { - smsDao.set(accountMaxKey, 1, accTimer / 1000); + smsDao.set(accountMaxKey, 1, calculateExpiryTime()); } else if (dailyCount >= accountMax) { log.info("The phone: {},number of short messages reached the maximum today", phone); throw new SmsBlendException("The phone: {},number of short messages reached the maximum today", phone); } else { - smsDao.set(accountMaxKey, dailyCount + 1, accTimer / 1000); + smsDao.set(accountMaxKey, dailyCount + 1, calculateExpiryTime()); } } // 是否配置了每分钟最大限制 @@ -105,7 +113,7 @@ public class RestrictedProcessor implements CoreMethodProcessor, SmsDaoAware { if (dailyMaxLimitExists) { Integer dailyCount = (Integer) smsDao.get(accountMaxKey); if (dailyCount > 1) { - smsDao.set(accountMaxKey, dailyCount - 1, accTimer / 1000); + smsDao.set(accountMaxKey, dailyCount - 1, calculateExpiryTime()); } else { smsDao.remove(accountMaxKey); } From 09a3dba01613cc5c58cf2187656fb494f0b045de Mon Sep 17 00:00:00 2001 From: wind Date: Wed, 26 Feb 2025 19:40:51 +0800 Subject: [PATCH 21/23] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=8C=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=8A=B6=E6=80=81=E4=B8=8B=20=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E9=87=8D=E8=AF=95=E6=97=A0=E9=99=90=E6=AC=A1=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E5=B8=83=E4=B8=81=E4=BA=91=E7=9F=AD?= =?UTF-8?q?=E4=BF=A1=E7=BE=A4=E5=8F=91=E9=87=87=E7=94=A8=E8=87=AA=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/sms4j/aliyun/service/AlibabaSmsImpl.java | 2 +- .../sms4j/budingyun/service/BudingV2SmsImpl.java | 10 ++++++++-- .../sms4j/chuanglan/service/ChuangLanSmsImpl.java | 2 +- .../dromara/sms4j/huawei/service/HuaweiSmsImpl.java | 5 +++-- .../dromara/sms4j/jdcloud/service/JdCloudSmsImpl.java | 2 +- .../java/org/dromara/sms4j/jg/service/JgSmsImpl.java | 2 +- .../java/org/dromara/sms4j/mas/service/MasSmsImpl.java | 2 +- .../dromara/sms4j/netease/service/NeteaseSmsImpl.java | 2 +- .../org/dromara/sms4j/qiniu/service/QiNiuSmsImpl.java | 2 +- .../dromara/sms4j/tencent/service/TencentSmsImpl.java | 2 +- .../dromara/sms4j/yunpian/service/YunPianSmsImpl.java | 4 ++-- .../dromara/sms4j/zhutong/service/ZhutongSmsImpl.java | 4 ++-- .../sms4j/example/zhangjun/ZhangJunSmsImpl.java | 2 +- .../sms4j/example/zhangjun/ZhangJunSmsImpl.java | 2 +- 14 files changed, 25 insertions(+), 18 deletions(-) diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/service/AlibabaSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/service/AlibabaSmsImpl.java index d522c2fe..c8b3e0e9 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/service/AlibabaSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/aliyun/service/AlibabaSmsImpl.java @@ -116,7 +116,7 @@ public class AlibabaSmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/service/BudingV2SmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/service/BudingV2SmsImpl.java index 2605be01..f1f77346 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/service/BudingV2SmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/service/BudingV2SmsImpl.java @@ -11,6 +11,7 @@ import org.dromara.sms4j.comm.delayedTime.DelayedTime; import org.dromara.sms4j.comm.exception.SmsBlendException; import org.dromara.sms4j.provider.service.AbstractSmsBlend; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -72,7 +73,7 @@ public class BudingV2SmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } @@ -150,7 +151,12 @@ public class BudingV2SmsImpl extends AbstractSmsBlend { */ @Override public SmsResponse massTexting(List phones, String templateId, LinkedHashMap messages) { - throw new SmsBlendException("布丁云V2暂不支持多条短信发送"); + List list = new ArrayList<>(); + for (String phone : phones) { + SmsResponse smsResponse = sendMessage(phone, templateId, messages); + list.add(smsResponse); + } + return SmsRespUtils.resp(list, true, getConfigId()); } private Map getHeaders() { diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/chuanglan/service/ChuangLanSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/chuanglan/service/ChuangLanSmsImpl.java index 61a5c57e..03cba1d9 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/chuanglan/service/ChuangLanSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/chuanglan/service/ChuangLanSmsImpl.java @@ -107,7 +107,7 @@ public class ChuangLanSmsImpl extends AbstractSmsBlend { }catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/huawei/service/HuaweiSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/huawei/service/HuaweiSmsImpl.java index b3415aa6..83b0f8dc 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/huawei/service/HuaweiSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/huawei/service/HuaweiSmsImpl.java @@ -21,13 +21,14 @@ import java.util.Map; import java.util.Objects; import java.util.UUID; import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicInteger; import static org.dromara.sms4j.huawei.utils.HuaweiBuilder.listToString; @Slf4j public class HuaweiSmsImpl extends AbstractSmsBlend { - private int retry = 0; + private volatile int retry = 0; public HuaweiSmsImpl(HuaweiConfig config, Executor pool, DelayedTime delayed) { super(config, pool, delayed); @@ -80,7 +81,7 @@ public class HuaweiSmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/jdcloud/service/JdCloudSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/jdcloud/service/JdCloudSmsImpl.java index 886d9141..52ee7479 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/jdcloud/service/JdCloudSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/jdcloud/service/JdCloudSmsImpl.java @@ -99,7 +99,7 @@ public class JdCloudSmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/jg/service/JgSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/jg/service/JgSmsImpl.java index 77fa6110..69ad7928 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/jg/service/JgSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/jg/service/JgSmsImpl.java @@ -119,7 +119,7 @@ public class JgSmsImpl extends AbstractSmsBlend { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/mas/service/MasSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/mas/service/MasSmsImpl.java index b19dfa68..5e9fb61c 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/mas/service/MasSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/mas/service/MasSmsImpl.java @@ -97,7 +97,7 @@ public class MasSmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/netease/service/NeteaseSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/netease/service/NeteaseSmsImpl.java index f5ac172a..8972be81 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/netease/service/NeteaseSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/netease/service/NeteaseSmsImpl.java @@ -145,7 +145,7 @@ public class NeteaseSmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/qiniu/service/QiNiuSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/qiniu/service/QiNiuSmsImpl.java index 296fded0..d0dd632b 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/qiniu/service/QiNiuSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/qiniu/service/QiNiuSmsImpl.java @@ -88,7 +88,7 @@ public class QiNiuSmsImpl extends AbstractSmsBlend { }catch (SmsBlendException e){ smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/service/TencentSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/service/TencentSmsImpl.java index 1ed7a034..c92b789b 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/service/TencentSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/service/TencentSmsImpl.java @@ -87,7 +87,7 @@ public class TencentSmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java index f6a5c842..07013176 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/yunpian/service/YunPianSmsImpl.java @@ -58,7 +58,7 @@ public class YunPianSmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } @@ -94,7 +94,7 @@ public class YunPianSmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/zhutong/service/ZhutongSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/zhutong/service/ZhutongSmsImpl.java index 2b15ee6a..311936c9 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/zhutong/service/ZhutongSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/zhutong/service/ZhutongSmsImpl.java @@ -155,7 +155,7 @@ public class ZhutongSmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } @@ -241,7 +241,7 @@ public class ZhutongSmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } diff --git a/sms4j-solon-plugin-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java b/sms4j-solon-plugin-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java index bcb6ef29..31f1b5a2 100644 --- a/sms4j-solon-plugin-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java +++ b/sms4j-solon-plugin-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java @@ -93,7 +93,7 @@ public class ZhangJunSmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } diff --git a/sms4j-spring-boot-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java b/sms4j-spring-boot-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java index bcb6ef29..31f1b5a2 100644 --- a/sms4j-spring-boot-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java +++ b/sms4j-spring-boot-example/src/main/java/org/dromara/sms4j/example/zhangjun/ZhangJunSmsImpl.java @@ -93,7 +93,7 @@ public class ZhangJunSmsImpl extends AbstractSmsBlend { } catch (SmsBlendException e) { smsResponse = errorResp(e.message); } - if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + if (smsResponse.isSuccess() || retry >= getConfig().getMaxRetries()) { retry = 0; return smsResponse; } From bc8e329bfa6b07bb1b219291814e37548550b94e Mon Sep 17 00:00:00 2001 From: wind Date: Wed, 26 Feb 2025 19:50:13 +0800 Subject: [PATCH 22/23] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../src/main/java/org/dromara/sms4j/comm/constant/Constant.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 44094081..15a10028 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ - 3.3.1-SNAPSHOT + 3.3.4-SNAPSHOT UTF-8 UTF-8 diff --git a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/constant/Constant.java b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/constant/Constant.java index fd62a17e..2fd7290b 100644 --- a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/constant/Constant.java +++ b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/constant/Constant.java @@ -11,7 +11,7 @@ public abstract class Constant { /** * 项目版本号 */ - public static final String VERSION = "V 3.2.0"; + public static final String VERSION = "V 3.3.4"; /** * 用于格式化鉴权头域,给"Authorization"参数赋值 From b168d5235f4d4c9aaac90f04fc3d107dd0a60692 Mon Sep 17 00:00:00 2001 From: bleachtred Date: Mon, 3 Mar 2025 16:43:33 +0800 Subject: [PATCH 23/23] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9Ehttp=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms4j/api/universal/ProxyConfig.java | 27 +++++ .../sms4j/api/universal/SupplierConfig.java | 5 + .../sms4j/comm/utils/SmsHttpUtils.java | 113 ++++++++++++++++-- .../sms4j/provider/config/BaseConfig.java | 7 ++ .../provider/service/AbstractSmsBlend.java | 15 ++- .../src/main/resources/application.yml | 6 + 6 files changed, 163 insertions(+), 10 deletions(-) create mode 100644 sms4j-api/src/main/java/org/dromara/sms4j/api/universal/ProxyConfig.java diff --git a/sms4j-api/src/main/java/org/dromara/sms4j/api/universal/ProxyConfig.java b/sms4j-api/src/main/java/org/dromara/sms4j/api/universal/ProxyConfig.java new file mode 100644 index 00000000..4c54325a --- /dev/null +++ b/sms4j-api/src/main/java/org/dromara/sms4j/api/universal/ProxyConfig.java @@ -0,0 +1,27 @@ +package org.dromara.sms4j.api.universal; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 短信代理配置类 + */ +@Data +public class ProxyConfig implements Serializable { + + /** + * 是否启用代理 默认不启用 + */ + private Boolean enable = false; + + /** + * 代理服务器地址 + */ + private String host; + + /** + * 代理服务器端口 + */ + private Integer port; +} diff --git a/sms4j-api/src/main/java/org/dromara/sms4j/api/universal/SupplierConfig.java b/sms4j-api/src/main/java/org/dromara/sms4j/api/universal/SupplierConfig.java index 4537cab3..8d2d8ba5 100644 --- a/sms4j-api/src/main/java/org/dromara/sms4j/api/universal/SupplierConfig.java +++ b/sms4j-api/src/main/java/org/dromara/sms4j/api/universal/SupplierConfig.java @@ -22,4 +22,9 @@ public interface SupplierConfig { */ String getSupplier(); + /** + * 获取代理配置 + * + */ + ProxyConfig getProxy(); } diff --git a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/utils/SmsHttpUtils.java b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/utils/SmsHttpUtils.java index 7048e0e4..c931e9db 100644 --- a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/utils/SmsHttpUtils.java +++ b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/utils/SmsHttpUtils.java @@ -1,9 +1,11 @@ package org.dromara.sms4j.comm.utils; import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.URLUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; +import cn.hutool.http.Method; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import org.dromara.sms4j.comm.exception.SmsBlendException; @@ -12,15 +14,108 @@ import java.util.Map; public class SmsHttpUtils { + /** + * 是否启用代理 默认不启用 + */ + private final Boolean enable; + + /** + * 代理服务器地址 + */ + private final String host; + + /** + * 代理服务器端口 + */ + private final Integer port; + + // 无代理单例(饿汉式加载) + private static final SmsHttpUtils NON_PROXY_INSTANCE = new SmsHttpUtils(); + + // 代理单例(双重校验锁延迟加载) + private static volatile SmsHttpUtils PROXY_INSTANCE; + + // 无代理构造方法 private SmsHttpUtils() { + this.enable = false; + this.host = null; + this.port = null; } - private static class SmsHttpHolder { - private static final SmsHttpUtils INSTANCE = new SmsHttpUtils(); + // 代理构造方法 + private SmsHttpUtils(String host, Integer port) { + this.enable = true; + this.host = host; + this.port = port; } + /** + * 获取无代理单例 + */ public static SmsHttpUtils instance() { - return SmsHttpHolder.INSTANCE; + return NON_PROXY_INSTANCE; + } + + /** + * 获取代理单例(线程安全 + 参数校验) + */ + public static SmsHttpUtils instance(String host, Integer port) { + if (PROXY_INSTANCE == null) { + synchronized (SmsHttpUtils.class) { + if (PROXY_INSTANCE == null) { + validateProxyParams(host, port); + PROXY_INSTANCE = new SmsHttpUtils(host, port); + } + } + } else { + // 二次调用时校验参数一致性 + if (!PROXY_INSTANCE.host.equals(host) || !PROXY_INSTANCE.port.equals(port)) { + throw new IllegalStateException("Proxy parameters cannot be modified after initialization"); + } + } + return PROXY_INSTANCE; + } + + // 代理参数校验 + private static void validateProxyParams(String host, Integer port) { + if (StrUtil.isBlank(host) || port == null || port <= 0) { + throw new IllegalArgumentException("Invalid proxy host or port"); + } + } + + /** + * 配置请求 是否走代理 + * @param url 请求地址 + * @return HttpRequest + */ + private HttpRequest request(String url){ + HttpRequest request = HttpRequest.of(url); + if (enable){ + request.setHttpProxy(host, port); + } + return request; + } + + /** + * 构造post请求 + * @param url 请求地址 + * @return HttpRequest + */ + private HttpRequest post(String url){ + HttpRequest post = request(url); + post.setMethod(Method.POST); + return post; + } + + /** + * 构造get请求 + * @param url 请求地址 + * @return HttpRequest + */ + private HttpRequest get(String url){ + HttpRequest get = request(url); + get.setMethod(Method.GET); + return get; } /** @@ -32,7 +127,7 @@ public class SmsHttpUtils { * @return 返回体 */ public JSONObject postJson(String url, Map headers, String body) { - try (HttpResponse response = HttpRequest.post(url) + try (HttpResponse response = post(url) .addHeaders(headers) .body(body) .execute()) { @@ -63,7 +158,7 @@ public class SmsHttpUtils { * @return 返回体 */ public JSONObject postFrom(String url, Map headers, Map body) { - try (HttpResponse response = HttpRequest.post(url) + try (HttpResponse response = post(url) .addHeaders(headers) .form(body) .execute()) { @@ -84,7 +179,7 @@ public class SmsHttpUtils { * @return 返回体 */ public JSONObject postBasicFrom(String url, Map headers, String username, String password, Map body) { - try (HttpResponse response = HttpRequest.post(url) + try (HttpResponse response = post(url) .addHeaders(headers) .basicAuth(username, password) .form(body) @@ -105,7 +200,7 @@ public class SmsHttpUtils { */ public JSONObject postUrl(String url, Map headers, Map params) { String urlWithParams = url + "?" + URLUtil.buildQuery(params, null); - try (HttpResponse response = HttpRequest.post(urlWithParams) + try (HttpResponse response = post(urlWithParams) .addHeaders(headers) .execute()) { return JSONUtil.parseObj(response.body()); @@ -121,7 +216,7 @@ public class SmsHttpUtils { * @return 返回体 */ public JSONObject getBasic(String url, String username, String password) { - try (HttpResponse response = HttpRequest.get(url) + try (HttpResponse response = get(url) .basicAuth(username, password) .execute()) { return JSONUtil.parseObj(response.body()); @@ -137,7 +232,7 @@ public class SmsHttpUtils { * @return 返回体 */ public JSONObject getUrl(String url) { - try (HttpResponse response = HttpRequest.get(url) + try (HttpResponse response = get(url) .execute()) { return JSONUtil.parseObj(response.body()); } catch (Exception e) { diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/provider/config/BaseConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/provider/config/BaseConfig.java index 99b1a002..24826d64 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/provider/config/BaseConfig.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/provider/config/BaseConfig.java @@ -1,6 +1,7 @@ package org.dromara.sms4j.provider.config; import lombok.Data; +import org.dromara.sms4j.api.universal.ProxyConfig; import org.dromara.sms4j.api.universal.SupplierConfig; import org.dromara.sms4j.comm.exception.SmsBlendException; @@ -56,6 +57,12 @@ public abstract class BaseConfig implements SupplierConfig { */ private String configId; + /** + * 代理配置 + * + */ + private ProxyConfig proxy; + /** * 重试间隔(单位:秒),默认为5秒 */ diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/provider/service/AbstractSmsBlend.java b/sms4j-provider/src/main/java/org/dromara/sms4j/provider/service/AbstractSmsBlend.java index 915a9b82..daadbc8f 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/provider/service/AbstractSmsBlend.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/provider/service/AbstractSmsBlend.java @@ -5,6 +5,7 @@ import lombok.Getter; import org.dromara.sms4j.api.SmsBlend; import org.dromara.sms4j.api.callback.CallBack; import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.api.universal.ProxyConfig; import org.dromara.sms4j.api.universal.SupplierConfig; import org.dromara.sms4j.api.utils.SmsRespUtils; import org.dromara.sms4j.comm.delayedTime.DelayedTime; @@ -32,13 +33,19 @@ public abstract class AbstractSmsBlend implements SmsB protected final DelayedTime delayed; - protected final SmsHttpUtils http = SmsHttpUtils.instance(); + protected final SmsHttpUtils http; protected AbstractSmsBlend(C config, Executor pool, DelayedTime delayed) { this.configId = StrUtil.isEmpty(config.getConfigId()) ? getSupplier() : config.getConfigId(); this.config = config; this.pool = pool; this.delayed = delayed; + ProxyConfig proxy = config.getProxy(); + if (proxy != null && proxy.getEnable()){ + this.http = SmsHttpUtils.instance(proxy.getHost(), proxy.getPort()); + }else { + this.http = SmsHttpUtils.instance(); + } } protected AbstractSmsBlend(C config) { @@ -46,6 +53,12 @@ public abstract class AbstractSmsBlend implements SmsB this.config = config; this.pool = BeanFactory.getExecutor(); this.delayed = BeanFactory.getDelayedTime(); + ProxyConfig proxy = config.getProxy(); + if (proxy != null && proxy.getEnable()){ + this.http = SmsHttpUtils.instance(proxy.getHost(), proxy.getPort()); + }else { + this.http = SmsHttpUtils.instance(); + } } protected C getConfig() { diff --git a/sms4j-spring-boot-example/src/main/resources/application.yml b/sms4j-spring-boot-example/src/main/resources/application.yml index 6018467c..84556af2 100644 --- a/sms4j-spring-boot-example/src/main/resources/application.yml +++ b/sms4j-spring-boot-example/src/main/resources/application.yml @@ -18,6 +18,12 @@ sms: template-id: SMS_272470496 # 模版名称 templateName: code + # 代理 + proxy: + # 是否启用代理 默认关闭 需手动开启 + enable: true + host: 127.0.0.1 + port: 8080 # 腾讯短信例子 tx: #厂商标识