From f5625f2c5c0b1d6e8f66b03164a70c425d2d804f Mon Sep 17 00:00:00 2001 From: wind Date: Sat, 6 May 2023 23:53:35 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9uni-sms=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=EF=BC=8C=E5=8E=BB=E9=99=A4SDK=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=202.=E4=BF=AE=E5=A4=8D=E5=9B=9E=E8=B0=83bug=EF=BC=8C?= =?UTF-8?q?=E8=AF=A5bug=E5=AF=BC=E8=87=B4=E5=9B=9E=E8=B0=83=E6=9C=AA?= =?UTF-8?q?=E5=9C=A8=E4=B8=BB=E7=BA=BF=E7=A8=8B=E4=B8=AD=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=203.**=E6=9A=82=E6=97=B6=E6=B3=A8=E9=87=8A=E8=85=BE=E8=AE=AF?= =?UTF-8?q?=E4=BA=91=E7=9F=AD=E4=BF=A1JDK=E4=B8=8D=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=AD=89=E5=BE=85=E4=BF=AE=E5=A4=8D**?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- pom.xml | 50 ++---- .../org/dromara/sms4j/api/package-info.java | 5 + .../dromara/sms4j/autoimmit/package-info.java | 5 + .../org/dromara/sms4j/comm/package-info.java | 5 + .../org/dromara/sms4j/core/package-info.java | 5 + sms4j-provider/pom.xml | 6 - .../sms4j/aliyun/service/AlibabaSmsImpl.java | 13 +- .../sms4j/cloopen/service/CloopenSmsImpl.java | 13 +- .../sms4j/emay/service/EmaySmsImpl.java | 13 +- .../sms4j/huawei/service/HuaweiSmsImpl.java | 13 +- .../sms4j/jdcloud/service/JdCloudSmsImpl.java | 13 +- .../java/org/dromara/sms4j/package-info.java | 5 + .../sms4j/tencent/service/TencentSmsImpl.java | 13 +- .../sms4j/tencent/utils/TencentUtils.java | 11 +- .../sms4j/unisms/config/UniSmsConfig.java | 2 +- .../org/dromara/sms4j/unisms/core/Uni.java | 93 +++++++++++ .../dromara/sms4j/unisms/core/UniClient.java | 152 ++++++++++++++++++ .../sms4j/unisms/core/UniResponse.java | 53 ++++++ .../sms4j/unisms/service/UniSmsImpl.java | 48 +++--- .../sms4j/yunpian/service/YunPianSmsImpl.java | 13 +- sms4j-spring-boot-starter/pom.xml | 6 + 22 files changed, 414 insertions(+), 125 deletions(-) create mode 100644 sms4j-api/src/main/java/org/dromara/sms4j/api/package-info.java create mode 100644 sms4j-autoimmit/src/main/java/org/dromara/sms4j/autoimmit/package-info.java create mode 100644 sms4j-comm/src/main/java/org/dromara/sms4j/comm/package-info.java create mode 100644 sms4j-core/src/main/java/org/dromara/sms4j/core/package-info.java create mode 100644 sms4j-provider/src/main/java/org/dromara/sms4j/package-info.java create mode 100644 sms4j-provider/src/main/java/org/dromara/sms4j/unisms/core/Uni.java create mode 100644 sms4j-provider/src/main/java/org/dromara/sms4j/unisms/core/UniClient.java create mode 100644 sms4j-provider/src/main/java/org/dromara/sms4j/unisms/core/UniResponse.java diff --git a/.gitignore b/.gitignore index 7be295c9..fbd6e9b7 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,4 @@ build/ ### Temp .flattened-pom.xml **/.flattened-pom.xml -/.fastRequest/ +/.fastRequest/** diff --git a/pom.xml b/pom.xml index 6d54319d..b108ced0 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ - 2.7.10 + 2.7.11 2.0.1 2.0.23 3.1.622 @@ -89,6 +89,7 @@ ${revision} + org.dromara.sms4j sms4j-core @@ -145,19 +146,6 @@ provided - - - com.apistd.uni - uni-sdk - ${unisms.version} - - - com.squareup.okhttp3 - okhttp - - - - com.jdcloud.sdk @@ -165,12 +153,6 @@ ${jdcloud.version} - - - com.squareup.okhttp3 - okhttp - ${okhttp.version} - @@ -239,20 +221,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + org.apache.maven.plugins diff --git a/sms4j-api/src/main/java/org/dromara/sms4j/api/package-info.java b/sms4j-api/src/main/java/org/dromara/sms4j/api/package-info.java new file mode 100644 index 00000000..aa96d126 --- /dev/null +++ b/sms4j-api/src/main/java/org/dromara/sms4j/api/package-info.java @@ -0,0 +1,5 @@ +/** + * 公共API + * @author :Wind +*/ +package org.dromara.sms4j.api; \ No newline at end of file diff --git a/sms4j-autoimmit/src/main/java/org/dromara/sms4j/autoimmit/package-info.java b/sms4j-autoimmit/src/main/java/org/dromara/sms4j/autoimmit/package-info.java new file mode 100644 index 00000000..80d90056 --- /dev/null +++ b/sms4j-autoimmit/src/main/java/org/dromara/sms4j/autoimmit/package-info.java @@ -0,0 +1,5 @@ +/** + * Spring Boot自动装配配置 + * @author :Wind +*/ +package org.dromara.sms4j.autoimmit; \ No newline at end of file diff --git a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/package-info.java b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/package-info.java new file mode 100644 index 00000000..7a8072f9 --- /dev/null +++ b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/package-info.java @@ -0,0 +1,5 @@ +/** + * 公共模块 + * @author :Wind +*/ +package org.dromara.sms4j.comm; \ No newline at end of file diff --git a/sms4j-core/src/main/java/org/dromara/sms4j/core/package-info.java b/sms4j-core/src/main/java/org/dromara/sms4j/core/package-info.java new file mode 100644 index 00000000..a3d93bd9 --- /dev/null +++ b/sms4j-core/src/main/java/org/dromara/sms4j/core/package-info.java @@ -0,0 +1,5 @@ +/** + * 核心模块 + * @author :Wind +*/ +package org.dromara.sms4j.core; \ No newline at end of file diff --git a/sms4j-provider/pom.xml b/sms4j-provider/pom.xml index 1925867a..a6b7f969 100644 --- a/sms4j-provider/pom.xml +++ b/sms4j-provider/pom.xml @@ -20,12 +20,6 @@ sms4j-api - - - com.apistd.uni - uni-sdk - - com.jdcloud.sdk 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 6a59bc6f..4a8d9fa2 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 @@ -17,6 +17,7 @@ import org.dromara.sms4j.comm.factory.BeanFactory; import java.util.LinkedHashMap; import java.util.List; import java.util.TimerTask; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; /** @@ -111,10 +112,8 @@ public class AlibabaSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String message, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, message); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override @@ -128,10 +127,8 @@ public class AlibabaSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, templateId, messages); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone,templateId, messages), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/service/CloopenSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/service/CloopenSmsImpl.java index 85e9190e..29c45ee7 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/service/CloopenSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/cloopen/service/CloopenSmsImpl.java @@ -14,6 +14,7 @@ import org.dromara.sms4j.comm.annotation.Restricted; import org.dromara.sms4j.comm.delayedTime.DelayedTime; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; /** @@ -75,10 +76,8 @@ public class CloopenSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String message, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, message); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override @@ -90,10 +89,8 @@ public class CloopenSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, templateId, messages); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone,templateId, messages), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/emay/service/EmaySmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/emay/service/EmaySmsImpl.java index 920d4a73..4c96c7e0 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/emay/service/EmaySmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/emay/service/EmaySmsImpl.java @@ -14,6 +14,7 @@ import org.dromara.sms4j.comm.exception.SmsBlendException; import org.dromara.sms4j.comm.factory.BeanFactory; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicReference; @@ -89,10 +90,8 @@ public class EmaySmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String message, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, message); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override @@ -104,10 +103,8 @@ public class EmaySmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, templateId, messages); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, templateId, messages), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override 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 61db2caa..971f98c9 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 @@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.api.SmsBlend; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import static org.dromara.sms4j.huawei.utils.HuaweiBuilder.listToString; @@ -94,10 +95,8 @@ public class HuaweiSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String message, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, message); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override @@ -109,10 +108,8 @@ public class HuaweiSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, templateId, messages); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, templateId, messages), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override 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 a1bdcee8..5a7c94e0 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 @@ -17,6 +17,7 @@ import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.TimerTask; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.stream.Collectors; @@ -87,10 +88,8 @@ public class JdCloudSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String message, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, message); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override @@ -102,10 +101,8 @@ public class JdCloudSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, templateId, messages); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, templateId, messages), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/package-info.java b/sms4j-provider/src/main/java/org/dromara/sms4j/package-info.java new file mode 100644 index 00000000..7fc67876 --- /dev/null +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/package-info.java @@ -0,0 +1,5 @@ +/** + * 厂商模块 + * @author :Wind +*/ +package org.dromara.sms4j; \ No newline at end of file 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 6637a712..3caeeafd 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 @@ -16,6 +16,7 @@ import org.dromara.sms4j.tencent.config.TencentConfig; import org.dromara.sms4j.tencent.utils.TencentUtils; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; @Slf4j @@ -119,10 +120,8 @@ public class TencentSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String message, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, message); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override @@ -136,10 +135,8 @@ public class TencentSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, templateId, messages); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, templateId, messages), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/utils/TencentUtils.java b/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/utils/TencentUtils.java index 9742a5e4..dd24a0ec 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/utils/TencentUtils.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/tencent/utils/TencentUtils.java @@ -6,7 +6,7 @@ import org.dromara.sms4j.tencent.config.TencentConfig; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; -import javax.xml.bind.DatatypeConverter; +//import javax.xml.bind.DatatypeConverter; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.text.SimpleDateFormat; @@ -44,7 +44,8 @@ public class TencentUtils { private static String sha256Hex(String s) throws Exception { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] d = md.digest(s.getBytes(StandardCharsets.UTF_8)); - return DatatypeConverter.printHexBinary(d).toLowerCase(); +// return DatatypeConverter.printHexBinary(d).toLowerCase(); + return ""; } /** @@ -85,10 +86,10 @@ public class TencentUtils { byte[] secretDate = hmac256(("TC3" + tencentConfig.getAccessKeySecret()).getBytes(StandardCharsets.UTF_8), date); byte[] secretService = hmac256(secretDate, tencentConfig.getService()); byte[] secretSigning = hmac256(secretService, "tc3_request"); - String signature = DatatypeConverter.printHexBinary(hmac256(secretSigning, stringToSign)).toLowerCase(); +// String signature = DatatypeConverter.printHexBinary(hmac256(secretSigning, stringToSign)).toLowerCase(); // ************* 步骤 4:拼接 Authorization ************* - return ALGORITHM + " " + "Credential=" + tencentConfig.getAccessKeyId() + "/" + credentialScope + ", " - + "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature; + return ALGORITHM + " " + "Credential=" + tencentConfig.getAccessKeyId() + "/" + credentialScope + ", "; +// + "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature; } /** diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/config/UniSmsConfig.java b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/config/UniSmsConfig.java index c8cb9661..977605e3 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/config/UniSmsConfig.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/config/UniSmsConfig.java @@ -1,7 +1,7 @@ package org.dromara.sms4j.unisms.config; -import com.apistd.uni.Uni; import org.dromara.sms4j.comm.factory.BeanFactory; +import org.dromara.sms4j.unisms.core.Uni; import org.dromara.sms4j.unisms.service.UniSmsImpl; /** diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/core/Uni.java b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/core/Uni.java new file mode 100644 index 00000000..e6491d99 --- /dev/null +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/core/Uni.java @@ -0,0 +1,93 @@ +package org.dromara.sms4j.unisms.core; + + +/** + * 初始化统一环境的单例类. + */ +public class Uni { + /** 模仿SDK版本*/ + public static final String VERSION = "0.0.4"; + + public static String signingAlgorithm = "hmac-sha256"; + public static String endpoint = System.getenv().getOrDefault("UNI_ENDPOINT", "https://uni.apistd.com"); + public static String accessKeyId = System.getenv("UNI_ACCESS_KEY_ID"); + + private static String accessKeySecret = System.getenv("UNI_ACCESS_KEY_SECRET"); + private static volatile UniClient client; + + private Uni() { + } + + /** + * 初始化Uni环境(简单验证模式). + * + * @param accessKeyId access key ID + * @author :Wind + */ + public static void init(final String accessKeyId) { + Uni.setAccessKeyId(accessKeyId); + } + + /** + * 初始化Uni环境(HMAC验证模式). + * + * @param accessKeyId access key ID + * @param accessKeySecret access key secret + * @author :Wind + */ + public static void init(final String accessKeyId, final String accessKeySecret) { + Uni.setAccessKeyId(accessKeyId); + Uni.setAccessKeySecret(accessKeySecret); + } + + + public static void setAccessKeyId(final String accessKeyId) { + Uni.accessKeyId = accessKeyId; + } + + + public static void setAccessKeySecret(final String accessKeySecret) { + Uni.accessKeySecret = accessKeySecret; + } + + + public static void setEndpoint(final String endpoint) { + Uni.endpoint = endpoint; + } + + /** + * 返回(如果未初始化则初始化)统一客户端. + * + * @return the Uni Client + * @author :Wind + */ + public static UniClient getClient() { + if (Uni.client == null) { + synchronized (Uni.class) { + if (Uni.client == null) { + Uni.client = buildClient(); + } + } + } + return Uni.client; + } + + public static void setClient(final UniClient client) { + synchronized (Uni.class) { + Uni.client = client; + } + } + + private static UniClient buildClient() { + UniClient.Builder builder = new UniClient.Builder(Uni.accessKeyId); + + if (Uni.accessKeySecret != null) { + builder.accessKeySecret(Uni.accessKeySecret); + } + + builder.endpoint(Uni.endpoint); + builder.signingAlgorithm(Uni.signingAlgorithm); + + return builder.build(); + } +} diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/core/UniClient.java b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/core/UniClient.java new file mode 100644 index 00000000..7306ea7a --- /dev/null +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/core/UniClient.java @@ -0,0 +1,152 @@ +package org.dromara.sms4j.unisms.core; + +import com.alibaba.fastjson.JSONObject; +import com.dtflys.forest.config.ForestConfiguration; +import org.dromara.sms4j.comm.exception.SmsBlendException; +import org.dromara.sms4j.comm.factory.BeanFactory; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.util.Base64; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.TreeMap; +import java.util.UUID; + +public class UniClient { + + public static final String USER_AGENT = "uni-java-sdk" + "/" + Uni.VERSION; + private final ForestConfiguration http = BeanFactory.getForestConfiguration(); + + private final String accessKeyId; + private final String accessKeySecret; + private final String endpoint; + private final String signingAlgorithm; + + protected UniClient(Builder b) { + this.accessKeyId = b.accessKeyId; + this.accessKeySecret = b.accessKeySecret; + this.endpoint = b.endpoint; + this.signingAlgorithm = b.signingAlgorithm; + } + + private static String getSignature(final String message, final String secretKey) { + try { + Mac hmac = Mac.getInstance("HmacSHA256"); + SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256"); + hmac.init(secretKeySpec); + + byte[] bytes = hmac.doFinal(message.getBytes()); + return Base64.getEncoder().encodeToString(bytes); + } catch (Exception e) { + return null; + } + } + + private static String queryStringify(final Map params) { + Map sortedMap = new TreeMap<>(new MapKeyComparator()); + sortedMap.putAll(params); + StringBuilder sb = new StringBuilder(); + Iterator iter = sortedMap.entrySet().iterator(); + + while (iter.hasNext()) { + if (sb.length() > 0) { + sb.append('&'); + } + Entry entry = (Entry) iter.next(); + sb.append(entry.getKey()).append("=").append(entry.getValue()); + } + + return sb.toString(); + } + + private Map sign(final Map query) { + if (this.accessKeySecret != null) { + query.put("algorithm", this.signingAlgorithm); + query.put("timestamp", new Date().getTime()); + query.put("nonce", UUID.randomUUID().toString().replaceAll("-", "")); + + String strToSign = UniClient.queryStringify(query); + query.put("signature", UniClient.getSignature(strToSign, this.accessKeySecret)); + } + return query; + } + + /** + * request + *

