mirror of
https://gitee.com/dromara/sms4j.git
synced 2025-12-06 17:08:40 +08:00
Merge branch 'dev-2.x'
# Conflicts: # sms4j-aliyun/.flattened-pom.xml # sms4j-api/.flattened-pom.xml # sms4j-autoimmit/.flattened-pom.xml # sms4j-cloopen/.flattened-pom.xml # sms4j-core/.flattened-pom.xml # sms4j-emay/.flattened-pom.xml # sms4j-huawei/.flattened-pom.xml # sms4j-jdcloud/.flattened-pom.xml # sms4j-spring-boot-starter/.flattened-pom.xml # sms4j-tencent/.flattened-pom.xml # sms4j-unisms/.flattened-pom.xml # sms4j-yunpian/.flattened-pom.xml
This commit is contained in:
commit
7e96649b41
@ -1,309 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
<packaging>pom</packaging>
|
|
||||||
<name>sms4j</name>
|
|
||||||
<description>sms_aggregation</description>
|
|
||||||
<url>https://gitee.com/dromara/sms_aggregation</url>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<developers>
|
|
||||||
<developer>
|
|
||||||
<name>wind</name>
|
|
||||||
<email>wzsf1810@qq.com</email>
|
|
||||||
</developer>
|
|
||||||
</developers>
|
|
||||||
<modules>
|
|
||||||
<module>sms4j-comm</module>
|
|
||||||
<module>sms4j-api</module>
|
|
||||||
<module>sms4j-core</module>
|
|
||||||
<module>sms4j-autoimmit</module>
|
|
||||||
<module>sms4j-spring-boot-starter</module>
|
|
||||||
<module>sms4j-aliyun</module>
|
|
||||||
<module>sms4j-tencent</module>
|
|
||||||
<module>sms4j-unisms</module>
|
|
||||||
<module>sms4j-yunpian</module>
|
|
||||||
<module>sms4j-huawei</module>
|
|
||||||
<module>sms4j-jdcloud</module>
|
|
||||||
<module>sms4j-cloopen</module>
|
|
||||||
<module>sms4j-emay</module>
|
|
||||||
</modules>
|
|
||||||
<scm>
|
|
||||||
<connection>scm:git:https://gitee.com/MR-wind/sms_aggregation.git</connection>
|
|
||||||
<developerConnection>scm:git:https://gitee.com/MR-wind/sms_aggregation.git</developerConnection>
|
|
||||||
<tag>master</tag>
|
|
||||||
<url>https://gitee.com/MR-wind/sms_aggregation.git</url>
|
|
||||||
</scm>
|
|
||||||
<distributionManagement>
|
|
||||||
<repository>
|
|
||||||
<id>ossrh</id>
|
|
||||||
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
|
|
||||||
</repository>
|
|
||||||
<snapshotRepository>
|
|
||||||
<id>ossrh</id>
|
|
||||||
<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
|
|
||||||
</snapshotRepository>
|
|
||||||
</distributionManagement>
|
|
||||||
<properties>
|
|
||||||
<json.version>2.0.15</json.version>
|
|
||||||
<hutool.version>5.8.16</hutool.version>
|
|
||||||
<okhttp.version>3.14.9</okhttp.version>
|
|
||||||
<tencent.version>3.1.622</tencent.version>
|
|
||||||
<revision>2.0.1</revision>
|
|
||||||
<unisms.version>0.0.4</unisms.version>
|
|
||||||
<spring.boot.version>2.7.10</spring.boot.version>
|
|
||||||
<forest.version>1.5.30</forest.version>
|
|
||||||
<jdcloud.version>1.3.3</jdcloud.version>
|
|
||||||
<aliyun.version>2.0.23</aliyun.version>
|
|
||||||
</properties>
|
|
||||||
<dependencyManagement>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-dependencies</artifactId>
|
|
||||||
<version>${spring.boot.version}</version>
|
|
||||||
<type>pom</type>
|
|
||||||
<scope>import</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter</artifactId>
|
|
||||||
<version>${spring.boot.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-spring-boot-starter</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-autoimmit</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-core</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-aliyun</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-tencent</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-unisms</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-yunpian</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-huawei</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-jdcloud</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-cloopen</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-emay</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.aliyun</groupId>
|
|
||||||
<artifactId>dysmsapi20170525</artifactId>
|
|
||||||
<version>${aliyun.version}</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.alibaba</groupId>
|
|
||||||
<artifactId>fastjson</artifactId>
|
|
||||||
<version>${json.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.dtflys.forest</groupId>
|
|
||||||
<artifactId>forest-core</artifactId>
|
|
||||||
<version>${forest.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-aop</artifactId>
|
|
||||||
<version>${spring.boot.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
|
||||||
<version>${spring.boot.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.apistd.uni</groupId>
|
|
||||||
<artifactId>uni-sdk</artifactId>
|
|
||||||
<version>${unisms.version}</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.tencentcloudapi</groupId>
|
|
||||||
<artifactId>tencentcloud-sdk-java</artifactId>
|
|
||||||
<version>${tencent.version}</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.jdcloud.sdk</groupId>
|
|
||||||
<artifactId>sms</artifactId>
|
|
||||||
<version>${jdcloud.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
<version>${okhttp.version}</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</dependencyManagement>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>cn.hutool</groupId>
|
|
||||||
<artifactId>hutool-all</artifactId>
|
|
||||||
<version>${hutool.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.projectlombok</groupId>
|
|
||||||
<artifactId>lombok</artifactId>
|
|
||||||
<optional>true</optional>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-source-plugin</artifactId>
|
|
||||||
<version>2.2.1</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>jar-no-fork</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-javadoc-plugin</artifactId>
|
|
||||||
<version>2.9.1</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>jar</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
<configuration>
|
|
||||||
<show>private</show>
|
|
||||||
<nohelp>true</nohelp>
|
|
||||||
<charset>UTF-8</charset>
|
|
||||||
<encoding>UTF-8</encoding>
|
|
||||||
<docencoding>UTF-8</docencoding>
|
|
||||||
<additionalparam>-Xdoclint:none</additionalparam>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
|
||||||
<version>3.0</version>
|
|
||||||
<configuration>
|
|
||||||
<source>1.8</source>
|
|
||||||
<target>1.8</target>
|
|
||||||
<fork>true</fork>
|
|
||||||
<verbose>true</verbose>
|
|
||||||
<encoding>UTF-8</encoding>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-jar-plugin</artifactId>
|
|
||||||
<version>3.2.2</version>
|
|
||||||
<configuration>
|
|
||||||
<archive>
|
|
||||||
<manifest>
|
|
||||||
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
|
|
||||||
</manifest>
|
|
||||||
</archive>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
|
||||||
<artifactId>flatten-maven-plugin</artifactId>
|
|
||||||
<version>1.2.7</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>flatten</id>
|
|
||||||
<phase>process-resources</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>flatten</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>flatten.clean</id>
|
|
||||||
<phase>clean</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>clean</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
<configuration>
|
|
||||||
<updatePomFile>true</updatePomFile>
|
|
||||||
<flattenMode>resolveCiFriendliesOnly</flattenMode>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
</project>
|
|
||||||
8
.gitignore
vendored
8
.gitignore
vendored
@ -30,7 +30,11 @@ target/
|
|||||||
build/
|
build/
|
||||||
!**/src/main/**/build/
|
!**/src/main/**/build/
|
||||||
!**/src/test/**/build/
|
!**/src/test/**/build/
|
||||||
.flattened-pom.xml
|
|
||||||
**/.flattened-pom.xml
|
|
||||||
### VS Code ###
|
### VS Code ###
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
|
### Temp
|
||||||
|
.flattened-pom.xml
|
||||||
|
**/.flattened-pom.xml
|
||||||
|
/.fastRequest/**
|
||||||
|
|||||||
14
README.md
14
README.md
@ -1,9 +1,9 @@
|
|||||||
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">sms4j v2.0.1</h1>
|
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">sms4j v2.0.2</h1>
|
||||||
<h4 align="center" style="margin: 30px 0 30px; font-weight: bold;">sms4j -- 让发送短信变的更简单</h4>
|
<h4 align="center" style="margin: 30px 0 30px; font-weight: bold;">sms4j -- 让发送短信变的更简单</h4>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://gitee.com/the-wind-is-like-a-song/sms_aggregation/stargazers"><img src="https://gitee.com/the-wind-is-like-a-song/sms_aggregation/badge/star.svg?theme=gvp"></a>
|
<a href="https://gitee.com/dromara/sms4j/stargazers"><img src="https://gitee.com/dromara/sms4j/badge/star.svg?theme=gvp"></a>
|
||||||
<a href="https://gitee.com/the-wind-is-like-a-song/sms_aggregation/master/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-green"></a>
|
<a href="https://gitee.com/dromara/sms4j/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-green"></a>
|
||||||
<a href="https://gitee.com/the-wind-is-like-a-song/sms_aggregation"><img src="https://img.shields.io/badge/version-v2.0.1-blue"></a>
|
<a href="https://gitee.com/dromara/sms4j"><img src="https://img.shields.io/badge/version-v2.0.2-blue"></a>
|
||||||
</p>
|
</p>
|
||||||
<img src="/public/logo.png">
|
<img src="/public/logo.png">
|
||||||
|
|
||||||
@ -15,7 +15,7 @@
|
|||||||
这个工具的目的就是为了统一下各个厂商的短信发送工具的标准,甚至于更换短信厂商只需要更改yml配置文件即可。
|
这个工具的目的就是为了统一下各个厂商的短信发送工具的标准,甚至于更换短信厂商只需要更改yml配置文件即可。
|
||||||
如果我们的项目对你产生了帮助,或者你觉得还算值得鼓励,请用你发财的小手帮助点上一个start
|
如果我们的项目对你产生了帮助,或者你觉得还算值得鼓励,请用你发财的小手帮助点上一个start
|
||||||
[gitee](https://gitee.com/dromara/sms4j)
|
[gitee](https://gitee.com/dromara/sms4j)
|
||||||
[github](https://github.com/dromara/sms_aggregation)
|
[github](https://github.com/dromara/sms4j)
|
||||||
|
|
||||||
#### [官方文档](http://wind.kim)
|
#### [官方文档](http://wind.kim)
|
||||||
#### [JavaDoc文档](https://apidoc.gitee.com/dromara/sms4j/)
|
#### [JavaDoc文档](https://apidoc.gitee.com/dromara/sms4j/)
|
||||||
@ -39,7 +39,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
<groupId>org.dromara.sms4j</groupId>
|
||||||
<artifactId>sms4j-spring-boot-starter</artifactId>
|
<artifactId>sms4j-spring-boot-starter</artifactId>
|
||||||
<version> version </version>
|
<version>最新版本</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
2. 设置配置文件
|
2. 设置配置文件
|
||||||
@ -125,7 +125,7 @@ sms:
|
|||||||
1. Fork 本仓库
|
1. Fork 本仓库
|
||||||
2. 新建 Feat_xxx 分支
|
2. 新建 Feat_xxx 分支
|
||||||
3. 提交代码
|
3. 提交代码
|
||||||
4. 新建 Pull Request 到 dev-test分支
|
4. 新建 Pull Request 到 dev-2.x 分支
|
||||||
```
|
```
|
||||||
## 贡献原则
|
## 贡献原则
|
||||||
- 我们原则上欢迎任何人为sms4j添加加瓦贡献代码
|
- 我们原则上欢迎任何人为sms4j添加加瓦贡献代码
|
||||||
|
|||||||
@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
"hash": "2b79d460",
|
|
||||||
"browserHash": "bbb5b341",
|
|
||||||
"optimized": {
|
|
||||||
"@vueuse/core": {
|
|
||||||
"src": "../../../../node_modules/@vueuse/core/index.mjs",
|
|
||||||
"file": "@vueuse_core.js",
|
|
||||||
"fileHash": "49add9e9",
|
|
||||||
"needsInterop": false
|
|
||||||
},
|
|
||||||
"@vuepress/shared": {
|
|
||||||
"src": "../../../../node_modules/@vuepress/shared/dist/index.js",
|
|
||||||
"file": "@vuepress_shared.js",
|
|
||||||
"fileHash": "30dbdfc5",
|
|
||||||
"needsInterop": false
|
|
||||||
},
|
|
||||||
"vue": {
|
|
||||||
"src": "../../../../node_modules/vue/dist/vue.runtime.esm-bundler.js",
|
|
||||||
"file": "vue.js",
|
|
||||||
"fileHash": "0859a21c",
|
|
||||||
"needsInterop": false
|
|
||||||
},
|
|
||||||
"vue-router": {
|
|
||||||
"src": "../../../../node_modules/vue-router/dist/vue-router.esm-bundler.js",
|
|
||||||
"file": "vue-router.js",
|
|
||||||
"fileHash": "3d5d324e",
|
|
||||||
"needsInterop": false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"chunks": {
|
|
||||||
"chunk-AWA6B2ZS": {
|
|
||||||
"file": "chunk-AWA6B2ZS.js"
|
|
||||||
},
|
|
||||||
"chunk-JXWQMH7G": {
|
|
||||||
"file": "chunk-JXWQMH7G.js"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
168
pom.xml
168
pom.xml
@ -5,28 +5,22 @@
|
|||||||
<groupId>org.dromara.sms4j</groupId>
|
<groupId>org.dromara.sms4j</groupId>
|
||||||
<artifactId>sms4j</artifactId>
|
<artifactId>sms4j</artifactId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
<name>sms4j</name>
|
<name>sms4j</name>
|
||||||
<packaging>pom</packaging>
|
<description>让发送短信变的更简单</description>
|
||||||
<description>sms_aggregation</description>
|
<url>https://gitee.com/dromara/sms4j</url>
|
||||||
<url>https://gitee.com/dromara/sms_aggregation</url>
|
|
||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
<module>sms4j-comm</module>
|
<module>sms4j-comm</module>
|
||||||
<module>sms4j-api</module>
|
<module>sms4j-api</module>
|
||||||
|
<module>sms4j-provider</module>
|
||||||
<module>sms4j-core</module>
|
<module>sms4j-core</module>
|
||||||
<module>sms4j-autoimmit</module>
|
<module>sms4j-autoimmit</module>
|
||||||
<module>sms4j-spring-boot-starter</module>
|
<module>sms4j-spring-boot-starter</module>
|
||||||
<module>sms4j-aliyun</module>
|
|
||||||
<module>sms4j-tencent</module>
|
|
||||||
<module>sms4j-unisms</module>
|
|
||||||
<module>sms4j-yunpian</module>
|
|
||||||
<module>sms4j-huawei</module>
|
|
||||||
<module>sms4j-jdcloud</module>
|
|
||||||
<module>sms4j-cloopen</module>
|
|
||||||
<module>sms4j-emay</module>
|
|
||||||
</modules>
|
</modules>
|
||||||
<!-- 开源协议 apache 2.0 -->
|
|
||||||
|
<!-- 开源协议 Apache 2.0 -->
|
||||||
<licenses>
|
<licenses>
|
||||||
<license>
|
<license>
|
||||||
<name>Apache 2</name>
|
<name>Apache 2</name>
|
||||||
@ -47,15 +41,14 @@
|
|||||||
<!-- 仓库信息 -->
|
<!-- 仓库信息 -->
|
||||||
<scm>
|
<scm>
|
||||||
<tag>master</tag>
|
<tag>master</tag>
|
||||||
<url>https://gitee.com/MR-wind/sms_aggregation.git</url>
|
<url>https://gitee.com/dromara/sms4j.git</url>
|
||||||
<connection>scm:git:https://gitee.com/MR-wind/sms_aggregation.git</connection>
|
<connection>scm:git:https://gitee.com/dromara/sms4j.git</connection>
|
||||||
<developerConnection>scm:git:https://gitee.com/MR-wind/sms_aggregation.git</developerConnection>
|
<developerConnection>scm:git:https://gitee.com/dromara/sms4j.git</developerConnection>
|
||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
<spring.boot.version>2.7.11</spring.boot.version>
|
||||||
<spring.boot.version>2.7.10</spring.boot.version>
|
<revision>2.0.2</revision>
|
||||||
<revision>2.0.1</revision>
|
|
||||||
<aliyun.version>2.0.23</aliyun.version>
|
<aliyun.version>2.0.23</aliyun.version>
|
||||||
<tencent.version>3.1.622</tencent.version>
|
<tencent.version>3.1.622</tencent.version>
|
||||||
<unisms.version>0.0.4</unisms.version>
|
<unisms.version>0.0.4</unisms.version>
|
||||||
@ -65,6 +58,8 @@
|
|||||||
<forest.version>1.5.30</forest.version>
|
<forest.version>1.5.30</forest.version>
|
||||||
<hutool.version>5.8.16</hutool.version>
|
<hutool.version>5.8.16</hutool.version>
|
||||||
<okhttp.version>3.14.9</okhttp.version>
|
<okhttp.version>3.14.9</okhttp.version>
|
||||||
|
<xmlblend.version>2.3.0</xmlblend.version>
|
||||||
|
<activation.version>1.1.1</activation.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
@ -96,6 +91,7 @@
|
|||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!--核心模块-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
<groupId>org.dromara.sms4j</groupId>
|
||||||
<artifactId>sms4j-core</artifactId>
|
<artifactId>sms4j-core</artifactId>
|
||||||
@ -116,67 +112,13 @@
|
|||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 短信厂商对接模块(国内短信) -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
<groupId>org.dromara.sms4j</groupId>
|
||||||
<artifactId>sms4j-aliyun</artifactId>
|
<artifactId>sms4j-provider</artifactId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-tencent</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-unisms</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-yunpian</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-huawei</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-jdcloud</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-cloopen</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-emay</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- 阿里云短信依赖-->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.aliyun</groupId>
|
|
||||||
<artifactId>dysmsapi20170525</artifactId>
|
|
||||||
<version>${aliyun.version}</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- 阿里JSON解析器 -->
|
<!-- 阿里JSON解析器 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
@ -206,32 +148,6 @@
|
|||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!--合一短信依赖-->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.apistd.uni</groupId>
|
|
||||||
<artifactId>uni-sdk</artifactId>
|
|
||||||
<version>${unisms.version}</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- 腾讯云短信-->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.tencentcloudapi</groupId>
|
|
||||||
<artifactId>tencentcloud-sdk-java</artifactId>
|
|
||||||
<version>${tencent.version}</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- 京东云短信依赖 -->
|
<!-- 京东云短信依赖 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.jdcloud.sdk</groupId>
|
<groupId>com.jdcloud.sdk</groupId>
|
||||||
@ -239,11 +155,25 @@
|
|||||||
<version>${jdcloud.version}</version>
|
<version>${jdcloud.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- okhttp依赖,防止出现java.lang.NoSuchFieldError: Companion异常-->
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
<groupId>javax.xml.bind</groupId>
|
||||||
<artifactId>okhttp</artifactId>
|
<artifactId>jaxb-api</artifactId>
|
||||||
<version>${okhttp.version}</version>
|
<version>${xmlblend.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.sun.xml.bind</groupId>
|
||||||
|
<artifactId>jaxb-impl</artifactId>
|
||||||
|
<version>${xmlblend.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.sun.xml.bind</groupId>
|
||||||
|
<artifactId>jaxb-core</artifactId>
|
||||||
|
<version>${xmlblend.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.activation</groupId>
|
||||||
|
<artifactId>activation</artifactId>
|
||||||
|
<version>${activation.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
@ -274,7 +204,6 @@
|
|||||||
</repository>
|
</repository>
|
||||||
</distributionManagement>
|
</distributionManagement>
|
||||||
|
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<!-- Source -->
|
<!-- Source -->
|
||||||
@ -314,20 +243,20 @@
|
|||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
<!-- <!– GPG –>-->
|
<!-- <!– GPG –>-->
|
||||||
<!-- <plugin>-->
|
<!-- <plugin>-->
|
||||||
<!-- <groupId>org.apache.maven.plugins</groupId>-->
|
<!-- <groupId>org.apache.maven.plugins</groupId>-->
|
||||||
<!-- <artifactId>maven-gpg-plugin</artifactId>-->
|
<!-- <artifactId>maven-gpg-plugin</artifactId>-->
|
||||||
<!-- <version>1.6</version>-->
|
<!-- <version>1.6</version>-->
|
||||||
<!-- <executions>-->
|
<!-- <executions>-->
|
||||||
<!-- <execution>-->
|
<!-- <execution>-->
|
||||||
<!-- <phase>verify</phase>-->
|
<!-- <phase>verify</phase>-->
|
||||||
<!-- <goals>-->
|
<!-- <goals>-->
|
||||||
<!-- <goal>sign</goal>-->
|
<!-- <goal>sign</goal>-->
|
||||||
<!-- </goals>-->
|
<!-- </goals>-->
|
||||||
<!-- </execution>-->
|
<!-- </execution>-->
|
||||||
<!-- </executions>-->
|
<!-- </executions>-->
|
||||||
<!-- </plugin>-->
|
<!-- </plugin>-->
|
||||||
<!--Compiler -->
|
<!--Compiler -->
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
@ -385,7 +314,6 @@
|
|||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@ -1,48 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-aliyun</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
<name>sms4j-aliyun</name>
|
|
||||||
<description>sms4j-aliyun</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.aliyun</groupId>
|
|
||||||
<artifactId>dysmsapi20170525</artifactId>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
<version>3.14.9</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>sms4j-aliyun</artifactId>
|
|
||||||
<name>sms4j-aliyun</name>
|
|
||||||
<description>sms4j-aliyun</description>
|
|
||||||
<version>${revision}</version>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
<version>3.14.9</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1 +0,0 @@
|
|||||||
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
<name>sms4j-api</name>
|
|
||||||
<description>sms4j-api</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -10,12 +10,9 @@
|
|||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
<artifactId>sms4j-api</artifactId>
|
||||||
|
|
||||||
<name>sms4j-api</name>
|
<name>sms4j-api</name>
|
||||||
<description>sms4j-api</description>
|
<description>sms4j-api</description>
|
||||||
<version>${revision}</version>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -0,0 +1,5 @@
|
|||||||
|
/**
|
||||||
|
* 公共API
|
||||||
|
* @author :Wind
|
||||||
|
*/
|
||||||
|
package org.dromara.sms4j.api;
|
||||||
@ -1,43 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-autoimmit</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
<name>sms4j-autoimmit</name>
|
|
||||||
<description>sms4j-autoimmit</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-aop</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-core</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-configuration-processor</artifactId>
|
|
||||||
<version>${spring.boot.version}</version>
|
|
||||||
<optional>true</optional>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -10,13 +10,10 @@
|
|||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>sms4j-autoimmit</artifactId>
|
<artifactId>sms4j-autoimmit</artifactId>
|
||||||
<version>${revision}</version>
|
|
||||||
<name>sms4j-autoimmit</name>
|
<name>sms4j-autoimmit</name>
|
||||||
<description>sms4j-autoimmit</description>
|
<description>sms4j-autoimmit</description>
|
||||||
|
|
||||||
<properties>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<!--aop依赖-->
|
<!--aop依赖-->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -8,6 +8,8 @@ import org.dromara.sms4j.comm.config.SmsBanner;
|
|||||||
import org.dromara.sms4j.comm.config.SmsConfig;
|
import org.dromara.sms4j.comm.config.SmsConfig;
|
||||||
import org.dromara.sms4j.comm.config.SmsSqlConfig;
|
import org.dromara.sms4j.comm.config.SmsSqlConfig;
|
||||||
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
|
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
|
||||||
|
import org.dromara.sms4j.comm.enumerate.ConfigType;
|
||||||
|
import org.dromara.sms4j.comm.enumerate.SupplierType;
|
||||||
import org.dromara.sms4j.comm.factory.BeanFactory;
|
import org.dromara.sms4j.comm.factory.BeanFactory;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.sms4j.core.SupplierSqlConfig;
|
import org.dromara.sms4j.core.SupplierSqlConfig;
|
||||||
@ -65,8 +67,8 @@ public class SmsAutowiredConfig {
|
|||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
@ConditionalOnProperty(prefix = "sms", name = "config-type", havingValue = "sql_config")
|
@ConditionalOnProperty(prefix = "sms", name = "config-type", havingValue = "sql_config")
|
||||||
protected void supplierSqlConfig(SmsSqlConfig smsSqlConfig){
|
protected SupplierSqlConfig supplierSqlConfig(SmsSqlConfig smsSqlConfig){
|
||||||
SupplierSqlConfig.refreshSqlConfig();
|
return new SupplierSqlConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,5 @@
|
|||||||
|
/**
|
||||||
|
* Spring Boot自动装配配置
|
||||||
|
* @author :Wind
|
||||||
|
*/
|
||||||
|
package org.dromara.sms4j.autoimmit;
|
||||||
@ -1,33 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-cloopen</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
<name>sms4j-cloopen</name>
|
|
||||||
<description>sms4j-cloopen</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>sms4j-cloopen</artifactId>
|
|
||||||
<name>sms4j-cloopen</name>
|
|
||||||
<description>sms4j-cloopen</description>
|
|
||||||
<version>${revision}</version>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1 +0,0 @@
|
|||||||
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
<version>2.0.1</version>
|
|
||||||
<name>sms4j-comm</name>
|
|
||||||
<description>sms4j-comm</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.alibaba</groupId>
|
|
||||||
<artifactId>fastjson</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.dtflys.forest</groupId>
|
|
||||||
<artifactId>forest-core</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -10,15 +10,11 @@
|
|||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
<artifactId>sms4j-comm</artifactId>
|
||||||
|
|
||||||
<name>sms4j-comm</name>
|
<name>sms4j-comm</name>
|
||||||
<description>sms4j-comm</description>
|
<description>sms4j-comm</description>
|
||||||
<version>${revision}</version>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>fastjson</artifactId>
|
<artifactId>fastjson</artifactId>
|
||||||
|
|||||||
@ -2,14 +2,14 @@ package org.dromara.sms4j.comm.config;
|
|||||||
|
|
||||||
public class SmsBanner {
|
public class SmsBanner {
|
||||||
private static final String banner =
|
private static final String banner =
|
||||||
" _____ __ __ _____ _____ _____ _____ ______ _____ _______ _____ ____ _ _ \n" +
|
" ________ _____ ______ ________ ___ ___ ___ \n" +
|
||||||
" / ____| | \\/ | / ____| /\\ / ____| / ____| | __ \\ | ____| / ____| /\\ |__ __| |_ _| / __ \\ | \\ | |\n" +
|
"|\\ ____\\|\\ _ \\ _ \\|\\ ____\\|\\ \\ |\\ \\ |\\ \\ \n" +
|
||||||
" | (___ | \\ / | | (___ / \\ | | __ | | __ | |__) | | |__ | | __ / \\ | | | | | | | | | \\| |\n" +
|
"\\ \\ \\___|\\ \\ \\\\\\__\\ \\ \\ \\ \\___|\\ \\ \\\\_\\ \\ \\ \\ \\ \n" +
|
||||||
" \\___ \\ | |\\/| | \\___ \\ / /\\ \\ | | |_ | | | |_ | | _ / | __| | | |_ | / /\\ \\ | | | | | | | | | . ` |\n" +
|
" \\ \\_____ \\ \\ \\\\|__| \\ \\ \\_____ \\ \\______ \\ __ \\ \\ \\ \n" +
|
||||||
" ____) | | | | | ____) | / ____ \\ | |__| | | |__| | | | \\ \\ | |____ | |__| | / ____ \\ | | _| |_ | |__| | | |\\ |\n" +
|
" \\|____|\\ \\ \\ \\ \\ \\ \\|____|\\ \\|_____|\\ \\|\\ \\\\_\\ \\ \n" +
|
||||||
" |_____/ |_| |_| |_____/ /_/ \\_\\ \\_____| \\_____| |_| \\_\\ |______| \\_____| /_/ \\_\\ |_| |_____| \\____/ |_| \\_|\n" +
|
" ____\\_\\ \\ \\__\\ \\ \\__\\____\\_\\ \\ \\ \\__\\ \\________\\\n" +
|
||||||
" \n" +
|
" |\\_________\\|__| \\|__|\\_________\\ \\|__|\\|________|\n" +
|
||||||
" ";
|
" \\|_________| \\|_________| \n";
|
||||||
/** 初始化配置文件时打印banner*/
|
/** 初始化配置文件时打印banner*/
|
||||||
public static void PrintBanner(String version) {
|
public static void PrintBanner(String version) {
|
||||||
System.out.println(banner+version);
|
System.out.println(banner+version);
|
||||||
|
|||||||
@ -0,0 +1,5 @@
|
|||||||
|
/**
|
||||||
|
* 公共模块
|
||||||
|
* @author :Wind
|
||||||
|
*/
|
||||||
|
package org.dromara.sms4j.comm;
|
||||||
@ -1,58 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-core</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
<name>sms4j-core</name>
|
|
||||||
<description>sms4j-core</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-aliyun</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-tencent</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-unisms</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-yunpian</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-huawei</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-jdcloud</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-emay</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-cloopen</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<build />
|
|
||||||
</project>
|
|
||||||
@ -10,57 +10,14 @@
|
|||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>sms4j-core</artifactId>
|
<artifactId>sms4j-core</artifactId>
|
||||||
<version>${revision}</version>
|
|
||||||
<name>sms4j-core</name>
|
<name>sms4j-core</name>
|
||||||
<description>sms4j-core</description>
|
<description>sms4j-core</description>
|
||||||
|
|
||||||
<properties>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
<groupId>org.dromara.sms4j</groupId>
|
||||||
<artifactId>sms4j-aliyun</artifactId>
|
<artifactId>sms4j-provider</artifactId>
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-tencent</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-unisms</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-yunpian</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-huawei</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-jdcloud</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-emay</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-cloopen</artifactId>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@ -1,16 +1,13 @@
|
|||||||
package org.dromara.sms4j.core.factory;
|
package org.dromara.sms4j.core.factory;
|
||||||
|
|
||||||
import org.dromara.sms4j.comm.config.SmsConfig;
|
|
||||||
import org.dromara.sms4j.comm.enumerate.ConfigType;
|
|
||||||
import org.dromara.sms4j.comm.factory.BeanFactory;
|
|
||||||
import org.dromara.sms4j.core.SupplierSqlConfig;
|
|
||||||
import org.dromara.sms4j.emay.config.EmaySmsConfig;
|
|
||||||
import org.dromara.sms4j.aliyun.config.AlibabaSmsConfig;
|
import org.dromara.sms4j.aliyun.config.AlibabaSmsConfig;
|
||||||
import org.dromara.sms4j.api.SmsBlend;
|
import org.dromara.sms4j.api.SmsBlend;
|
||||||
import org.dromara.sms4j.cloopen.config.CloopenSmsConfig;
|
import org.dromara.sms4j.cloopen.config.CloopenSmsConfig;
|
||||||
import org.dromara.sms4j.comm.enumerate.SupplierType;
|
import org.dromara.sms4j.comm.enumerate.SupplierType;
|
||||||
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||||
|
import org.dromara.sms4j.core.SupplierSqlConfig;
|
||||||
import org.dromara.sms4j.core.config.SupplierFactory;
|
import org.dromara.sms4j.core.config.SupplierFactory;
|
||||||
|
import org.dromara.sms4j.emay.config.EmaySmsConfig;
|
||||||
import org.dromara.sms4j.huawei.config.HuaweiSmsConfig;
|
import org.dromara.sms4j.huawei.config.HuaweiSmsConfig;
|
||||||
import org.dromara.sms4j.jdcloud.config.JdCloudSmsConfig;
|
import org.dromara.sms4j.jdcloud.config.JdCloudSmsConfig;
|
||||||
import org.dromara.sms4j.tencent.config.TencentSmsConfig;
|
import org.dromara.sms4j.tencent.config.TencentSmsConfig;
|
||||||
@ -21,6 +18,7 @@ import org.dromara.sms4j.unisms.config.UniSmsConfig;
|
|||||||
* <p>构造工厂,用于获取一个厂商的短信实现对象
|
* <p>构造工厂,用于获取一个厂商的短信实现对象
|
||||||
* 在调用对应厂商的短信发送方法前,请先确保你的配置已经实现,否则无法发送该厂商对应的短信,一般情况下厂商会回执因缺少的配置所造成的的异常,但不会
|
* 在调用对应厂商的短信发送方法前,请先确保你的配置已经实现,否则无法发送该厂商对应的短信,一般情况下厂商会回执因缺少的配置所造成的的异常,但不会
|
||||||
* 以java异常的形式抛出
|
* 以java异常的形式抛出
|
||||||
|
*
|
||||||
* @author :Wind
|
* @author :Wind
|
||||||
* 2023/4/8 15:55
|
* 2023/4/8 15:55
|
||||||
**/
|
**/
|
||||||
@ -31,6 +29,7 @@ public abstract class SmsFactory {
|
|||||||
/**
|
/**
|
||||||
* createSmsBlend
|
* createSmsBlend
|
||||||
* <p>获取各个厂商的实现类
|
* <p>获取各个厂商的实现类
|
||||||
|
*
|
||||||
* @param supplierType 厂商枚举
|
* @param supplierType 厂商枚举
|
||||||
* @author :Wind
|
* @author :Wind
|
||||||
*/
|
*/
|
||||||
@ -55,12 +54,13 @@ public abstract class SmsFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* refresh
|
* refresh
|
||||||
* <p>刷新配置,用于切换配置后的刷新,防止因厂商sdk内部的保存导致配置更新不及时
|
* <p>刷新配置,用于切换配置后的刷新,防止因厂商sdk内部的保存导致配置更新不及时
|
||||||
* 此方法会造成一定的性能损失,不建议经常性调用
|
* 此方法会造成一定的性能损失,不建议经常性调用
|
||||||
|
*
|
||||||
* @author :Wind
|
* @author :Wind
|
||||||
*/
|
*/
|
||||||
public static void refresh(){
|
public static void refresh() {
|
||||||
AlibabaSmsConfig.refresh(SupplierFactory.getAlibabaConfig());
|
AlibabaSmsConfig.refresh(SupplierFactory.getAlibabaConfig());
|
||||||
HuaweiSmsConfig.refresh(SupplierFactory.getHuaweiConfig());
|
HuaweiSmsConfig.refresh(SupplierFactory.getHuaweiConfig());
|
||||||
UniSmsConfig.refresh(SupplierFactory.getUniConfig());
|
UniSmsConfig.refresh(SupplierFactory.getUniConfig());
|
||||||
@ -71,36 +71,46 @@ public abstract class SmsFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* refresh
|
* refresh
|
||||||
* <p>根据厂商类型枚举刷新对应厂商的配置,此方法不会刷新全部厂商的配置对象,只会重构所选厂商的对象,性能损失相对较小
|
* <p>根据厂商类型枚举刷新对应厂商的配置,此方法不会刷新全部厂商的配置对象,只会重构所选厂商的对象,性能损失相对较小
|
||||||
|
*
|
||||||
* @param supplierType 厂商类型枚举
|
* @param supplierType 厂商类型枚举
|
||||||
* @author :Wind
|
* @author :Wind
|
||||||
*/
|
*/
|
||||||
public static void refresh(SupplierType supplierType){
|
public static void refresh(SupplierType supplierType) {
|
||||||
switch (supplierType) {
|
switch (supplierType) {
|
||||||
case ALIBABA:
|
case ALIBABA:
|
||||||
AlibabaSmsConfig.refresh(SupplierFactory.getAlibabaConfig());
|
AlibabaSmsConfig.refresh(SupplierFactory.getAlibabaConfig());
|
||||||
|
break;
|
||||||
case HUAWEI:
|
case HUAWEI:
|
||||||
HuaweiSmsConfig.refresh(SupplierFactory.getHuaweiConfig());
|
HuaweiSmsConfig.refresh(SupplierFactory.getHuaweiConfig());
|
||||||
|
break;
|
||||||
case UNI_SMS:
|
case UNI_SMS:
|
||||||
UniSmsConfig.refresh(SupplierFactory.getUniConfig());
|
UniSmsConfig.refresh(SupplierFactory.getUniConfig());
|
||||||
|
break;
|
||||||
case TENCENT:
|
case TENCENT:
|
||||||
TencentSmsConfig.refresh(SupplierFactory.getTencentConfig());
|
TencentSmsConfig.refresh(SupplierFactory.getTencentConfig());
|
||||||
|
break;
|
||||||
case JD_CLOUD:
|
case JD_CLOUD:
|
||||||
JdCloudSmsConfig.refresh(SupplierFactory.getJdCloudConfig());
|
JdCloudSmsConfig.refresh(SupplierFactory.getJdCloudConfig());
|
||||||
|
break;
|
||||||
case CLOOPEN:
|
case CLOOPEN:
|
||||||
CloopenSmsConfig.refresh(SupplierFactory.getCloopenConfig());
|
CloopenSmsConfig.refresh(SupplierFactory.getCloopenConfig());
|
||||||
|
break;
|
||||||
case EMAY:
|
case EMAY:
|
||||||
EmaySmsConfig.refresh(SupplierFactory.getEmayConfig());
|
EmaySmsConfig.refresh(SupplierFactory.getEmayConfig());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new SmsBlendException("An attempt to construct a SmsBlend object failed. Please check that the enumeration is valid");
|
||||||
}
|
}
|
||||||
throw new SmsBlendException("An attempt to construct a SmsBlend object failed. Please check that the enumeration is valid");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* refreshSqlConfig
|
* refreshSqlConfig
|
||||||
* <p>重新读取sql配置
|
* <p>重新读取sql配置
|
||||||
|
*
|
||||||
* @author :Wind
|
* @author :Wind
|
||||||
*/
|
*/
|
||||||
public static void refreshSqlConfig() {
|
public static void refreshSqlConfig() {
|
||||||
SupplierSqlConfig.refreshSqlConfig();
|
SupplierSqlConfig.refreshSqlConfig();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,48 @@
|
|||||||
|
package org.dromara.sms4j.core.load;
|
||||||
|
|
||||||
|
import org.dromara.sms4j.api.SmsBlend;
|
||||||
|
|
||||||
|
public class LoadServer {
|
||||||
|
private SmsBlend smsServer;
|
||||||
|
private int weight;
|
||||||
|
private int currentWeight;
|
||||||
|
|
||||||
|
protected LoadServer(SmsBlend smsServer, int weight, int currentWeight) {
|
||||||
|
this.smsServer = smsServer;
|
||||||
|
this.weight = weight;
|
||||||
|
this.currentWeight = currentWeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SmsBlend getSmsServer() {
|
||||||
|
return smsServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getWeight() {
|
||||||
|
return weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getCurrentWeight() {
|
||||||
|
return currentWeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置 smsServer
|
||||||
|
*/
|
||||||
|
protected void setSmsServer(SmsBlend smsServer) {
|
||||||
|
this.smsServer = smsServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置 weight
|
||||||
|
*/
|
||||||
|
protected void setWeight(int weight) {
|
||||||
|
this.weight = weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置 currentWeight
|
||||||
|
*/
|
||||||
|
protected void setCurrentWeight(int currentWeight) {
|
||||||
|
this.currentWeight = currentWeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
package org.dromara.sms4j.core.load;
|
||||||
|
|
||||||
|
import org.dromara.sms4j.api.SmsBlend;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SmsLoad
|
||||||
|
* <p> 自定义的一个平滑加权负载服务,可以用于存放多个短信实现负载
|
||||||
|
* @author :Wind
|
||||||
|
* 2023/4/21 20:49
|
||||||
|
**/
|
||||||
|
public class SmsLoad {
|
||||||
|
// 服务器列表,每个服务器有一个权重和当前权重
|
||||||
|
private static final List<LoadServer> LoadServers = new ArrayList<>();
|
||||||
|
|
||||||
|
private SmsLoad() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* addLoadServer
|
||||||
|
* <p> 添加服务及其权重
|
||||||
|
* <p>添加权重应注意,不要把某个权重设置的与其他权重相差过大,否则容易出现无法负载,单一选择的情况
|
||||||
|
* @param LoadServer 短信实现
|
||||||
|
* @param weight 权重
|
||||||
|
* @author :Wind
|
||||||
|
*/
|
||||||
|
public static void addLoadServer(SmsBlend LoadServer, int weight) {
|
||||||
|
LoadServers.add(new LoadServer(LoadServer, weight, weight));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* removeLoadServer
|
||||||
|
* <p>移除短信服务
|
||||||
|
* @param LoadServer 要移除的服务
|
||||||
|
* @author :Wind
|
||||||
|
*/
|
||||||
|
public static void removeLoadServer(SmsBlend LoadServer) {
|
||||||
|
for (int i = 0; i < LoadServers.size(); i++) {
|
||||||
|
if (LoadServers.get(i).getSmsServer().equals(LoadServer)) {
|
||||||
|
LoadServers.remove(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* getLoadServer
|
||||||
|
* <p>根据负载算法获取一个可获取到的短信服务,这里获取到的服务必然是addLoadServer方法中添加过的服务,不会凭空出现
|
||||||
|
* @return SmsBlend 短信实现
|
||||||
|
* @author :Wind
|
||||||
|
*/
|
||||||
|
public static SmsBlend getLoadServer() {
|
||||||
|
int totalWeight = 0;
|
||||||
|
LoadServer selectedLoadServer = null;
|
||||||
|
// 计算所有服务器的权重总和,并选择当前权重最大的服务器
|
||||||
|
for (LoadServer LoadServer : LoadServers) {
|
||||||
|
totalWeight += LoadServer.getWeight();
|
||||||
|
int currentWeight = LoadServer.getCurrentWeight() + LoadServer.getWeight();
|
||||||
|
LoadServer.setCurrentWeight(currentWeight);
|
||||||
|
if (selectedLoadServer == null || LoadServer.getCurrentWeight() > selectedLoadServer.getCurrentWeight()) {
|
||||||
|
selectedLoadServer = LoadServer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 如果没有服务器,则返回空
|
||||||
|
if (selectedLoadServer == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// 更新选择的服务器的当前权重,并返回其地址
|
||||||
|
int i = selectedLoadServer.getCurrentWeight() - totalWeight;
|
||||||
|
selectedLoadServer.setCurrentWeight(i);
|
||||||
|
return selectedLoadServer.getSmsServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
/**
|
||||||
|
* 核心模块
|
||||||
|
* @author :Wind
|
||||||
|
*/
|
||||||
|
package org.dromara.sms4j.core;
|
||||||
@ -1,33 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-emay</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
<name>sms4j-emay</name>
|
|
||||||
<description>sms4j-emay</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>sms4j-emay</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
<name>sms4j-emay</name>
|
|
||||||
<description>sms4j-emay</description>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1 +0,0 @@
|
|||||||
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-huawei</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
<name>sms4j-huawei</name>
|
|
||||||
<description>sms4j-huawei</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<build />
|
|
||||||
</project>
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>sms4j-huawei</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
<name>sms4j-huawei</name>
|
|
||||||
<description>sms4j-huawei</description>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
</build>
|
|
||||||
</project>
|
|
||||||
@ -1 +0,0 @@
|
|||||||
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-jdcloud</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
<name>sms4j-jdcloud</name>
|
|
||||||
<description>sms4j-jdcloud</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.jdcloud.sdk</groupId>
|
|
||||||
<artifactId>sms</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1 +0,0 @@
|
|||||||
|
|
||||||
@ -7,15 +7,19 @@
|
|||||||
<groupId>org.dromara.sms4j</groupId>
|
<groupId>org.dromara.sms4j</groupId>
|
||||||
<artifactId>sms4j</artifactId>
|
<artifactId>sms4j</artifactId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>sms4j-jdcloud</artifactId>
|
<artifactId>sms4j-provider</artifactId>
|
||||||
<name>sms4j-jdcloud</name>
|
|
||||||
<description>sms4j-jdcloud</description>
|
<name>sms4j-provider</name>
|
||||||
<version>${revision}</version>
|
<description>短信厂商对接模块(国内短信)</description>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.dromara.sms4j</groupId>
|
||||||
|
<artifactId>sms4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- 京东云短信依赖 -->
|
<!-- 京东云短信依赖 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.jdcloud.sdk</groupId>
|
<groupId>com.jdcloud.sdk</groupId>
|
||||||
@ -23,13 +27,23 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
<groupId>javax.xml.bind</groupId>
|
||||||
<artifactId>sms4j-comm</artifactId>
|
<artifactId>jaxb-api</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
<groupId>com.sun.xml.bind</groupId>
|
||||||
<artifactId>sms4j-api</artifactId>
|
<artifactId>jaxb-impl</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.sun.xml.bind</groupId>
|
||||||
|
<artifactId>jaxb-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.activation</groupId>
|
||||||
|
<artifactId>activation</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
@ -1,44 +1,44 @@
|
|||||||
package org.dromara.sms4j.aliyun.config;
|
package org.dromara.sms4j.aliyun.config;
|
||||||
|
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
import lombok.experimental.SuperBuilder;
|
import lombok.experimental.SuperBuilder;
|
||||||
import org.dromara.sms4j.comm.config.BaseConfig;
|
import org.dromara.sms4j.comm.config.BaseConfig;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@SuperBuilder
|
@SuperBuilder
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
public class AlibabaConfig extends BaseConfig {
|
public class AlibabaConfig extends BaseConfig {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 模板变量名称
|
* 模板变量名称
|
||||||
*/
|
*/
|
||||||
private String templateName;
|
private String templateName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请求地址
|
* 请求地址
|
||||||
*/
|
*/
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String requestUrl = "dysmsapi.aliyuncs.com";
|
private String requestUrl = "dysmsapi.aliyuncs.com";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 接口名称
|
* 接口名称
|
||||||
*/
|
*/
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String action = "SendSms";
|
private String action = "SendSms";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 接口版本号
|
* 接口版本号
|
||||||
*/
|
*/
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String version = "2017-05-25";
|
private String version = "2017-05-25";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 地域信息默认为 cn-hangzhou
|
* 地域信息默认为 cn-hangzhou
|
||||||
*/
|
*/
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String regionId = "cn-hangzhou";
|
private String regionId = "cn-hangzhou";
|
||||||
}
|
}
|
||||||
@ -1,62 +1,62 @@
|
|||||||
package org.dromara.sms4j.aliyun.config;
|
package org.dromara.sms4j.aliyun.config;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.sms4j.aliyun.service.AlibabaSmsImpl;
|
import org.dromara.sms4j.aliyun.service.AlibabaSmsImpl;
|
||||||
import org.dromara.sms4j.comm.factory.BeanFactory;
|
import org.dromara.sms4j.comm.factory.BeanFactory;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AlibabaSmsConfig
|
* AlibabaSmsConfig
|
||||||
* <p> 阿里巴巴对象建造者
|
* <p> 阿里巴巴对象建造者
|
||||||
*
|
*
|
||||||
* @author :Wind
|
* @author :Wind
|
||||||
* 2023/4/8 14:54
|
* 2023/4/8 14:54
|
||||||
**/
|
**/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class AlibabaSmsConfig {
|
public class AlibabaSmsConfig {
|
||||||
|
|
||||||
private static AlibabaSmsImpl alibabaSms;
|
private static AlibabaSmsImpl alibabaSms;
|
||||||
|
|
||||||
private static AlibabaSmsConfig alibabaSmsConfig;
|
private static AlibabaSmsConfig alibabaSmsConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getAlibabaSms
|
* getAlibabaSms
|
||||||
* <p> 建造一个短信实现对像
|
* <p> 建造一个短信实现对像
|
||||||
*
|
*
|
||||||
* @author :Wind
|
* @author :Wind
|
||||||
*/
|
*/
|
||||||
public static AlibabaSmsImpl createAlibabaSms(AlibabaConfig alibabaConfig) {
|
public static AlibabaSmsImpl createAlibabaSms(AlibabaConfig alibabaConfig) {
|
||||||
if (alibabaSmsConfig == null) {
|
if (alibabaSmsConfig == null) {
|
||||||
alibabaSmsConfig = new AlibabaSmsConfig();
|
alibabaSmsConfig = new AlibabaSmsConfig();
|
||||||
}
|
}
|
||||||
if (alibabaSms == null) {
|
if (alibabaSms == null) {
|
||||||
alibabaSms = new AlibabaSmsImpl(
|
alibabaSms = new AlibabaSmsImpl(
|
||||||
alibabaConfig,
|
alibabaConfig,
|
||||||
BeanFactory.getExecutor(),
|
BeanFactory.getExecutor(),
|
||||||
BeanFactory.getDelayedTime());
|
BeanFactory.getDelayedTime());
|
||||||
}
|
}
|
||||||
return alibabaSms;
|
return alibabaSms;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* refresh
|
* refresh
|
||||||
* <p> 刷新对象
|
* <p> 刷新对象
|
||||||
*
|
*
|
||||||
* @author :Wind
|
* @author :Wind
|
||||||
*/
|
*/
|
||||||
public static AlibabaSmsImpl refresh(AlibabaConfig alibabaConfig) {
|
public static AlibabaSmsImpl refresh(AlibabaConfig alibabaConfig) {
|
||||||
// 如果配置对象为空则创建一个
|
// 如果配置对象为空则创建一个
|
||||||
if (alibabaSmsConfig == null) {
|
if (alibabaSmsConfig == null) {
|
||||||
alibabaSmsConfig = new AlibabaSmsConfig();
|
alibabaSmsConfig = new AlibabaSmsConfig();
|
||||||
}
|
}
|
||||||
//重新构造一个实现对象
|
//重新构造一个实现对象
|
||||||
alibabaSms = new AlibabaSmsImpl(
|
alibabaSms = new AlibabaSmsImpl(
|
||||||
alibabaConfig,
|
alibabaConfig,
|
||||||
BeanFactory.getExecutor(),
|
BeanFactory.getExecutor(),
|
||||||
BeanFactory.getDelayedTime());
|
BeanFactory.getDelayedTime());
|
||||||
return alibabaSms;
|
return alibabaSms;
|
||||||
}
|
}
|
||||||
|
|
||||||
private AlibabaSmsConfig() {
|
private AlibabaSmsConfig() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,196 +1,193 @@
|
|||||||
package org.dromara.sms4j.aliyun.service;
|
package org.dromara.sms4j.aliyun.service;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.dtflys.forest.config.ForestConfiguration;
|
import com.dtflys.forest.config.ForestConfiguration;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.sms4j.aliyun.config.AlibabaConfig;
|
import org.dromara.sms4j.aliyun.config.AlibabaConfig;
|
||||||
import org.dromara.sms4j.aliyun.utils.AliyunUtils;
|
import org.dromara.sms4j.aliyun.utils.AliyunUtils;
|
||||||
import org.dromara.sms4j.api.SmsBlend;
|
import org.dromara.sms4j.api.SmsBlend;
|
||||||
import org.dromara.sms4j.api.callback.CallBack;
|
import org.dromara.sms4j.api.callback.CallBack;
|
||||||
import org.dromara.sms4j.api.entity.SmsResponse;
|
import org.dromara.sms4j.api.entity.SmsResponse;
|
||||||
import org.dromara.sms4j.comm.annotation.Restricted;
|
import org.dromara.sms4j.comm.annotation.Restricted;
|
||||||
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
|
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
|
||||||
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||||
import org.dromara.sms4j.comm.factory.BeanFactory;
|
import org.dromara.sms4j.comm.factory.BeanFactory;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
/**
|
|
||||||
* <p>类名: AlibabaSmsImpl
|
/**
|
||||||
* <p>说明: 阿里云短信实现
|
* <p>类名: AlibabaSmsImpl
|
||||||
*
|
* <p>说明: 阿里云短信实现
|
||||||
* @author :Wind
|
*
|
||||||
* 2023/3/26 17:16
|
* @author :Wind
|
||||||
**/
|
* 2023/3/26 17:16
|
||||||
|
**/
|
||||||
@Slf4j
|
|
||||||
public class AlibabaSmsImpl implements SmsBlend {
|
@Slf4j
|
||||||
|
public class AlibabaSmsImpl implements SmsBlend {
|
||||||
private final AlibabaConfig alibabaSmsConfig;
|
|
||||||
|
private final AlibabaConfig alibabaSmsConfig;
|
||||||
private final Executor pool;
|
|
||||||
|
private final Executor pool;
|
||||||
private final DelayedTime delayed;
|
|
||||||
|
private final DelayedTime delayed;
|
||||||
private final ForestConfiguration http = BeanFactory.getForestConfiguration();
|
|
||||||
|
private final ForestConfiguration http = BeanFactory.getForestConfiguration();
|
||||||
/**
|
|
||||||
* AlibabaSmsImpl
|
/**
|
||||||
* <p>构造器,用于构造短信实现模块
|
* AlibabaSmsImpl
|
||||||
*
|
* <p>构造器,用于构造短信实现模块
|
||||||
* @author :Wind
|
*
|
||||||
*/
|
* @author :Wind
|
||||||
|
*/
|
||||||
public AlibabaSmsImpl(AlibabaConfig alibabaSmsConfig, Executor pool, DelayedTime delayedTime) {
|
|
||||||
this.alibabaSmsConfig = alibabaSmsConfig;
|
public AlibabaSmsImpl(AlibabaConfig alibabaSmsConfig, Executor pool, DelayedTime delayedTime) {
|
||||||
this.pool = pool;
|
this.alibabaSmsConfig = alibabaSmsConfig;
|
||||||
this.delayed = delayedTime;
|
this.pool = pool;
|
||||||
}
|
this.delayed = delayedTime;
|
||||||
|
}
|
||||||
@Override
|
|
||||||
@Restricted
|
@Override
|
||||||
public SmsResponse sendMessage(String phone, String message) {
|
@Restricted
|
||||||
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
public SmsResponse sendMessage(String phone, String message) {
|
||||||
map.put(alibabaSmsConfig.getTemplateName(), message);
|
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
||||||
return sendMessage(phone, alibabaSmsConfig.getTemplateId(), map);
|
map.put(alibabaSmsConfig.getTemplateName(), message);
|
||||||
}
|
return sendMessage(phone, alibabaSmsConfig.getTemplateId(), map);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
@Restricted
|
@Override
|
||||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
@Restricted
|
||||||
String messageStr = JSON.toJSONString(messages);
|
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||||
return getSmsResponse(phone, messageStr, templateId);
|
String messageStr = JSON.toJSONString(messages);
|
||||||
}
|
return getSmsResponse(phone, messageStr, templateId);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
@Restricted
|
@Override
|
||||||
public SmsResponse massTexting(List<String> phones, String message) {
|
@Restricted
|
||||||
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
public SmsResponse massTexting(List<String> phones, String message) {
|
||||||
map.put(alibabaSmsConfig.getTemplateName(), message);
|
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
||||||
return massTexting(phones, alibabaSmsConfig.getTemplateId(), map);
|
map.put(alibabaSmsConfig.getTemplateName(), message);
|
||||||
}
|
return massTexting(phones, alibabaSmsConfig.getTemplateId(), map);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
@Restricted
|
@Override
|
||||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
@Restricted
|
||||||
String messageStr = JSON.toJSONString(messages);
|
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||||
return getSmsResponse(arrayToString(phones), messageStr, templateId);
|
String messageStr = JSON.toJSONString(messages);
|
||||||
}
|
return getSmsResponse(arrayToString(phones), messageStr, templateId);
|
||||||
|
}
|
||||||
private SmsResponse getSmsResponse(String phone, String message, String templateId) {
|
|
||||||
SmsResponse smsResponse = new SmsResponse();
|
private SmsResponse getSmsResponse(String phone, String message, String templateId) {
|
||||||
String requestUrl;
|
SmsResponse smsResponse = new SmsResponse();
|
||||||
String paramStr;
|
String requestUrl;
|
||||||
try {
|
String paramStr;
|
||||||
requestUrl = AliyunUtils.generateSendSmsRequestUrl(this.alibabaSmsConfig, message, phone, templateId);
|
try {
|
||||||
paramStr = AliyunUtils.generateParamBody(alibabaSmsConfig, phone, message, templateId);
|
requestUrl = AliyunUtils.generateSendSmsRequestUrl(this.alibabaSmsConfig, message, phone, templateId);
|
||||||
} catch (Exception e) {
|
paramStr = AliyunUtils.generateParamBody(alibabaSmsConfig, phone, message, templateId);
|
||||||
log.error("aliyun send message error", e);
|
} catch (Exception e) {
|
||||||
throw new SmsBlendException(e.getMessage());
|
log.error("aliyun send message error", e);
|
||||||
}
|
throw new SmsBlendException(e.getMessage());
|
||||||
log.info("requestUrl {}", requestUrl);
|
}
|
||||||
http.post(requestUrl)
|
log.debug("requestUrl {}", requestUrl);
|
||||||
.addHeader("Content-Type", "application/x-www-form-urlencoded")
|
http.post(requestUrl)
|
||||||
.addBody(paramStr)
|
.addHeader("Content-Type", "application/x-www-form-urlencoded")
|
||||||
.onSuccess(((data, req, res) -> {
|
.addBody(paramStr)
|
||||||
JSONObject jsonBody = res.get(JSONObject.class);
|
.onSuccess(((data, req, res) -> {
|
||||||
log.info(jsonBody.toJSONString());
|
JSONObject jsonBody = res.get(JSONObject.class);
|
||||||
}))
|
log.info(jsonBody.toJSONString());
|
||||||
.onError((ex, req, res) -> {
|
}))
|
||||||
JSONObject jsonBody = res.get(JSONObject.class);
|
.onError((ex, req, res) -> {
|
||||||
log.info(jsonBody.toJSONString());
|
JSONObject jsonBody = res.get(JSONObject.class);
|
||||||
})
|
log.info(jsonBody.toJSONString());
|
||||||
.execute();
|
})
|
||||||
return smsResponse;
|
.execute();
|
||||||
}
|
return smsResponse;
|
||||||
|
}
|
||||||
@Override
|
|
||||||
@Restricted
|
@Override
|
||||||
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
@Restricted
|
||||||
pool.execute(() -> {
|
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
||||||
SmsResponse smsResponse = sendMessage(phone, message);
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool);
|
||||||
callBack.callBack(smsResponse);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
});
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
@Override
|
@Restricted
|
||||||
@Restricted
|
public void sendMessageAsync(String phone, String message) {
|
||||||
public void sendMessageAsync(String phone, String message) {
|
pool.execute(() -> {
|
||||||
pool.execute(() -> {
|
sendMessage(phone, message);
|
||||||
sendMessage(phone, message);
|
});
|
||||||
});
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
@Override
|
@Restricted
|
||||||
@Restricted
|
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
||||||
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone,templateId, messages), pool);
|
||||||
pool.execute(() -> {
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
SmsResponse smsResponse = sendMessage(phone, templateId, messages);
|
}
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
@Override
|
||||||
}
|
@Restricted
|
||||||
|
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||||
@Override
|
pool.execute(() -> {
|
||||||
@Restricted
|
sendMessage(phone, templateId, messages);
|
||||||
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
});
|
||||||
pool.execute(() -> {
|
}
|
||||||
sendMessage(phone, templateId, messages);
|
|
||||||
});
|
@Override
|
||||||
}
|
@Restricted
|
||||||
|
public void delayedMessage(String phone, String message, Long delayedTime) {
|
||||||
@Override
|
this.delayed.schedule(new TimerTask() {
|
||||||
@Restricted
|
@Override
|
||||||
public void delayedMessage(String phone, String message, Long delayedTime) {
|
public void run() {
|
||||||
this.delayed.schedule(new TimerTask() {
|
sendMessage(phone, message);
|
||||||
@Override
|
}
|
||||||
public void run() {
|
}, delayedTime);
|
||||||
sendMessage(phone, message);
|
}
|
||||||
}
|
|
||||||
}, delayedTime);
|
@Override
|
||||||
}
|
@Restricted
|
||||||
|
public void delayedMessage(String phone, String templateId, LinkedHashMap<String, String> messages, Long delayedTime) {
|
||||||
@Override
|
this.delayed.schedule(new TimerTask() {
|
||||||
@Restricted
|
@Override
|
||||||
public void delayedMessage(String phone, String templateId, LinkedHashMap<String, String> messages, Long delayedTime) {
|
public void run() {
|
||||||
this.delayed.schedule(new TimerTask() {
|
sendMessage(phone, templateId, messages);
|
||||||
@Override
|
}
|
||||||
public void run() {
|
}, delayedTime);
|
||||||
sendMessage(phone, templateId, messages);
|
}
|
||||||
}
|
|
||||||
}, delayedTime);
|
@Override
|
||||||
}
|
@Restricted
|
||||||
|
public void delayMassTexting(List<String> phones, String message, Long delayedTime) {
|
||||||
@Override
|
this.delayed.schedule(new TimerTask() {
|
||||||
@Restricted
|
@Override
|
||||||
public void delayMassTexting(List<String> phones, String message, Long delayedTime) {
|
public void run() {
|
||||||
this.delayed.schedule(new TimerTask() {
|
massTexting(phones, message);
|
||||||
@Override
|
}
|
||||||
public void run() {
|
}, delayedTime);
|
||||||
massTexting(phones, message);
|
}
|
||||||
}
|
|
||||||
}, delayedTime);
|
@Override
|
||||||
}
|
@Restricted
|
||||||
|
public void delayMassTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages, Long delayedTime) {
|
||||||
@Override
|
this.delayed.schedule(new TimerTask() {
|
||||||
@Restricted
|
@Override
|
||||||
public void delayMassTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages, Long delayedTime) {
|
public void run() {
|
||||||
this.delayed.schedule(new TimerTask() {
|
massTexting(phones, templateId, messages);
|
||||||
@Override
|
}
|
||||||
public void run() {
|
}, delayedTime);
|
||||||
massTexting(phones, templateId, messages);
|
}
|
||||||
}
|
|
||||||
}, delayedTime);
|
private String arrayToString(List<String> list) {
|
||||||
}
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (String s : list) {
|
||||||
private String arrayToString(List<String> list) {
|
sb.append(",").append("+86").append(s);
|
||||||
StringBuilder sb = new StringBuilder();
|
}
|
||||||
for (String s : list) {
|
return sb.substring(1);
|
||||||
sb.append(",").append("+86").append(s);
|
}
|
||||||
}
|
}
|
||||||
return sb.substring(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,124 +1,124 @@
|
|||||||
package org.dromara.sms4j.aliyun.utils;
|
package org.dromara.sms4j.aliyun.utils;
|
||||||
|
|
||||||
import cn.hutool.core.codec.Base64;
|
import cn.hutool.core.codec.Base64;
|
||||||
import org.dromara.sms4j.aliyun.config.AlibabaConfig;
|
import org.dromara.sms4j.aliyun.config.AlibabaConfig;
|
||||||
import org.dromara.sms4j.comm.constant.Constant;
|
import org.dromara.sms4j.comm.constant.Constant;
|
||||||
|
|
||||||
import javax.crypto.Mac;
|
import javax.crypto.Mac;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Richard
|
* @author Richard
|
||||||
* @date 2023/4/20 16:55
|
* @date 2023/4/20 16:55
|
||||||
*/
|
*/
|
||||||
public class AliyunUtils {
|
public class AliyunUtils {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 加密方式
|
* 加密方式
|
||||||
*/
|
*/
|
||||||
private static final String ALGORITHM = "HMAC-SHA1";
|
private static final String ALGORITHM = "HMAC-SHA1";
|
||||||
|
|
||||||
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
|
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
|
||||||
|
|
||||||
public static String generateSendSmsRequestUrl(AlibabaConfig alibabaConfig, String message, String phone, String templateId) throws Exception {
|
public static String generateSendSmsRequestUrl(AlibabaConfig alibabaConfig, String message, String phone, String templateId) throws Exception {
|
||||||
// 这里一定要设置GMT时区
|
// 这里一定要设置GMT时区
|
||||||
sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));
|
sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));
|
||||||
Map<String, String> paras = new HashMap<>();
|
Map<String, String> paras = new HashMap<>();
|
||||||
// 1. 公共请求参数
|
// 1. 公共请求参数
|
||||||
paras.put("SignatureMethod", ALGORITHM);
|
paras.put("SignatureMethod", ALGORITHM);
|
||||||
paras.put("SignatureNonce", UUID.randomUUID().toString());
|
paras.put("SignatureNonce", UUID.randomUUID().toString());
|
||||||
paras.put("AccessKeyId", alibabaConfig.getAccessKeyId());
|
paras.put("AccessKeyId", alibabaConfig.getAccessKeyId());
|
||||||
paras.put("SignatureVersion", "1.0");
|
paras.put("SignatureVersion", "1.0");
|
||||||
paras.put("Timestamp", sdf.format(new Date()));
|
paras.put("Timestamp", sdf.format(new Date()));
|
||||||
paras.put("Format", "JSON");
|
paras.put("Format", "JSON");
|
||||||
paras.put("Action", alibabaConfig.getAction());
|
paras.put("Action", alibabaConfig.getAction());
|
||||||
paras.put("Version", alibabaConfig.getVersion());
|
paras.put("Version", alibabaConfig.getVersion());
|
||||||
paras.put("RegionId", alibabaConfig.getRegionId());
|
paras.put("RegionId", alibabaConfig.getRegionId());
|
||||||
// 2. 业务API参数
|
// 2. 业务API参数
|
||||||
Map<String, String> paramMap = generateParamMap(alibabaConfig, phone, message, templateId);
|
Map<String, String> paramMap = generateParamMap(alibabaConfig, phone, message, templateId);
|
||||||
// 3. 参数KEY排序
|
// 3. 参数KEY排序
|
||||||
Map<String, String> sortParas = new TreeMap<>(paras);
|
Map<String, String> sortParas = new TreeMap<>(paras);
|
||||||
sortParas.putAll(paramMap);
|
sortParas.putAll(paramMap);
|
||||||
// 4. 构造待签名的字符串
|
// 4. 构造待签名的字符串
|
||||||
Iterator<String> it = sortParas.keySet().iterator();
|
Iterator<String> it = sortParas.keySet().iterator();
|
||||||
StringBuilder sortQueryStringTmp = new StringBuilder();
|
StringBuilder sortQueryStringTmp = new StringBuilder();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
String key = it.next();
|
String key = it.next();
|
||||||
sortQueryStringTmp.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(sortParas.get(key)));
|
sortQueryStringTmp.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(sortParas.get(key)));
|
||||||
}
|
}
|
||||||
|
|
||||||
String stringToSign = "POST" + "&" +
|
String stringToSign = "POST" + "&" +
|
||||||
specialUrlEncode("/") + "&" +
|
specialUrlEncode("/") + "&" +
|
||||||
specialUrlEncode(sortQueryStringTmp.substring(1));
|
specialUrlEncode(sortQueryStringTmp.substring(1));
|
||||||
String signature = sign(alibabaConfig.getAccessKeySecret() + "&", stringToSign);
|
String signature = sign(alibabaConfig.getAccessKeySecret() + "&", stringToSign);
|
||||||
// 5. 生成请求的url参数
|
// 5. 生成请求的url参数
|
||||||
StringBuilder sortQueryString = new StringBuilder();
|
StringBuilder sortQueryString = new StringBuilder();
|
||||||
it = paras.keySet().iterator();
|
it = paras.keySet().iterator();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
String key = it.next();
|
String key = it.next();
|
||||||
sortQueryString.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(paras.get(key)));
|
sortQueryString.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(paras.get(key)));
|
||||||
}
|
}
|
||||||
// 6.生成合法请求URL
|
// 6.生成合法请求URL
|
||||||
return Constant.HTTPS_PREFIX + alibabaConfig.getRequestUrl() + "/?Signature=" + signature + sortQueryString;
|
return Constant.HTTPS_PREFIX + alibabaConfig.getRequestUrl() + "/?Signature=" + signature + sortQueryString;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* url编码
|
* url编码
|
||||||
*/
|
*/
|
||||||
private static String specialUrlEncode(String value) throws Exception {
|
private static String specialUrlEncode(String value) throws Exception {
|
||||||
return URLEncoder.encode(value, StandardCharsets.UTF_8.name()).replace("+", "%20")
|
return URLEncoder.encode(value, StandardCharsets.UTF_8.name()).replace("+", "%20")
|
||||||
.replace("*", "%2A").replace("%7E", "~");
|
.replace("*", "%2A").replace("%7E", "~");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成签名
|
* 生成签名
|
||||||
*
|
*
|
||||||
* @param accessSecret accessSecret
|
* @param accessSecret accessSecret
|
||||||
* @param stringToSign 待生成签名的字符串
|
* @param stringToSign 待生成签名的字符串
|
||||||
*/
|
*/
|
||||||
private static String sign(String accessSecret, String stringToSign) throws Exception {
|
private static String sign(String accessSecret, String stringToSign) throws Exception {
|
||||||
Mac mac = Mac.getInstance("HmacSHA1");
|
Mac mac = Mac.getInstance("HmacSHA1");
|
||||||
mac.init(new javax.crypto.spec.SecretKeySpec(accessSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA1"));
|
mac.init(new javax.crypto.spec.SecretKeySpec(accessSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA1"));
|
||||||
byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
|
byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
|
||||||
return Base64.encode(signData);
|
return Base64.encode(signData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成请求body参数
|
* 生成请求body参数
|
||||||
*
|
*
|
||||||
* @param alibabaConfig 配置数据
|
* @param alibabaConfig 配置数据
|
||||||
* @param phone 手机号
|
* @param phone 手机号
|
||||||
* @param message 短信内容
|
* @param message 短信内容
|
||||||
* @param templateId 模板id
|
* @param templateId 模板id
|
||||||
*/
|
*/
|
||||||
public static Map<String, String> generateParamMap(AlibabaConfig alibabaConfig, String phone, String message, String templateId) {
|
public static Map<String, String> generateParamMap(AlibabaConfig alibabaConfig, String phone, String message, String templateId) {
|
||||||
Map<String, String> paramMap = new HashMap<>();
|
Map<String, String> paramMap = new HashMap<>();
|
||||||
paramMap.put("PhoneNumbers", phone);
|
paramMap.put("PhoneNumbers", phone);
|
||||||
paramMap.put("SignName", alibabaConfig.getSignature());
|
paramMap.put("SignName", alibabaConfig.getSignature());
|
||||||
paramMap.put("TemplateParam", message);
|
paramMap.put("TemplateParam", message);
|
||||||
paramMap.put("TemplateCode", templateId);
|
paramMap.put("TemplateCode", templateId);
|
||||||
return paramMap;
|
return paramMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成请求参数body字符串
|
* 生成请求参数body字符串
|
||||||
*
|
*
|
||||||
* @param alibabaConfig
|
* @param alibabaConfig
|
||||||
* @param phone
|
* @param phone
|
||||||
* @param message
|
* @param message
|
||||||
* @param templateId
|
* @param templateId
|
||||||
*/
|
*/
|
||||||
public static String generateParamBody(AlibabaConfig alibabaConfig, String phone, String message, String templateId) throws Exception {
|
public static String generateParamBody(AlibabaConfig alibabaConfig, String phone, String message, String templateId) throws Exception {
|
||||||
Map<String, String> paramMap = generateParamMap(alibabaConfig, phone, message, templateId);
|
Map<String, String> paramMap = generateParamMap(alibabaConfig, phone, message, templateId);
|
||||||
StringBuilder sortQueryString = new StringBuilder();
|
StringBuilder sortQueryString = new StringBuilder();
|
||||||
for (String key : paramMap.keySet()) {
|
for (String key : paramMap.keySet()) {
|
||||||
sortQueryString.append("&").append(specialUrlEncode(key)).append("=")
|
sortQueryString.append("&").append(specialUrlEncode(key)).append("=")
|
||||||
.append(specialUrlEncode(paramMap.get(key)));
|
.append(specialUrlEncode(paramMap.get(key)));
|
||||||
}
|
}
|
||||||
return sortQueryString.substring(1);
|
return sortQueryString.substring(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -14,6 +14,7 @@ import org.dromara.sms4j.comm.annotation.Restricted;
|
|||||||
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
|
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -75,10 +76,8 @@ public class CloopenSmsImpl implements SmsBlend {
|
|||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
||||||
pool.execute(() -> {
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool);
|
||||||
SmsResponse smsResponse = sendMessage(phone, message);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -90,10 +89,8 @@ public class CloopenSmsImpl implements SmsBlend {
|
|||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
||||||
pool.execute(() -> {
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone,templateId, messages), pool);
|
||||||
SmsResponse smsResponse = sendMessage(phone, templateId, messages);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -14,6 +14,7 @@ import org.dromara.sms4j.comm.exception.SmsBlendException;
|
|||||||
import org.dromara.sms4j.comm.factory.BeanFactory;
|
import org.dromara.sms4j.comm.factory.BeanFactory;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
@ -89,10 +90,8 @@ public class EmaySmsImpl implements SmsBlend {
|
|||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
||||||
pool.execute(() -> {
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool);
|
||||||
SmsResponse smsResponse = sendMessage(phone, message);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -104,10 +103,8 @@ public class EmaySmsImpl implements SmsBlend {
|
|||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
||||||
pool.execute(() -> {
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, templateId, messages), pool);
|
||||||
SmsResponse smsResponse = sendMessage(phone, templateId, messages);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.dromara.sms4j.api.SmsBlend;
|
import org.dromara.sms4j.api.SmsBlend;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
import static org.dromara.sms4j.huawei.utils.HuaweiBuilder.listToString;
|
import static org.dromara.sms4j.huawei.utils.HuaweiBuilder.listToString;
|
||||||
@ -94,10 +95,8 @@ public class HuaweiSmsImpl implements SmsBlend {
|
|||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
||||||
pool.execute(() -> {
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool);
|
||||||
SmsResponse smsResponse = sendMessage(phone, message);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -109,10 +108,8 @@ public class HuaweiSmsImpl implements SmsBlend {
|
|||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
||||||
pool.execute(() -> {
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, templateId, messages), pool);
|
||||||
SmsResponse smsResponse = sendMessage(phone, templateId, messages);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -17,6 +17,7 @@ import java.util.Collections;
|
|||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ -87,10 +88,8 @@ public class JdCloudSmsImpl implements SmsBlend {
|
|||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
||||||
pool.execute(() -> {
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool);
|
||||||
SmsResponse smsResponse = sendMessage(phone, message);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -102,10 +101,8 @@ public class JdCloudSmsImpl implements SmsBlend {
|
|||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
||||||
pool.execute(() -> {
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, templateId, messages), pool);
|
||||||
SmsResponse smsResponse = sendMessage(phone, templateId, messages);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
/**
|
||||||
|
* 厂商模块
|
||||||
|
* @author :Wind
|
||||||
|
*/
|
||||||
|
package org.dromara.sms4j;
|
||||||
@ -1,52 +1,52 @@
|
|||||||
package org.dromara.sms4j.tencent.config;
|
package org.dromara.sms4j.tencent.config;
|
||||||
|
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
import lombok.experimental.SuperBuilder;
|
import lombok.experimental.SuperBuilder;
|
||||||
import org.dromara.sms4j.comm.config.BaseConfig;
|
import org.dromara.sms4j.comm.config.BaseConfig;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@SuperBuilder
|
@SuperBuilder
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
public class TencentConfig extends BaseConfig {
|
public class TencentConfig extends BaseConfig {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 短信sdkAppId
|
* 短信sdkAppId
|
||||||
*/
|
*/
|
||||||
private String sdkAppId;
|
private String sdkAppId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 地域信息默认为 ap-guangzhou
|
* 地域信息默认为 ap-guangzhou
|
||||||
*/
|
*/
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String territory = "ap-guangzhou";
|
private String territory = "ap-guangzhou";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请求超时时间
|
* 请求超时时间
|
||||||
*/
|
*/
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private Integer connTimeout = 60;
|
private Integer connTimeout = 60;
|
||||||
/** 请求地址*/
|
/** 请求地址*/
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String requestUrl = "sms.tencentcloudapi.com";
|
private String requestUrl = "sms.tencentcloudapi.com";
|
||||||
/**
|
/**
|
||||||
* 接口名称
|
* 接口名称
|
||||||
*/
|
*/
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String action = "SendSms";
|
private String action = "SendSms";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 接口版本
|
* 接口版本
|
||||||
*/
|
*/
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String version = "2021-01-11";
|
private String version = "2021-01-11";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 服务名
|
* 服务名
|
||||||
*/
|
*/
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String service = "sms";
|
private String service = "sms";
|
||||||
}
|
}
|
||||||
@ -1,52 +1,52 @@
|
|||||||
package org.dromara.sms4j.tencent.config;
|
package org.dromara.sms4j.tencent.config;
|
||||||
|
|
||||||
import org.dromara.sms4j.comm.factory.BeanFactory;
|
import org.dromara.sms4j.comm.factory.BeanFactory;
|
||||||
import org.dromara.sms4j.tencent.service.TencentSmsImpl;
|
import org.dromara.sms4j.tencent.service.TencentSmsImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TencentSmsConfig
|
* TencentSmsConfig
|
||||||
* <p> 建造腾讯云短信
|
* <p> 建造腾讯云短信
|
||||||
*
|
*
|
||||||
* @author :Wind
|
* @author :Wind
|
||||||
* 2023/4/8 16:05
|
* 2023/4/8 16:05
|
||||||
**/
|
**/
|
||||||
public class TencentSmsConfig {
|
public class TencentSmsConfig {
|
||||||
private TencentSmsConfig() {
|
private TencentSmsConfig() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TencentSmsImpl tencentSms;
|
private static TencentSmsImpl tencentSms;
|
||||||
|
|
||||||
private static TencentSmsConfig tencentSmsConfig;
|
private static TencentSmsConfig tencentSmsConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 建造一个腾讯云的短信实现
|
* 建造一个腾讯云的短信实现
|
||||||
*/
|
*/
|
||||||
public static TencentSmsImpl createTencentSms(TencentConfig tencentConfig) {
|
public static TencentSmsImpl createTencentSms(TencentConfig tencentConfig) {
|
||||||
if (tencentSmsConfig == null) {
|
if (tencentSmsConfig == null) {
|
||||||
tencentSmsConfig = new TencentSmsConfig();
|
tencentSmsConfig = new TencentSmsConfig();
|
||||||
}
|
}
|
||||||
if (tencentSms == null) {
|
if (tencentSms == null) {
|
||||||
tencentSms = new TencentSmsImpl(
|
tencentSms = new TencentSmsImpl(
|
||||||
tencentConfig,
|
tencentConfig,
|
||||||
BeanFactory.getExecutor(),
|
BeanFactory.getExecutor(),
|
||||||
BeanFactory.getDelayedTime()
|
BeanFactory.getDelayedTime()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return tencentSms;
|
return tencentSms;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 刷新对象
|
* 刷新对象
|
||||||
*/
|
*/
|
||||||
public static TencentSmsImpl refresh(TencentConfig tencentConfig) {
|
public static TencentSmsImpl refresh(TencentConfig tencentConfig) {
|
||||||
if (tencentSmsConfig == null) {
|
if (tencentSmsConfig == null) {
|
||||||
tencentSmsConfig = new TencentSmsConfig();
|
tencentSmsConfig = new TencentSmsConfig();
|
||||||
}
|
}
|
||||||
tencentSms = new TencentSmsImpl(
|
tencentSms = new TencentSmsImpl(
|
||||||
tencentConfig,
|
tencentConfig,
|
||||||
BeanFactory.getExecutor(),
|
BeanFactory.getExecutor(),
|
||||||
BeanFactory.getDelayedTime()
|
BeanFactory.getDelayedTime()
|
||||||
);
|
);
|
||||||
return tencentSms;
|
return tencentSms;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,205 +1,202 @@
|
|||||||
package org.dromara.sms4j.tencent.service;
|
package org.dromara.sms4j.tencent.service;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.dtflys.forest.config.ForestConfiguration;
|
import com.dtflys.forest.config.ForestConfiguration;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.sms4j.api.SmsBlend;
|
import org.dromara.sms4j.api.SmsBlend;
|
||||||
import org.dromara.sms4j.api.callback.CallBack;
|
import org.dromara.sms4j.api.callback.CallBack;
|
||||||
import org.dromara.sms4j.api.entity.SmsResponse;
|
import org.dromara.sms4j.api.entity.SmsResponse;
|
||||||
import org.dromara.sms4j.comm.annotation.Restricted;
|
import org.dromara.sms4j.comm.annotation.Restricted;
|
||||||
import org.dromara.sms4j.comm.constant.Constant;
|
import org.dromara.sms4j.comm.constant.Constant;
|
||||||
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
|
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
|
||||||
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||||
import org.dromara.sms4j.comm.factory.BeanFactory;
|
import org.dromara.sms4j.comm.factory.BeanFactory;
|
||||||
import org.dromara.sms4j.tencent.config.TencentConfig;
|
import org.dromara.sms4j.tencent.config.TencentConfig;
|
||||||
import org.dromara.sms4j.tencent.utils.TencentUtils;
|
import org.dromara.sms4j.tencent.utils.TencentUtils;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
@Slf4j
|
|
||||||
public class TencentSmsImpl implements SmsBlend {
|
@Slf4j
|
||||||
|
public class TencentSmsImpl implements SmsBlend {
|
||||||
private TencentConfig tencentSmsConfig;
|
|
||||||
|
private TencentConfig tencentSmsConfig;
|
||||||
private Executor pool;
|
|
||||||
|
private Executor pool;
|
||||||
private DelayedTime delayed;
|
|
||||||
|
private DelayedTime delayed;
|
||||||
private final ForestConfiguration http = BeanFactory.getForestConfiguration();
|
|
||||||
|
private final ForestConfiguration http = BeanFactory.getForestConfiguration();
|
||||||
public TencentSmsImpl(TencentConfig tencentSmsConfig, Executor pool, DelayedTime delayed) {
|
|
||||||
this.tencentSmsConfig = tencentSmsConfig;
|
public TencentSmsImpl(TencentConfig tencentSmsConfig, Executor pool, DelayedTime delayed) {
|
||||||
this.pool = pool;
|
this.tencentSmsConfig = tencentSmsConfig;
|
||||||
this.delayed = delayed;
|
this.pool = pool;
|
||||||
}
|
this.delayed = delayed;
|
||||||
|
}
|
||||||
@Override
|
|
||||||
@Restricted
|
@Override
|
||||||
public SmsResponse sendMessage(String phone, String message) {
|
@Restricted
|
||||||
String[] split = message.split("&");
|
public SmsResponse sendMessage(String phone, String message) {
|
||||||
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
String[] split = message.split("&");
|
||||||
for (int i = 0; i < split.length; i++) {
|
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
||||||
map.put(String.valueOf(i), split[i]);
|
for (int i = 0; i < split.length; i++) {
|
||||||
}
|
map.put(String.valueOf(i), split[i]);
|
||||||
return sendMessage(phone, tencentSmsConfig.getTemplateId(), map);
|
}
|
||||||
}
|
return sendMessage(phone, tencentSmsConfig.getTemplateId(), map);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
@Restricted
|
@Override
|
||||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
@Restricted
|
||||||
List<String> list = new ArrayList<>();
|
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||||
for (Map.Entry<String, String> entry : messages.entrySet()) {
|
List<String> list = new ArrayList<>();
|
||||||
list.add(entry.getValue());
|
for (Map.Entry<String, String> entry : messages.entrySet()) {
|
||||||
}
|
list.add(entry.getValue());
|
||||||
String[] s = new String[list.size()];
|
}
|
||||||
return getSmsResponse(new String[]{"+86" + phone}, list.toArray(s), templateId);
|
String[] s = new String[list.size()];
|
||||||
}
|
return getSmsResponse(new String[]{"+86" + phone}, list.toArray(s), templateId);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
@Restricted
|
@Override
|
||||||
public SmsResponse massTexting(List<String> phones, String message) {
|
@Restricted
|
||||||
String[] split = message.split("&");
|
public SmsResponse massTexting(List<String> phones, String message) {
|
||||||
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
String[] split = message.split("&");
|
||||||
for (int i = 0; i < split.length; i++) {
|
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
||||||
map.put(String.valueOf(i), split[i]);
|
for (int i = 0; i < split.length; i++) {
|
||||||
}
|
map.put(String.valueOf(i), split[i]);
|
||||||
return massTexting(phones, tencentSmsConfig.getTemplateId(), map);
|
}
|
||||||
}
|
return massTexting(phones, tencentSmsConfig.getTemplateId(), map);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
@Restricted
|
@Override
|
||||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
@Restricted
|
||||||
List<String> list = new ArrayList<>();
|
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||||
for (Map.Entry<String, String> entry : messages.entrySet()) {
|
List<String> list = new ArrayList<>();
|
||||||
list.add(entry.getValue());
|
for (Map.Entry<String, String> entry : messages.entrySet()) {
|
||||||
}
|
list.add(entry.getValue());
|
||||||
String[] s = new String[list.size()];
|
}
|
||||||
return getSmsResponse(arrayToString(phones), list.toArray(s), templateId);
|
String[] s = new String[list.size()];
|
||||||
}
|
return getSmsResponse(arrayToString(phones), list.toArray(s), templateId);
|
||||||
|
}
|
||||||
private SmsResponse getSmsResponse(String[] phones, String[] messages, String templateId) {
|
|
||||||
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
|
private SmsResponse getSmsResponse(String[] phones, String[] messages, String templateId) {
|
||||||
String signature;
|
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
|
||||||
try {
|
String signature;
|
||||||
signature = TencentUtils.generateSignature(this.tencentSmsConfig, templateId, messages, phones, timestamp);
|
try {
|
||||||
} catch (Exception e) {
|
signature = TencentUtils.generateSignature(this.tencentSmsConfig, templateId, messages, phones, timestamp);
|
||||||
log.error("tencent send message error", e);
|
} catch (Exception e) {
|
||||||
throw new SmsBlendException(e.getMessage());
|
log.error("tencent send message error", e);
|
||||||
}
|
throw new SmsBlendException(e.getMessage());
|
||||||
Map<String, Object> headsMap = TencentUtils.generateHeadsMap(signature, timestamp, tencentSmsConfig.getAction(),
|
}
|
||||||
tencentSmsConfig.getVersion(), tencentSmsConfig.getTerritory(), tencentSmsConfig.getRequestUrl());
|
Map<String, Object> headsMap = TencentUtils.generateHeadsMap(signature, timestamp, tencentSmsConfig.getAction(),
|
||||||
Map<String, Object> requestBody = TencentUtils.generateRequestBody(phones, tencentSmsConfig.getSdkAppId(),
|
tencentSmsConfig.getVersion(), tencentSmsConfig.getTerritory(), tencentSmsConfig.getRequestUrl());
|
||||||
tencentSmsConfig.getSignature(), templateId, messages);
|
Map<String, Object> requestBody = TencentUtils.generateRequestBody(phones, tencentSmsConfig.getSdkAppId(),
|
||||||
SmsResponse smsResponse = new SmsResponse();
|
tencentSmsConfig.getSignature(), templateId, messages);
|
||||||
String url = Constant.HTTPS_PREFIX + tencentSmsConfig.getRequestUrl();
|
SmsResponse smsResponse = new SmsResponse();
|
||||||
http.post(url)
|
String url = Constant.HTTPS_PREFIX + tencentSmsConfig.getRequestUrl();
|
||||||
.addHeader(headsMap)
|
http.post(url)
|
||||||
.addBody(requestBody)
|
.addHeader(headsMap)
|
||||||
.onSuccess(((data, req, res) -> {
|
.addBody(requestBody)
|
||||||
JSONObject jsonBody = res.get(JSONObject.class);
|
.onSuccess(((data, req, res) -> {
|
||||||
JSONObject response = jsonBody.getJSONObject("Response");
|
JSONObject jsonBody = res.get(JSONObject.class);
|
||||||
JSONArray sendStatusSet = response.getJSONArray("SendStatusSet");
|
JSONObject response = jsonBody.getJSONObject("Response");
|
||||||
smsResponse.setBizId(sendStatusSet.getJSONObject(0).getString("SerialNo"));
|
JSONArray sendStatusSet = response.getJSONArray("SendStatusSet");
|
||||||
smsResponse.setMessage(sendStatusSet.getJSONObject(0).getString("Message"));
|
smsResponse.setBizId(sendStatusSet.getJSONObject(0).getString("SerialNo"));
|
||||||
smsResponse.setCode(sendStatusSet.getJSONObject(0).getString("Code"));
|
smsResponse.setMessage(sendStatusSet.getJSONObject(0).getString("Message"));
|
||||||
}))
|
smsResponse.setCode(sendStatusSet.getJSONObject(0).getString("Code"));
|
||||||
.onError((ex, req, res) -> {
|
}))
|
||||||
JSONObject jsonBody = res.get(JSONObject.class);
|
.onError((ex, req, res) -> {
|
||||||
JSONObject response = jsonBody.getJSONObject("Response");
|
JSONObject jsonBody = res.get(JSONObject.class);
|
||||||
JSONArray sendStatusSet = response.getJSONArray("SendStatusSet");
|
JSONObject response = jsonBody.getJSONObject("Response");
|
||||||
smsResponse.setErrMessage(sendStatusSet.getJSONObject(0).getString("Message"));
|
JSONArray sendStatusSet = response.getJSONArray("SendStatusSet");
|
||||||
smsResponse.setErrorCode(sendStatusSet.getJSONObject(0).getString("Code"));
|
smsResponse.setErrMessage(sendStatusSet.getJSONObject(0).getString("Message"));
|
||||||
})
|
smsResponse.setErrorCode(sendStatusSet.getJSONObject(0).getString("Code"));
|
||||||
.execute();
|
})
|
||||||
return smsResponse;
|
.execute();
|
||||||
}
|
return smsResponse;
|
||||||
|
}
|
||||||
@Override
|
|
||||||
@Restricted
|
@Override
|
||||||
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
@Restricted
|
||||||
pool.execute(() -> {
|
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
||||||
SmsResponse smsResponse = sendMessage(phone, message);
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool);
|
||||||
callBack.callBack(smsResponse);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
});
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
@Override
|
@Restricted
|
||||||
@Restricted
|
public void sendMessageAsync(String phone, String message) {
|
||||||
public void sendMessageAsync(String phone, String message) {
|
pool.execute(() -> {
|
||||||
pool.execute(() -> {
|
sendMessage(phone, message);
|
||||||
sendMessage(phone, message);
|
});
|
||||||
});
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
@Override
|
@Restricted
|
||||||
@Restricted
|
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
||||||
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, templateId, messages), pool);
|
||||||
pool.execute(() -> {
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
SmsResponse smsResponse = sendMessage(phone, templateId, messages);
|
}
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
@Override
|
||||||
}
|
@Restricted
|
||||||
|
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||||
@Override
|
pool.execute(() -> {
|
||||||
@Restricted
|
sendMessage(phone, templateId, messages);
|
||||||
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
});
|
||||||
pool.execute(() -> {
|
}
|
||||||
sendMessage(phone, templateId, messages);
|
|
||||||
});
|
@Override
|
||||||
}
|
@Restricted
|
||||||
|
public void delayedMessage(String phone, String message, Long delayedTime) {
|
||||||
@Override
|
this.delayed.schedule(new TimerTask() {
|
||||||
@Restricted
|
@Override
|
||||||
public void delayedMessage(String phone, String message, Long delayedTime) {
|
public void run() {
|
||||||
this.delayed.schedule(new TimerTask() {
|
sendMessage(phone, message);
|
||||||
@Override
|
}
|
||||||
public void run() {
|
}, delayedTime);
|
||||||
sendMessage(phone, message);
|
}
|
||||||
}
|
|
||||||
}, delayedTime);
|
@Override
|
||||||
}
|
@Restricted
|
||||||
|
public void delayedMessage(String phone, String templateId, LinkedHashMap<String, String> messages, Long delayedTime) {
|
||||||
@Override
|
this.delayed.schedule(new TimerTask() {
|
||||||
@Restricted
|
@Override
|
||||||
public void delayedMessage(String phone, String templateId, LinkedHashMap<String, String> messages, Long delayedTime) {
|
public void run() {
|
||||||
this.delayed.schedule(new TimerTask() {
|
sendMessage(phone, templateId, messages);
|
||||||
@Override
|
}
|
||||||
public void run() {
|
}, delayedTime);
|
||||||
sendMessage(phone, templateId, messages);
|
}
|
||||||
}
|
|
||||||
}, delayedTime);
|
@Override
|
||||||
}
|
@Restricted
|
||||||
|
public void delayMassTexting(List<String> phones, String message, Long delayedTime) {
|
||||||
@Override
|
this.delayed.schedule(new TimerTask() {
|
||||||
@Restricted
|
@Override
|
||||||
public void delayMassTexting(List<String> phones, String message, Long delayedTime) {
|
public void run() {
|
||||||
this.delayed.schedule(new TimerTask() {
|
massTexting(phones, message);
|
||||||
@Override
|
}
|
||||||
public void run() {
|
}, delayedTime);
|
||||||
massTexting(phones, message);
|
}
|
||||||
}
|
|
||||||
}, delayedTime);
|
@Override
|
||||||
}
|
@Restricted
|
||||||
|
public void delayMassTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages, Long delayedTime) {
|
||||||
@Override
|
this.delayed.schedule(new TimerTask() {
|
||||||
@Restricted
|
@Override
|
||||||
public void delayMassTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages, Long delayedTime) {
|
public void run() {
|
||||||
this.delayed.schedule(new TimerTask() {
|
massTexting(phones, templateId, messages);
|
||||||
@Override
|
}
|
||||||
public void run() {
|
}, delayedTime);
|
||||||
massTexting(phones, templateId, messages);
|
}
|
||||||
}
|
|
||||||
}, delayedTime);
|
private String[] arrayToString(List<String> list) {
|
||||||
}
|
String[] strs = new String[list.size()];
|
||||||
|
List<String> toStr = new ArrayList<>();
|
||||||
private String[] arrayToString(List<String> list) {
|
for (String s : list) {
|
||||||
String[] strs = new String[list.size()];
|
toStr.add("+86" + s);
|
||||||
List<String> toStr = new ArrayList<>();
|
}
|
||||||
for (String s : list) {
|
return toStr.toArray(strs);
|
||||||
toStr.add("+86" + s);
|
}
|
||||||
}
|
}
|
||||||
return toStr.toArray(strs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,138 +1,138 @@
|
|||||||
package org.dromara.sms4j.tencent.utils;
|
package org.dromara.sms4j.tencent.utils;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.sms4j.tencent.config.TencentConfig;
|
import org.dromara.sms4j.tencent.config.TencentConfig;
|
||||||
|
|
||||||
import javax.crypto.Mac;
|
import javax.crypto.Mac;
|
||||||
import javax.crypto.spec.SecretKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
import javax.xml.bind.DatatypeConverter;
|
import javax.xml.bind.DatatypeConverter;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Richard
|
* @author Richard
|
||||||
* @date 2023-04-18 19:50
|
* @date 2023-04-18 19:50
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class TencentUtils {
|
public class TencentUtils {
|
||||||
/**
|
/**
|
||||||
* 加密方式
|
* 加密方式
|
||||||
*/
|
*/
|
||||||
private static final String ALGORITHM = "TC3-HMAC-SHA256";
|
private static final String ALGORITHM = "TC3-HMAC-SHA256";
|
||||||
/**
|
/**
|
||||||
* 请求方式
|
* 请求方式
|
||||||
*/
|
*/
|
||||||
private static final String HTTP_REQUEST_METHOD = "POST";
|
private static final String HTTP_REQUEST_METHOD = "POST";
|
||||||
|
|
||||||
private static final String CT_JSON = "application/json; charset=utf-8";
|
private static final String CT_JSON = "application/json; charset=utf-8";
|
||||||
|
|
||||||
|
|
||||||
private static byte[] hmac256(byte[] key, String msg) throws Exception {
|
private static byte[] hmac256(byte[] key, String msg) throws Exception {
|
||||||
Mac mac = Mac.getInstance("HmacSHA256");
|
Mac mac = Mac.getInstance("HmacSHA256");
|
||||||
SecretKeySpec secretKeySpec = new SecretKeySpec(key, mac.getAlgorithm());
|
SecretKeySpec secretKeySpec = new SecretKeySpec(key, mac.getAlgorithm());
|
||||||
mac.init(secretKeySpec);
|
mac.init(secretKeySpec);
|
||||||
return mac.doFinal(msg.getBytes(StandardCharsets.UTF_8));
|
return mac.doFinal(msg.getBytes(StandardCharsets.UTF_8));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String sha256Hex(String s) throws Exception {
|
private static String sha256Hex(String s) throws Exception {
|
||||||
MessageDigest md = MessageDigest.getInstance("SHA-256");
|
MessageDigest md = MessageDigest.getInstance("SHA-256");
|
||||||
byte[] d = md.digest(s.getBytes(StandardCharsets.UTF_8));
|
byte[] d = md.digest(s.getBytes(StandardCharsets.UTF_8));
|
||||||
return DatatypeConverter.printHexBinary(d).toLowerCase();
|
return DatatypeConverter.printHexBinary(d).toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成腾讯云发送短信接口签名
|
* 生成腾讯云发送短信接口签名
|
||||||
*
|
*
|
||||||
* @param templateId 模板id
|
* @param templateId 模板id
|
||||||
* @param messages 短信内容
|
* @param messages 短信内容
|
||||||
* @param phones 手机号
|
* @param phones 手机号
|
||||||
* @param timestamp 时间戳
|
* @param timestamp 时间戳
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public static String generateSignature(TencentConfig tencentConfig, String templateId, String[] messages, String[] phones,
|
public static String generateSignature(TencentConfig tencentConfig, String templateId, String[] messages, String[] phones,
|
||||||
String timestamp) throws Exception {
|
String timestamp) throws Exception {
|
||||||
// ************* 步骤 1:拼接规范请求串 *************
|
// ************* 步骤 1:拼接规范请求串 *************
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
||||||
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
|
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||||
String date = sdf.format(new Date(Long.parseLong(timestamp + "000")));
|
String date = sdf.format(new Date(Long.parseLong(timestamp + "000")));
|
||||||
String canonicalUri = "/";
|
String canonicalUri = "/";
|
||||||
String canonicalQueryString = "";
|
String canonicalQueryString = "";
|
||||||
String canonicalHeaders = "content-type:application/json; charset=utf-8\n" + "host:" + tencentConfig.getRequestUrl() + "\n";
|
String canonicalHeaders = "content-type:application/json; charset=utf-8\n" + "host:" + tencentConfig.getRequestUrl() + "\n";
|
||||||
String signedHeaders = "content-type;host";
|
String signedHeaders = "content-type;host";
|
||||||
HashMap<String, Object> params = new HashMap<>();
|
HashMap<String, Object> params = new HashMap<>();
|
||||||
// 实际调用需要更新参数,这里仅作为演示签名验证通过的例子
|
// 实际调用需要更新参数,这里仅作为演示签名验证通过的例子
|
||||||
params.put("PhoneNumberSet", phones);
|
params.put("PhoneNumberSet", phones);
|
||||||
params.put("SmsSdkAppId", tencentConfig.getSdkAppId());
|
params.put("SmsSdkAppId", tencentConfig.getSdkAppId());
|
||||||
params.put("SignName", tencentConfig.getSignature());
|
params.put("SignName", tencentConfig.getSignature());
|
||||||
params.put("TemplateId", templateId);
|
params.put("TemplateId", templateId);
|
||||||
params.put("TemplateParamSet", messages);
|
params.put("TemplateParamSet", messages);
|
||||||
String payload = JSON.toJSONString(params);
|
String payload = JSON.toJSONString(params);
|
||||||
String hashedRequestPayload = sha256Hex(payload);
|
String hashedRequestPayload = sha256Hex(payload);
|
||||||
String canonicalRequest = HTTP_REQUEST_METHOD + "\n" + canonicalUri + "\n" + canonicalQueryString + "\n"
|
String canonicalRequest = HTTP_REQUEST_METHOD + "\n" + canonicalUri + "\n" + canonicalQueryString + "\n"
|
||||||
+ canonicalHeaders + "\n" + signedHeaders + "\n" + hashedRequestPayload;
|
+ canonicalHeaders + "\n" + signedHeaders + "\n" + hashedRequestPayload;
|
||||||
// ************* 步骤 2:拼接待签名字符串 *************
|
// ************* 步骤 2:拼接待签名字符串 *************
|
||||||
String credentialScope = date + "/" + tencentConfig.getService() + "/" + "tc3_request";
|
String credentialScope = date + "/" + tencentConfig.getService() + "/" + "tc3_request";
|
||||||
String hashedCanonicalRequest = sha256Hex(canonicalRequest);
|
String hashedCanonicalRequest = sha256Hex(canonicalRequest);
|
||||||
String stringToSign = ALGORITHM + "\n" + timestamp + "\n" + credentialScope + "\n" + hashedCanonicalRequest;
|
String stringToSign = ALGORITHM + "\n" + timestamp + "\n" + credentialScope + "\n" + hashedCanonicalRequest;
|
||||||
// ************* 步骤 3:计算签名 *************
|
// ************* 步骤 3:计算签名 *************
|
||||||
byte[] secretDate = hmac256(("TC3" + tencentConfig.getAccessKeySecret()).getBytes(StandardCharsets.UTF_8), date);
|
byte[] secretDate = hmac256(("TC3" + tencentConfig.getAccessKeySecret()).getBytes(StandardCharsets.UTF_8), date);
|
||||||
byte[] secretService = hmac256(secretDate, tencentConfig.getService());
|
byte[] secretService = hmac256(secretDate, tencentConfig.getService());
|
||||||
byte[] secretSigning = hmac256(secretService, "tc3_request");
|
byte[] secretSigning = hmac256(secretService, "tc3_request");
|
||||||
String signature = DatatypeConverter.printHexBinary(hmac256(secretSigning, stringToSign)).toLowerCase();
|
String signature = DatatypeConverter.printHexBinary(hmac256(secretSigning, stringToSign)).toLowerCase();
|
||||||
// ************* 步骤 4:拼接 Authorization *************
|
// ************* 步骤 4:拼接 Authorization *************
|
||||||
return ALGORITHM + " " + "Credential=" + tencentConfig.getAccessKeyId() + "/" + credentialScope + ", "
|
return ALGORITHM + " " + "Credential=" + tencentConfig.getAccessKeyId() + "/" + credentialScope + ", "
|
||||||
+ "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature;
|
+ "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成腾讯云短信请求头map
|
* 生成腾讯云短信请求头map
|
||||||
*
|
*
|
||||||
* @param authorization 签名信息
|
* @param authorization 签名信息
|
||||||
* @param timestamp 时间戳
|
* @param timestamp 时间戳
|
||||||
* @param action 接口名称
|
* @param action 接口名称
|
||||||
* @param version 接口版本
|
* @param version 接口版本
|
||||||
* @param territory 服务器地区
|
* @param territory 服务器地区
|
||||||
* @param requestUrl 请求地址
|
* @param requestUrl 请求地址
|
||||||
*/
|
*/
|
||||||
public static Map<String, Object> generateHeadsMap(String authorization, String timestamp, String action,
|
public static Map<String, Object> generateHeadsMap(String authorization, String timestamp, String action,
|
||||||
String version, String territory, String requestUrl) {
|
String version, String territory, String requestUrl) {
|
||||||
Map<String, Object> headers = new HashMap<>();
|
Map<String, Object> headers = new HashMap<>();
|
||||||
headers.put("Authorization", authorization);
|
headers.put("Authorization", authorization);
|
||||||
headers.put("Content-Type", CT_JSON);
|
headers.put("Content-Type", CT_JSON);
|
||||||
headers.put("Host", requestUrl);
|
headers.put("Host", requestUrl);
|
||||||
headers.put("X-TC-Action", action);
|
headers.put("X-TC-Action", action);
|
||||||
headers.put("X-TC-Timestamp", timestamp);
|
headers.put("X-TC-Timestamp", timestamp);
|
||||||
headers.put("X-TC-Version", version);
|
headers.put("X-TC-Version", version);
|
||||||
headers.put("X-TC-Region", territory);
|
headers.put("X-TC-Region", territory);
|
||||||
return headers;
|
return headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成腾讯云短信请求body
|
* 生成腾讯云短信请求body
|
||||||
*
|
*
|
||||||
* @param phones 手机号
|
* @param phones 手机号
|
||||||
* @param sdkAppId appid
|
* @param sdkAppId appid
|
||||||
* @param signatureName 短信签名
|
* @param signatureName 短信签名
|
||||||
* @param templateId 模板id
|
* @param templateId 模板id
|
||||||
* @param templateParamSet 模板参数
|
* @param templateParamSet 模板参数
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static Map<String, Object> generateRequestBody(String[] phones, String sdkAppId, String signatureName,
|
public static Map<String, Object> generateRequestBody(String[] phones, String sdkAppId, String signatureName,
|
||||||
String templateId, String[] templateParamSet) {
|
String templateId, String[] templateParamSet) {
|
||||||
Map<String, Object> requestBody = new HashMap<>();
|
Map<String, Object> requestBody = new HashMap<>();
|
||||||
requestBody.put("PhoneNumberSet", phones);
|
requestBody.put("PhoneNumberSet", phones);
|
||||||
requestBody.put("SmsSdkAppId", sdkAppId);
|
requestBody.put("SmsSdkAppId", sdkAppId);
|
||||||
requestBody.put("SignName", signatureName);
|
requestBody.put("SignName", signatureName);
|
||||||
requestBody.put("TemplateId", templateId);
|
requestBody.put("TemplateId", templateId);
|
||||||
requestBody.put("TemplateParamSet", templateParamSet);
|
requestBody.put("TemplateParamSet", templateParamSet);
|
||||||
return requestBody;
|
return requestBody;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package org.dromara.sms4j.unisms.config;
|
package org.dromara.sms4j.unisms.config;
|
||||||
|
|
||||||
import com.apistd.uni.Uni;
|
|
||||||
import org.dromara.sms4j.comm.factory.BeanFactory;
|
import org.dromara.sms4j.comm.factory.BeanFactory;
|
||||||
|
import org.dromara.sms4j.unisms.core.Uni;
|
||||||
import org.dromara.sms4j.unisms.service.UniSmsImpl;
|
import org.dromara.sms4j.unisms.service.UniSmsImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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<String, Object> params) {
|
||||||
|
Map<String, Object> 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<String, Object> sign(final Map<String, Object> 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
|
||||||
|
* <p>向 uni-sms发送请求
|
||||||
|
* @param action 接口名称
|
||||||
|
* @author :Wind
|
||||||
|
*/
|
||||||
|
public UniResponse request(final String action, final Map<String, Object> data) throws SmsBlendException {
|
||||||
|
Map<String, Object> query = new HashMap<String, Object>();
|
||||||
|
query.put("action", action);
|
||||||
|
query.put("accessKeyId", this.accessKeyId);
|
||||||
|
|
||||||
|
Map<String, String> 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<String> {
|
||||||
|
@Override
|
||||||
|
public int compare(String str1, String str2) {
|
||||||
|
return str1.compareTo(str2);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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 +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,22 +1,26 @@
|
|||||||
package org.dromara.sms4j.unisms.service;
|
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.SmsBlend;
|
||||||
import org.dromara.sms4j.api.callback.CallBack;
|
import org.dromara.sms4j.api.callback.CallBack;
|
||||||
import org.dromara.sms4j.api.entity.SmsResponse;
|
import org.dromara.sms4j.api.entity.SmsResponse;
|
||||||
import org.dromara.sms4j.comm.annotation.Restricted;
|
import org.dromara.sms4j.comm.annotation.Restricted;
|
||||||
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
|
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
|
||||||
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||||
import org.dromara.sms4j.comm.utils.http.HttpJsonTool;
|
|
||||||
import org.dromara.sms4j.unisms.config.UniConfig;
|
import org.dromara.sms4j.unisms.config.UniConfig;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -53,10 +57,12 @@ public class UniSmsImpl implements SmsBlend {
|
|||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||||
UniMessage uniMes = UniSMS.buildMessage().setSignature(config.getSignature()).setTo(phone)
|
Map<String, Object> data = new HashMap<>();
|
||||||
.setTemplateId(templateId)
|
data.put("to", Collections.singletonList(phone));
|
||||||
.setTemplateData(messages);
|
data.put("signature", config.getSignature());
|
||||||
return getSmsResponse(uniMes);
|
data.put("templateId", templateId);
|
||||||
|
data.put("templateData", messages);
|
||||||
|
return getSmsResponse(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -76,20 +82,19 @@ public class UniSmsImpl implements SmsBlend {
|
|||||||
if (phones.size()>1000){
|
if (phones.size()>1000){
|
||||||
throw new SmsBlendException("单次发送超过最大发送上限,建议每次群发短信人数低于1000");
|
throw new SmsBlendException("单次发送超过最大发送上限,建议每次群发短信人数低于1000");
|
||||||
}
|
}
|
||||||
String[] s = new String[phones.size()];
|
Map<String, Object> data = new HashMap<>();
|
||||||
UniMessage uniMes = UniSMS.buildMessage().setSignature(config.getSignature()).setTo(phones.toArray(s))
|
data.put("to", phones);
|
||||||
.setTemplateId(templateId)
|
data.put("signature", config.getSignature());
|
||||||
.setTemplateData(messages);
|
data.put("templateId", templateId);
|
||||||
return getSmsResponse(uniMes);
|
data.put("templateData", messages);
|
||||||
|
return getSmsResponse(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
||||||
pool.execute(()->{
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool);
|
||||||
SmsResponse smsResponse = sendMessage(phone, message);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -102,10 +107,8 @@ public class UniSmsImpl implements SmsBlend {
|
|||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
||||||
pool.execute(()->{
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, templateId, messages), pool);
|
||||||
SmsResponse smsResponse = sendMessage(phone,templateId,messages);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -157,10 +160,10 @@ public class UniSmsImpl implements SmsBlend {
|
|||||||
},delayedTime);
|
},delayedTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
private SmsResponse getSmsResponse(UniMessage uniMes) {
|
private SmsResponse getSmsResponse( Map<String, Object> data) {
|
||||||
SmsResponse smsResponse = new SmsResponse();
|
SmsResponse smsResponse = new SmsResponse();
|
||||||
try {
|
try {
|
||||||
UniResponse send = uniMes.send();
|
UniResponse send = Uni.getClient().request("sms.message.send", data);
|
||||||
smsResponse.setCode(String.valueOf(send.status));
|
smsResponse.setCode(String.valueOf(send.status));
|
||||||
smsResponse.setErrorCode(send.code);
|
smsResponse.setErrorCode(send.code);
|
||||||
smsResponse.setMessage(send.message);
|
smsResponse.setMessage(send.message);
|
||||||
@ -12,6 +12,7 @@ import org.dromara.sms4j.comm.exception.SmsBlendException;
|
|||||||
import org.dromara.sms4j.yunpian.config.YunpianConfig;
|
import org.dromara.sms4j.yunpian.config.YunpianConfig;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
@ -74,10 +75,8 @@ public class YunPianSmsImpl implements SmsBlend {
|
|||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
public void sendMessageAsync(String phone, String message, CallBack callBack) {
|
||||||
pool.execute(() -> {
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool);
|
||||||
SmsResponse smsResponse = sendMessage(phone, message);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -89,10 +88,8 @@ public class YunPianSmsImpl implements SmsBlend {
|
|||||||
@Override
|
@Override
|
||||||
@Restricted
|
@Restricted
|
||||||
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
public void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack) {
|
||||||
pool.execute(() -> {
|
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, templateId, messages), pool);
|
||||||
SmsResponse smsResponse = sendMessage(phone, templateId, messages);
|
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||||
callBack.callBack(smsResponse);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -1,41 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-spring-boot-starter</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
<name>sms4j-spring-boot-starter</name>
|
|
||||||
<description>sms4j-spring-boot-starter</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-dependencies</artifactId>
|
|
||||||
<version>${spring.boot.version}</version>
|
|
||||||
<type>pom</type>
|
|
||||||
<scope>import</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-autoimmit</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<build />
|
|
||||||
</project>
|
|
||||||
@ -10,13 +10,10 @@
|
|||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>sms4j-spring-boot-starter</artifactId>
|
<artifactId>sms4j-spring-boot-starter</artifactId>
|
||||||
<name>sms4j-spring-boot-starter</name>
|
|
||||||
<description>sms4j-spring-boot-starter</description>
|
|
||||||
<version>${revision}</version>
|
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<properties>
|
<name>sms4j-spring-boot-starter</name>
|
||||||
</properties>
|
<description>sms4j-spring-boot-starter</description>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -36,10 +33,11 @@
|
|||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter</artifactId>
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
<dependency>
|
||||||
<plugins>
|
<groupId>org.springframework.boot</groupId>
|
||||||
</plugins>
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
</build>
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@ -0,0 +1,33 @@
|
|||||||
|
package org.dromara.sms4j.test;
|
||||||
|
|
||||||
|
import org.dromara.sms4j.api.entity.SmsResponse;
|
||||||
|
import org.dromara.sms4j.comm.enumerate.SupplierType;
|
||||||
|
import org.dromara.sms4j.core.config.SupplierFactory;
|
||||||
|
import org.dromara.sms4j.core.factory.SmsFactory;
|
||||||
|
import org.dromara.sms4j.unisms.config.UniConfig;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
public class Sms4jTest {
|
||||||
|
public static final String USER_AGENT = "uni-java-sdk" + "/0.0.4" ;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void uniSmsTest() {
|
||||||
|
UniConfig build = UniConfig.builder()
|
||||||
|
.signature("洙旭阁")
|
||||||
|
.accessKeyId("7Cr1ZaQVJQ11Ap4HBQMo7xmFg")
|
||||||
|
.templateId("2001")
|
||||||
|
.templateName("message")
|
||||||
|
.isSimple(true)
|
||||||
|
.build();
|
||||||
|
SupplierFactory.setUniConfig(build);
|
||||||
|
|
||||||
|
SmsResponse smsResponse = SmsFactory.createSmsBlend(SupplierType.UNI_SMS).sendMessage("17531165952", "123123");
|
||||||
|
System.out.println(smsResponse);
|
||||||
|
// UniResponse sms = UniSMS.buildMessage().setTo("17531165952").setSignature("洙旭阁").setTemplateId("2001").setTemplateData(map).send();
|
||||||
|
// System.out.println(sms);
|
||||||
|
// Uni.getClient().request("sms.message.send",mes)
|
||||||
|
// UniClient.request()
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,41 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-tencent</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
<name>sms4j-tencent</name>
|
|
||||||
<description>sms4j-tencent</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.tencentcloudapi</groupId>
|
|
||||||
<artifactId>tencentcloud-sdk-java</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>sms4j-tencent</artifactId>
|
|
||||||
<name>sms4j-tencent</name>
|
|
||||||
<description>sms4j-tencent</description>
|
|
||||||
<version>${revision}</version>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.tencentcloudapi</groupId>
|
|
||||||
<artifactId>tencentcloud-sdk-java</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1 +0,0 @@
|
|||||||
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-unisms</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
<name>sms4j-unisms</name>
|
|
||||||
<description>sms4j-unisms</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.apistd.uni</groupId>
|
|
||||||
<artifactId>uni-sdk</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>sms4j-unisms</artifactId>
|
|
||||||
<name>sms4j-unisms</name>
|
|
||||||
<description>sms4j-unisms</description>
|
|
||||||
<version>${revision}</version>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.apistd.uni</groupId>
|
|
||||||
<artifactId>uni-sdk</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1 +0,0 @@
|
|||||||
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
</parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-yunpian</artifactId>
|
|
||||||
<version>2.0.0</version>
|
|
||||||
<name>sms4j-yunpian</name>
|
|
||||||
<description>sms4j-yunpian</description>
|
|
||||||
<licenses>
|
|
||||||
<license>
|
|
||||||
<name>Apache 2</name>
|
|
||||||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
|
||||||
<distribution>repo</distribution>
|
|
||||||
<comments>A business-friendly OSS license</comments>
|
|
||||||
</license>
|
|
||||||
</licenses>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
<relativePath>../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>sms4j-yunpian</artifactId>
|
|
||||||
<name>sms4j-yunpian</name>
|
|
||||||
<description>sms4j-yunpian</description>
|
|
||||||
<version>${revision}</version>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-comm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara.sms4j</groupId>
|
|
||||||
<artifactId>sms4j-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
||||||
@ -1 +0,0 @@
|
|||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user