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"); }