向 uni-sms发送请求 + * @param action 接口名称 + * @author :Wind + */ + public UniResponse request(final String action, final Map data) throws SmsBlendException { + Map query = new HashMap(); + query.put("action", action); + query.put("accessKeyId", this.accessKeyId); + + Map headers = new HashMap<>(); + headers.put("User-Agent", USER_AGENT); + headers.put("Content-Type", "application/json;charset=utf-8"); + headers.put("Accept", "application/json"); + return new UniResponse( + JSONObject.parseObject( + http.post(this.endpoint) + .addHeader(headers) + .addQuery(this.sign(query)) + .addBody(JSONObject.toJSONString(data)) + .successWhen(((req, res) -> { + return res.noException() && // 请求过程没有异常 + res.statusIsNot(500); // 不能是 500 + })) + .onError((ex, req, res) -> { + throw new SmsBlendException(ex.getMessage()); + }) + .executeAsString() + )); + } + + public static class Builder { + private String accessKeyId; + private String accessKeySecret; + private String endpoint; + private String signingAlgorithm; + + public Builder(final String accessKeyId) { + this.accessKeyId = accessKeyId; + } + + public Builder(final String accessKeyId, final String accessKeySecret) { + this.accessKeyId = accessKeyId; + this.accessKeySecret = accessKeySecret; + } + + public Builder accessKeySecret(final String accessKeySecret) { + this.accessKeySecret = accessKeySecret; + return this; + } + + public Builder endpoint(final String endpoint) { + this.endpoint = endpoint; + return this; + } + + public Builder signingAlgorithm(final String signingAlgorithm) { + this.signingAlgorithm = signingAlgorithm; + return this; + } + + public UniClient build() { + return new UniClient(this); + } + } +} + +class MapKeyComparator implements Comparator { + @Override + public int compare(String str1, String str2) { + return str1.compareTo(str2); + } +} diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/core/UniResponse.java b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/core/UniResponse.java new file mode 100644 index 00000000..6ea1bba8 --- /dev/null +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/core/UniResponse.java @@ -0,0 +1,53 @@ +package org.dromara.sms4j.unisms.core; + +import com.alibaba.fastjson.JSONObject; +import org.dromara.sms4j.comm.exception.SmsBlendException; + + +public class UniResponse { + public static final String REQUEST_ID_HEADER_KEY = "x-uni-request-id"; + public String requestId; + public String code; + public String message; + public String status; + public JSONObject data = null; + public Object raw; + + /** + * Create a new Uni Response. + * + * @param response raw HTTP response + */ + public UniResponse(final JSONObject response) throws SmsBlendException { + JSONObject body = response.getJSONObject("data"); + this.status = body.getJSONArray("messages").getJSONObject(0).getString("status"); + this.requestId = body.getJSONArray("messages").getJSONObject(0).getString("id"); + this.raw = body; + + if (this.status != "400") { + String code = response.getString("code"); + String message = body.getJSONArray("messages").getString(0); + if (!"0".equals(code)) { + throw new SmsBlendException(message, code, this.requestId); + } + this.code = code; + this.message = message; + this.data = body; + } + else { + throw new SmsBlendException(response.getString("message"), "-1"); + } + } + + @Override + public String toString() { + return "UniResponse{" + + "requestId='" + requestId + '\'' + + ", code='" + code + '\'' + + ", message='" + message + '\'' + + ", status='" + status + '\'' + + ", data=" + data + + ", raw=" + raw + + '}'; + } +} diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/service/UniSmsImpl.java b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/service/UniSmsImpl.java index 0a0efcbf..b17f4b2e 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/service/UniSmsImpl.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/unisms/service/UniSmsImpl.java @@ -1,8 +1,5 @@ package org.dromara.sms4j.unisms.service; -import com.apistd.uni.UniResponse; -import com.apistd.uni.sms.UniMessage; -import com.apistd.uni.sms.UniSMS; import org.dromara.sms4j.api.SmsBlend; import org.dromara.sms4j.api.callback.CallBack; import org.dromara.sms4j.api.entity.SmsResponse; @@ -11,11 +8,19 @@ import org.dromara.sms4j.comm.delayedTime.DelayedTime; import org.dromara.sms4j.comm.exception.SmsBlendException; import org.dromara.sms4j.unisms.config.UniConfig; import lombok.extern.slf4j.Slf4j; +import org.dromara.sms4j.unisms.core.Uni; +import org.dromara.sms4j.unisms.core.UniResponse; +import java.util.Collections; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.TimerTask; +import java.util.concurrent.Callable; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; +import java.util.function.Supplier; /** @@ -52,10 +57,12 @@ public class UniSmsImpl implements SmsBlend { @Override @Restricted public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap messages) { - UniMessage uniMes = UniSMS.buildMessage().setSignature(config.getSignature()).setTo(phone) - .setTemplateId(templateId) - .setTemplateData(messages); - return getSmsResponse(uniMes); + Map data = new HashMap<>(); + data.put("to", Collections.singletonList(phone)); + data.put("signature", config.getSignature()); + data.put("templateId", templateId); + data.put("templateData", messages); + return getSmsResponse(data); } @Override @@ -75,20 +82,19 @@ public class UniSmsImpl implements SmsBlend { if (phones.size()>1000){ throw new SmsBlendException("单次发送超过最大发送上限,建议每次群发短信人数低于1000"); } - String[] s = new String[phones.size()]; - UniMessage uniMes = UniSMS.buildMessage().setSignature(config.getSignature()).setTo(phones.toArray(s)) - .setTemplateId(templateId) - .setTemplateData(messages); - return getSmsResponse(uniMes); + Map data = new HashMap<>(); + data.put("to", phones); + data.put("signature", config.getSignature()); + data.put("templateId", templateId); + data.put("templateData", messages); + return getSmsResponse(data); } @Override @Restricted public void sendMessageAsync(String phone, String message, CallBack callBack) { - pool.execute(()->{ - SmsResponse smsResponse = sendMessage(phone, message); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override @@ -101,10 +107,8 @@ public class UniSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) { - pool.execute(()->{ - SmsResponse smsResponse = sendMessage(phone,templateId,messages); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, templateId, messages), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override @@ -156,10 +160,10 @@ public class UniSmsImpl implements SmsBlend { },delayedTime); } - private SmsResponse getSmsResponse(UniMessage uniMes) { + private SmsResponse getSmsResponse( Map data) { SmsResponse smsResponse = new SmsResponse(); try { - UniResponse send = uniMes.send(); + UniResponse send = Uni.getClient().request("sms.message.send", data); smsResponse.setCode(String.valueOf(send.status)); smsResponse.setErrorCode(send.code); smsResponse.setMessage(send.message); 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 9bcf24c8..77aba422 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 @@ -12,6 +12,7 @@ import org.dromara.sms4j.comm.exception.SmsBlendException; import org.dromara.sms4j.yunpian.config.YunpianConfig; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicReference; @@ -74,10 +75,8 @@ public class YunPianSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String message, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, message); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override @@ -89,10 +88,8 @@ public class YunPianSmsImpl implements SmsBlend { @Override @Restricted public void sendMessageAsync(String phone, String templateId, LinkedHashMap messages, CallBack callBack) { - pool.execute(() -> { - SmsResponse smsResponse = sendMessage(phone, templateId, messages); - callBack.callBack(smsResponse); - }); + CompletableFuture smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, templateId, messages), pool); + smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack); } @Override diff --git a/sms4j-spring-boot-starter/pom.xml b/sms4j-spring-boot-starter/pom.xml index 4dd606a1..678778fe 100644 --- a/sms4j-spring-boot-starter/pom.xml +++ b/sms4j-spring-boot-starter/pom.xml @@ -33,5 +33,11 @@ org.springframework.boot spring-boot-starter + + + org.springframework.boot + spring-boot-starter-test + test +