From ca13119acc0d1f2426c39682bb6694f4be9780c0 Mon Sep 17 00:00:00 2001 From: NicholasLD Date: Thu, 21 Mar 2024 02:52:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=B8=83=E4=B8=81?= =?UTF-8?q?=E4=BA=91=E7=9F=AD=E4=BF=A1V2=20Provider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms4j/comm/constant/SupplierConstant.java | 5 + .../budingyun/config/BudingV2Config.java | 40 ++++ .../budingyun/config/BudingV2Factory.java | 33 ++++ .../budingyun/service/BudingV2SmsImpl.java | 174 ++++++++++++++++++ .../starter/config/SmsBlendsInitializer.java | 2 + 5 files changed, 254 insertions(+) create mode 100644 sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/config/BudingV2Config.java create mode 100644 sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/config/BudingV2Factory.java create mode 100644 sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/service/BudingV2SmsImpl.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 7706a9c5..08a26ed9 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 @@ -61,4 +61,9 @@ public abstract class SupplierConstant { public static final String DINGZHONG = "dingzhong"; public static final String QINIU = "qiniu"; + /** + * 布丁云V2 + */ + public static final String BUDING_V2 = "buding_v2"; + } diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/config/BudingV2Config.java b/sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/config/BudingV2Config.java new file mode 100644 index 00000000..fc6b6828 --- /dev/null +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/config/BudingV2Config.java @@ -0,0 +1,40 @@ +package org.dromara.sms4j.budingyun.config; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.sms4j.comm.constant.SupplierConstant; +import org.dromara.sms4j.provider.config.BaseConfig; + +/** + * BudingV2Config + *

布丁云V2短信配置 + * + * @author NicholaslD + * @date 2024/03/21 12:00 + * */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class BudingV2Config extends BaseConfig { + + /** + * 签名密钥 + * 就是发短信的时候的签名,比如:【布丁云】 + */ + private String signKey; + + /** + * 变量列表 + * 用于替换短信模板中的变量 + */ + private String[] args; + + /** + * 获取供应商 + */ + @Override + public String getSupplier() { + return SupplierConstant.BUDING_V2; + } +} diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/config/BudingV2Factory.java b/sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/config/BudingV2Factory.java new file mode 100644 index 00000000..6b4693ff --- /dev/null +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/config/BudingV2Factory.java @@ -0,0 +1,33 @@ +package org.dromara.sms4j.budingyun.config; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.sms4j.budingyun.service.BudingV2SmsImpl; +import org.dromara.sms4j.comm.constant.SupplierConstant; +import org.dromara.sms4j.provider.factory.AbstractProviderFactory; + +/** + * BudingV2Factory + *

布丁云V2短信对象建造 + * + * @author NicholaslD + * @date 2024/03/21 12:00 + * */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class BudingV2Factory extends AbstractProviderFactory { + private static final BudingV2Factory INSTANCE = new BudingV2Factory(); + + public static BudingV2Factory instance() { + return INSTANCE; + } + + @Override + public BudingV2SmsImpl createSms(BudingV2Config budingV2Config) { + return new BudingV2SmsImpl(budingV2Config); + } + + @Override + public String getSupplier() { + return SupplierConstant.BUDING_V2; + } +} 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 new file mode 100644 index 00000000..14bae58d --- /dev/null +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/budingyun/service/BudingV2SmsImpl.java @@ -0,0 +1,174 @@ +package org.dromara.sms4j.budingyun.service; + +import cn.hutool.json.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.budingyun.config.BudingV2Config; +import org.dromara.sms4j.comm.constant.Constant; +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.provider.service.AbstractSmsBlend; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executor; + +/** + * BudingV2SmsImpl 布丁云V2短信实现 + * @author NicholasLD + * @createTime 2024/3/21 01:28 + */ +@Slf4j +public class BudingV2SmsImpl extends AbstractSmsBlend { + + /** + * 重试次数 + */ + private int retry = 0; + + private final String URL = "https://smsapi.idcbdy.com"; + + protected BudingV2SmsImpl(BudingV2Config config, Executor pool, DelayedTime delayed) { + super(config, pool, delayed); + } + + public BudingV2SmsImpl(BudingV2Config config) { + super(config); + } + + @Override + public String getSupplier() { + return SupplierConstant.BUDING_V2; + } + + @Override + public SmsResponse sendMessage(String phone, String message) { + System.out.println("sendMessage"); + Map body = new HashMap<>(); + + System.out.println(getConfig().getSignKey()); + System.out.println(getConfig().getSignature()); + + if (getConfig().getSignKey() == null && getConfig().getSignature() == null) { + throw new SmsBlendException("签名秘钥不能为空"); + } + + if (getConfig().getSignKey() == null) { + body.put("sign", getConfig().getSignature()); + } + + body.put("key", getConfig().getAccessKeyId()); + body.put("to", phone); + body.put("content", message); + + Map headers = getHeaders(); + + SmsResponse smsResponse; + try { + smsResponse = getResponse(http.postFrom(URL + "/Api/Sent", headers, body)); + } catch (SmsBlendException e) { + smsResponse = new SmsResponse(); + smsResponse.setSuccess(false); + smsResponse.setData(e.getMessage()); + } + if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) { + retry = 0; + return smsResponse; + } + return requestRetry(phone, message); + } + + private SmsResponse requestRetry(String phone, String message) { + http.safeSleep(getConfig().getRetryInterval()); + retry++; + log.warn("短信第 {" + retry + "} 次重新发送"); + return sendMessage(phone, message); + } + + private SmsResponse getResponse(JSONObject entries) { + System.out.println(entries); + SmsResponse smsResponse = new SmsResponse(); + if (entries == null) { + smsResponse.setSuccess(false); + return smsResponse; + } + smsResponse.setSuccess(entries.getBool("bool")); + smsResponse.setData(entries); + smsResponse.setConfigId(getConfigId()); + return smsResponse; + } + + /** + * 发送多条短信 + * @param phone 手机号 + * @param messages 消息内容 + * @return 发送结果 + */ + @Override + public SmsResponse sendMessage(String phone, LinkedHashMap messages) { + int failed = 0; + for (String message : messages.values()) { + SmsResponse smsResponse = sendMessage(phone, message); + if (!smsResponse.isSuccess()) { + failed++; + } + } + SmsResponse smsResponse = new SmsResponse(); + smsResponse.setSuccess(failed == 0); + return smsResponse; + } + + /** + * 发送多条短信 (布丁云V2暂不支持模板短信) + * @param phone 手机号 + * @param templateId 模板ID (布丁云V2暂不支持模板短信,此参数无效) + * @param messages 模板参数 + * @return 发送结果 + */ + @Override + public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap messages) { + return sendMessage(phone, messages); + } + + /** + * 群发短信 + * @param phones 手机号列表 + * @param message 消息内容 + * @return 发送结果 + */ + @Override + public SmsResponse massTexting(List phones, String message) { + int failed = 0; + for (String phone : phones) { + SmsResponse smsResponse = sendMessage(phone, message); + if (!smsResponse.isSuccess()) { + failed++; + } + } + SmsResponse smsResponse = new SmsResponse(); + smsResponse.setSuccess(failed == 0); + return smsResponse; + } + + /** + * 群发短信 (布丁云V2暂不支持模板短信,此方法无效) + * @param phones 手机号列表 + * @param templateId 模板ID (布丁云V2暂不支持模板短信,此参数无效) + * @param messages 模板参数 + * @return 发送结果 + */ + @Override + public SmsResponse massTexting(List phones, String templateId, LinkedHashMap messages) { + throw new SmsBlendException("布丁云V2暂不支持多条短信发送"); + } + + private Map getHeaders() { + Map headers = new HashMap<>(); + headers.put("Accept", Constant.APPLICATION_JSON_UTF8); + headers.put("Content-Type", Constant.FROM_URLENCODED); + return headers; + } +} 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 f784546a..e3041e5f 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 @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.aliyun.config.AlibabaFactory; import org.dromara.sms4j.api.SmsBlend; import org.dromara.sms4j.api.universal.SupplierConfig; +import org.dromara.sms4j.budingyun.config.BudingV2Factory; import org.dromara.sms4j.cloopen.config.CloopenFactory; import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.enumerate.ConfigType; @@ -125,6 +126,7 @@ public class SmsBlendsInitializer { ProviderFactoryHolder.registerFactory(LianLuFactory.instance()); ProviderFactoryHolder.registerFactory(DingZhongFactory.instance()); ProviderFactoryHolder.registerFactory(QiNiuFactory.instance()); + ProviderFactoryHolder.registerFactory(BudingV2Factory.instance()); if(SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { ProviderFactoryHolder.registerFactory(JdCloudFactory.instance()); }