diff --git a/.flattened-pom.xml b/.flattened-pom.xml
index 45c77047..d5388bcf 100644
--- a/.flattened-pom.xml
+++ b/.flattened-pom.xml
@@ -35,6 +35,7 @@
sms-aggregation-yunpian
sms-aggregation-huawei
sms-aggregation-jdcloud
+ sms-aggregation-cloopen
scm:git:https://gitee.com/MR-wind/sms_aggregation.git
@@ -55,6 +56,7 @@
0.0.4
3.14.9
+ 1.0.4
2.0.23
2.0.15
1.5.30
@@ -133,6 +135,11 @@
sms-aggregation-jdcloud
1.0.5
+
+ kim.wind
+ sms-aggregation-cloopen
+ 1.0.5
+
com.aliyun
dysmsapi20170525
@@ -192,6 +199,11 @@
sms
${jdcloud.version}
+
+ com.cloopen
+ java-sms-sdk
+ ${cloopen.version}
+
com.squareup.okhttp3
okhttp
diff --git a/pom.xml b/pom.xml
index e7e1ff8d..b071a4f4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,6 +22,7 @@
sms-aggregation-yunpian
sms-aggregation-huawei
sms-aggregation-jdcloud
+ sms-aggregation-cloopen
@@ -57,6 +58,7 @@
3.1.622
0.0.4
1.3.3
+ 1.0.4
2.0.15
3.14.9
1.5.30
@@ -149,6 +151,12 @@
${revision}
+
+ kim.wind
+ sms-aggregation-cloopen
+ ${revision}
+
+
com.aliyun
@@ -224,6 +232,13 @@
${jdcloud.version}
+
+
+ com.cloopen
+ java-sms-sdk
+ ${cloopen.version}
+
+
com.squareup.okhttp3
diff --git a/sms-aggregation-autoimmit/src/main/java/org/dromara/sms/autoimmit/config/SupplierConfig.java b/sms-aggregation-autoimmit/src/main/java/org/dromara/sms/autoimmit/config/SupplierConfig.java
index 2791a575..06f89db0 100644
--- a/sms-aggregation-autoimmit/src/main/java/org/dromara/sms/autoimmit/config/SupplierConfig.java
+++ b/sms-aggregation-autoimmit/src/main/java/org/dromara/sms/autoimmit/config/SupplierConfig.java
@@ -1,6 +1,7 @@
package org.dromara.sms.autoimmit.config;
import org.dromara.sms.aliyun.config.AlibabaConfig;
+import org.dromara.sms.cloopen.config.CloopenConfig;
import org.dromara.sms.core.config.SupplierFactory;
import org.dromara.sms.huawei.config.HuaweiConfig;
import org.dromara.sms.jdcloud.config.JdCloudConfig;
@@ -53,6 +54,13 @@ public class SupplierConfig {
return SupplierFactory.getJdCloudConfig();
}
+ /** 容联云短信差异化配置 */
+ @Bean
+ @ConfigurationProperties(prefix = "sms.cloopen")
+ protected CloopenConfig cloopenConfig(){
+ return SupplierFactory.getCloopenConfig();
+ }
+
/** 为的是延后执行*/
protected void init(){
diff --git a/sms-aggregation-cloopen/.flattened-pom.xml b/sms-aggregation-cloopen/.flattened-pom.xml
new file mode 100644
index 00000000..603d047f
--- /dev/null
+++ b/sms-aggregation-cloopen/.flattened-pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+
+ kim.wind
+ sms_aggregation
+ 1.0.5
+
+ kim.wind
+ sms-aggregation-cloopen
+ 1.0.5
+ sms-aggregation-cloopen
+ sms-aggregation-cloopen
+
+
+ Apache 2
+ http://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+ A business-friendly OSS license
+
+
+
+
+ com.cloopen
+ java-sms-sdk
+
+
+ kim.wind
+ sms-aggregation-comm
+
+
+ kim.wind
+ sms-aggregation-api
+
+
+
diff --git a/sms-aggregation-cloopen/.mvn/wrapper/maven-wrapper.jar b/sms-aggregation-cloopen/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 00000000..bf82ff01
Binary files /dev/null and b/sms-aggregation-cloopen/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/sms-aggregation-cloopen/.mvn/wrapper/maven-wrapper.properties b/sms-aggregation-cloopen/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 00000000..ca5ab4ba
--- /dev/null
+++ b/sms-aggregation-cloopen/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar
diff --git a/sms-aggregation-cloopen/pom.xml b/sms-aggregation-cloopen/pom.xml
new file mode 100644
index 00000000..be278bd1
--- /dev/null
+++ b/sms-aggregation-cloopen/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+
+ kim.wind
+ sms_aggregation
+ ${revision}
+ ../pom.xml
+
+
+ sms-aggregation-cloopen
+ sms-aggregation-cloopen
+ sms-aggregation-cloopen
+ ${revision}
+
+
+
+
+ com.cloopen
+ java-sms-sdk
+
+
+
+ kim.wind
+ sms-aggregation-comm
+
+
+
+ kim.wind
+ sms-aggregation-api
+
+
+
\ No newline at end of file
diff --git a/sms-aggregation-cloopen/src/main/java/org/dromara/sms/cloopen/config/CloopenConfig.java b/sms-aggregation-cloopen/src/main/java/org/dromara/sms/cloopen/config/CloopenConfig.java
new file mode 100644
index 00000000..d11f6b21
--- /dev/null
+++ b/sms-aggregation-cloopen/src/main/java/org/dromara/sms/cloopen/config/CloopenConfig.java
@@ -0,0 +1,31 @@
+package org.dromara.sms.cloopen.config;
+
+import lombok.Data;
+
+/**
+ * 容联云短信配置属性
+ *
+ * @author Charles7c
+ * @since 2023/4/10 22:10
+ */
+@Data
+public class CloopenConfig {
+
+ /** Access Key */
+ private String accessKeyId;
+
+ /** Access Key Secret */
+ private String accessKeySecret;
+
+ /** 模板 ID */
+ private String templateId;
+
+ /** 应用 ID */
+ private String appId;
+
+ /** Rest URL 域名 */
+ private String serverIp;
+
+ /** Rest URL 端口 */
+ private String serverPort;
+}
diff --git a/sms-aggregation-cloopen/src/main/java/org/dromara/sms/cloopen/config/CloopenSmsConfig.java b/sms-aggregation-cloopen/src/main/java/org/dromara/sms/cloopen/config/CloopenSmsConfig.java
new file mode 100644
index 00000000..59f45508
--- /dev/null
+++ b/sms-aggregation-cloopen/src/main/java/org/dromara/sms/cloopen/config/CloopenSmsConfig.java
@@ -0,0 +1,68 @@
+package org.dromara.sms.cloopen.config;
+
+import com.cloopen.rest.sdk.BodyType;
+import com.cloopen.rest.sdk.CCPRestSmsSDK;
+import org.dromara.sms.cloopen.service.CloopenSmsImpl;
+import org.dromara.sms.comm.factory.BeanFactory;
+
+/**
+ * 容联云短信配置
+ *
+ * @author Charles7c
+ * @since 2023/4/10 22:10
+ */
+public class CloopenSmsConfig {
+
+ private static CloopenSmsImpl cloopenSms;
+
+ private static CloopenSmsConfig cloopenSmsConfig;
+
+ /**
+ * 客户端对象
+ *
+ * @param cloopenConfig 容联云短信配置属性
+ * @return 客户端对象
+ */
+ public CCPRestSmsSDK client(CloopenConfig cloopenConfig) {
+ CCPRestSmsSDK sdk = new CCPRestSmsSDK();
+ sdk.init(cloopenConfig.getServerIp(), cloopenConfig.getServerPort());
+ sdk.setAccount(cloopenConfig.getAccessKeyId(), cloopenConfig.getAccessKeySecret());
+ sdk.setAppId(cloopenConfig.getAppId());
+ sdk.setBodyType(BodyType.Type_JSON);
+ return sdk;
+ }
+
+ /**
+ * 创建容联云短信实现
+ */
+ public static CloopenSmsImpl createCloopenSms(CloopenConfig cloopenConfig) {
+ if (cloopenSmsConfig == null) {
+ cloopenSmsConfig = new CloopenSmsConfig();
+ }
+ if (cloopenSms == null) {
+ cloopenSms = new CloopenSmsImpl(
+ cloopenSmsConfig.client(cloopenConfig),
+ cloopenConfig,
+ BeanFactory.getExecutor(),
+ BeanFactory.getDelayedTime()
+ );
+ }
+ return cloopenSms;
+ }
+
+ /**
+ * 刷新对象
+ */
+ public static CloopenSmsImpl refresh(CloopenConfig cloopenConfig) {
+ if (cloopenSmsConfig == null) {
+ cloopenSmsConfig = new CloopenSmsConfig();
+ }
+ cloopenSms = new CloopenSmsImpl(
+ cloopenSmsConfig.client(cloopenConfig),
+ cloopenConfig,
+ BeanFactory.getExecutor(),
+ BeanFactory.getDelayedTime()
+ );
+ return cloopenSms;
+ }
+}
diff --git a/sms-aggregation-cloopen/src/main/java/org/dromara/sms/cloopen/service/CloopenSmsImpl.java b/sms-aggregation-cloopen/src/main/java/org/dromara/sms/cloopen/service/CloopenSmsImpl.java
new file mode 100644
index 00000000..6834a674
--- /dev/null
+++ b/sms-aggregation-cloopen/src/main/java/org/dromara/sms/cloopen/service/CloopenSmsImpl.java
@@ -0,0 +1,169 @@
+package org.dromara.sms.cloopen.service;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.json.JSONUtil;
+import com.cloopen.rest.sdk.CCPRestSmsSDK;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.sms.api.SmsBlend;
+import org.dromara.sms.api.callback.CallBack;
+import org.dromara.sms.api.entity.SmsResponse;
+import org.dromara.sms.cloopen.config.CloopenConfig;
+import org.dromara.sms.comm.annotation.Restricted;
+import org.dromara.sms.comm.delayedTime.DelayedTime;
+import org.dromara.sms.comm.exception.SmsBlendException;
+
+import java.util.*;
+import java.util.concurrent.Executor;
+
+/**
+ * 容联云短信实现
+ *
+ * @author Charles7c
+ * @since 2023/4/10 22:10
+ */
+@Slf4j
+public class CloopenSmsImpl implements SmsBlend {
+
+ private final CCPRestSmsSDK client;
+
+ private final CloopenConfig config;
+
+ private final Executor pool;
+
+ private final DelayedTime delayed;
+
+ public CloopenSmsImpl(CCPRestSmsSDK client, CloopenConfig config, Executor pool, DelayedTime delayed) {
+ this.client = client;
+ this.config = config;
+ this.pool = pool;
+ this.delayed = delayed;
+ }
+
+ @Override
+ @Restricted
+ public SmsResponse sendMessage(String phone, String message) {
+ return massTexting(Collections.singletonList(phone), message);
+ }
+
+ @Override
+ @Restricted
+ public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap messages) {
+ return massTexting(Collections.singletonList(phone), templateId, messages);
+ }
+
+ @Override
+ @Restricted
+ public SmsResponse massTexting(List phones, String message) {
+ LinkedHashMap map = new LinkedHashMap<>();
+ map.put(IdUtil.fastSimpleUUID(), message);
+ return massTexting(phones, config.getTemplateId(), map);
+ }
+
+ @Override
+ @Restricted
+ public SmsResponse massTexting(List phones, String templateId, LinkedHashMap messages) {
+ SmsResponse smsResponse = new SmsResponse();
+ Map result = null;
+ try {
+ String[] datas = messages.keySet().stream().map(messages::get).toArray(String[]::new);
+ result = client.sendTemplateSMS(String.join(",", phones), templateId, datas);
+
+ String statusCode = Convert.toStr(result.get("statusCode"));
+ String statusMsg = Convert.toStr(result.get("statusMsg"));
+ smsResponse.setData(result.get("data"));
+ smsResponse.setCode(statusCode);
+ smsResponse.setMessage(statusMsg);
+ boolean isSuccess = "000000".equals(statusCode);
+ if (!isSuccess) {
+ smsResponse.setErrMessage(statusMsg);
+ smsResponse.setErrorCode(statusCode);
+ } else {
+ Object bizId = JSONUtil.getByPath(JSONUtil.parse(result.get("data")), "templateSMS.smsMessageSid");
+ smsResponse.setBizId(Convert.toStr(bizId));
+ }
+ } catch (Exception e) {
+ if (result != null) {
+ smsResponse.setErrMessage(Convert.toStr(result.get("statusMsg")));
+ smsResponse.setErrorCode(Convert.toStr(result.get("statusCode")));
+ } else {
+ throw new SmsBlendException(e.getMessage());
+ }
+ }
+ return smsResponse;
+ }
+
+ @Override
+ @Restricted
+ public void sendMessageAsync(String phone, String message, CallBack callBack) {
+ pool.execute(() -> {
+ SmsResponse smsResponse = sendMessage(phone, message);
+ callBack.callBack(smsResponse);
+ });
+ }
+
+ @Override
+ @Restricted
+ public void sendMessageAsync(String phone, String message) {
+ pool.execute(() -> sendMessage(phone, message));
+ }
+
+ @Override
+ @Restricted
+ public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) {
+ pool.execute(() -> {
+ SmsResponse smsResponse = sendMessage(phone, templateId, messages);
+ callBack.callBack(smsResponse);
+ });
+ }
+
+ @Override
+ @Restricted
+ public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages) {
+ pool.execute(() -> sendMessage(phone, templateId, messages));
+ }
+
+ @Override
+ @Restricted
+ public void delayedMessage(String phone, String message, Long delayedTime) {
+ this.delayed.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ sendMessage(phone, message);
+ }
+ }, delayedTime);
+ }
+
+ @Override
+ @Restricted
+ public void delayedMessage(String phone, String templateId, LinkedHashMap messages, Long delayedTime) {
+ this.delayed.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ sendMessage(phone, templateId, messages);
+ }
+ }, delayedTime);
+ }
+
+ @Override
+ @Restricted
+ public void delayMassTexting(List phones, String message, Long delayedTime) {
+ this.delayed.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ massTexting(phones, message);
+ }
+ }, delayedTime);
+ }
+
+ @Override
+ @Restricted
+ public void delayMassTexting(List phones, String templateId, LinkedHashMap messages, Long delayedTime) {
+ this.delayed.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ massTexting(phones, templateId, messages);
+ }
+ }, delayedTime);
+ }
+}
diff --git a/sms-aggregation-cloopen/src/main/resources/application.properties b/sms-aggregation-cloopen/src/main/resources/application.properties
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/sms-aggregation-cloopen/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/sms-aggregation-comm/src/main/java/org/dromara/sms/comm/enumerate/SupplierType.java b/sms-aggregation-comm/src/main/java/org/dromara/sms/comm/enumerate/SupplierType.java
index 520261ca..2b5e49d4 100644
--- a/sms-aggregation-comm/src/main/java/org/dromara/sms/comm/enumerate/SupplierType.java
+++ b/sms-aggregation-comm/src/main/java/org/dromara/sms/comm/enumerate/SupplierType.java
@@ -19,6 +19,8 @@ public enum SupplierType {
UNI_SMS("合一短信"),
/** 京东云 */
JD_CLOUD("京东云短信"),
+ /** 容联云 */
+ CLOOPEN("容联云短信"),
;
diff --git a/sms-aggregation-core/.flattened-pom.xml b/sms-aggregation-core/.flattened-pom.xml
index cc27c480..1f3a3a56 100644
--- a/sms-aggregation-core/.flattened-pom.xml
+++ b/sms-aggregation-core/.flattened-pom.xml
@@ -45,6 +45,10 @@
kim.wind
sms-aggregation-jdcloud
+
+ kim.wind
+ sms-aggregation-cloopen
+
diff --git a/sms-aggregation-core/pom.xml b/sms-aggregation-core/pom.xml
index 51ab6c95..0d42b94c 100644
--- a/sms-aggregation-core/pom.xml
+++ b/sms-aggregation-core/pom.xml
@@ -45,6 +45,11 @@
kim.wind
sms-aggregation-jdcloud
+
+
+ kim.wind
+ sms-aggregation-cloopen
+
diff --git a/sms-aggregation-core/src/main/java/org/dromara/sms/core/config/SupplierFactory.java b/sms-aggregation-core/src/main/java/org/dromara/sms/core/config/SupplierFactory.java
index c15b157a..35d29e21 100644
--- a/sms-aggregation-core/src/main/java/org/dromara/sms/core/config/SupplierFactory.java
+++ b/sms-aggregation-core/src/main/java/org/dromara/sms/core/config/SupplierFactory.java
@@ -1,6 +1,7 @@
package org.dromara.sms.core.config;
import org.dromara.sms.aliyun.config.AlibabaConfig;
+import org.dromara.sms.cloopen.config.CloopenConfig;
import org.dromara.sms.huawei.config.HuaweiConfig;
import org.dromara.sms.jdcloud.config.JdCloudConfig;
import org.dromara.sms.tencent.config.TencentConfig;
@@ -35,6 +36,9 @@ public class SupplierFactory {
/** 京东云短信差异配置 */
private static JdCloudConfig jdCloudConfig;
+ /** 容联云短信差异配置 */
+ private static CloopenConfig cloopenConfig;
+
/** 阿里云配置获取*/
public static AlibabaConfig getAlibabaConfig() {
if (alibabaConfig == null){
@@ -82,4 +86,12 @@ public class SupplierFactory {
}
return jdCloudConfig;
}
+
+ /** 容联云短信配置获取 */
+ public static CloopenConfig getCloopenConfig() {
+ if (cloopenConfig == null){
+ cloopenConfig = new CloopenConfig();
+ }
+ return cloopenConfig;
+ }
}
diff --git a/sms-aggregation-core/src/main/java/org/dromara/sms/core/factory/SmsFactory.java b/sms-aggregation-core/src/main/java/org/dromara/sms/core/factory/SmsFactory.java
index fbcfff67..f6fb4135 100644
--- a/sms-aggregation-core/src/main/java/org/dromara/sms/core/factory/SmsFactory.java
+++ b/sms-aggregation-core/src/main/java/org/dromara/sms/core/factory/SmsFactory.java
@@ -2,6 +2,7 @@ package org.dromara.sms.core.factory;
import org.dromara.sms.aliyun.config.AlibabaSmsConfig;
import org.dromara.sms.api.SmsBlend;
+import org.dromara.sms.cloopen.config.CloopenSmsConfig;
import org.dromara.sms.comm.enumerate.SupplierType;
import org.dromara.sms.comm.exception.SmsBlendException;
import org.dromara.sms.core.config.SupplierFactory;
@@ -37,6 +38,8 @@ public class SmsFactory {
return TencentSmsConfig.createTencentSms(SupplierFactory.getTencentConfig());
case JD_CLOUD:
return JdCloudSmsConfig.createJdCloudSms(SupplierFactory.getJdCloudConfig());
+ case CLOOPEN:
+ return CloopenSmsConfig.createCloopenSms(SupplierFactory.getCloopenConfig());
}
throw new SmsBlendException("An attempt to construct a SmsBlend object failed. Please check that the enumeration is valid");
}
diff --git a/sms-aggregation-yunpian/src/main/java/org/dromara/sms/yunpian/config/YunPianSmsConfig.java b/sms-aggregation-yunpian/src/main/java/org/dromara/sms/yunpian/config/YunPianSmsConfig.java
index bd3e8d5e..90106ade 100644
--- a/sms-aggregation-yunpian/src/main/java/org/dromara/sms/yunpian/config/YunPianSmsConfig.java
+++ b/sms-aggregation-yunpian/src/main/java/org/dromara/sms/yunpian/config/YunPianSmsConfig.java
@@ -14,7 +14,7 @@ public class YunPianSmsConfig {
public ForestConfiguration forestConfiguration(YunpianConfig yunpianConfig) {
- return Forest.config().setBackendName("httpclient").setLogEnabled(yunpianConfig.getHttpLog());
+ return Forest.config().setBackendName("httpclient");
}