mirror of
https://gitee.com/dromara/sms4j.git
synced 2025-12-06 08:58:38 +08:00
commit
5eb6f95284
@ -8,7 +8,9 @@ package org.dromara.sms4j.comm.constant;
|
|||||||
* 2023/3/31 19:33
|
* 2023/3/31 19:33
|
||||||
**/
|
**/
|
||||||
public abstract class Constant {
|
public abstract class Constant {
|
||||||
/** 项目版本号*/
|
/**
|
||||||
|
* 项目版本号
|
||||||
|
*/
|
||||||
public static final String VERSION = "V 3.0.1";
|
public static final String VERSION = "V 3.0.1";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,7 +39,9 @@ public abstract class Constant {
|
|||||||
*/
|
*/
|
||||||
public static final String HUAWEI_JAVA_DATE = "yyyy-MM-dd'T'HH:mm:ss'Z'";
|
public static final String HUAWEI_JAVA_DATE = "yyyy-MM-dd'T'HH:mm:ss'Z'";
|
||||||
|
|
||||||
/** 云片短信国内短信请求地址*/
|
/**
|
||||||
|
* 云片短信国内短信请求地址
|
||||||
|
*/
|
||||||
public static final String YUNPIAN_URL = "https://sms.yunpian.com/v2";
|
public static final String YUNPIAN_URL = "https://sms.yunpian.com/v2";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -50,6 +54,11 @@ public abstract class Constant {
|
|||||||
*/
|
*/
|
||||||
public static final String SUPPLIER_KEY = "supplier";
|
public static final String SUPPLIER_KEY = "supplier";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义实现工厂路径
|
||||||
|
*/
|
||||||
|
public static final String FACTORY_PATH = "factory";
|
||||||
|
|
||||||
private Constant() {
|
private Constant() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,6 +13,11 @@ import org.dromara.sms4j.comm.exception.SmsBlendException;
|
|||||||
@Data
|
@Data
|
||||||
public abstract class BaseConfig implements SupplierConfig {
|
public abstract class BaseConfig implements SupplierConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义实现工厂路径
|
||||||
|
*/
|
||||||
|
private String factory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Access Key
|
* Access Key
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -0,0 +1,20 @@
|
|||||||
|
package org.dromara.sms4j.example.zhangjun;
|
||||||
|
|
||||||
|
import org.dromara.sms4j.core.factory.SmsFactory;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义广州掌骏短信实现
|
||||||
|
*
|
||||||
|
* @author 4n
|
||||||
|
*/
|
||||||
|
@SpringBootApplication
|
||||||
|
public class ZhangJunApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(ZhangJunApplication.class, args);
|
||||||
|
SmsFactory.getBySupplier("zhangjun").sendMessage("17*****598", "154468");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package org.dromara.sms4j.example.zhangjun;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.sms4j.comm.constant.SupplierConstant;
|
||||||
|
import org.dromara.sms4j.provider.config.BaseConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 4n
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class ZhangJunConfig extends BaseConfig {
|
||||||
|
private String appId;
|
||||||
|
private String sid;
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSupplier() {
|
||||||
|
return "zhangjun";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
package org.dromara.sms4j.example.zhangjun;
|
||||||
|
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* <p> 掌骏短信
|
||||||
|
*
|
||||||
|
* @author :4n
|
||||||
|
* 2023/10/31 14:54
|
||||||
|
**/
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class ZhangJunFactory extends AbstractProviderFactory<ZhangJunSmsImpl, ZhangJunConfig> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ZhangJunSmsImpl createSms(ZhangJunConfig ZhangJunConfig) {
|
||||||
|
return new ZhangJunSmsImpl(ZhangJunConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSupplier() {
|
||||||
|
return "zhangjun";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,111 @@
|
|||||||
|
package org.dromara.sms4j.example.zhangjun;
|
||||||
|
|
||||||
|
import cn.hutool.json.JSONObject;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.sms4j.api.entity.SmsResponse;
|
||||||
|
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
|
||||||
|
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||||
|
import org.dromara.sms4j.comm.utils.SmsUtils;
|
||||||
|
import org.dromara.sms4j.provider.service.AbstractSmsBlend;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author :4n
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
public class ZhangJunSmsImpl extends AbstractSmsBlend<ZhangJunConfig> {
|
||||||
|
|
||||||
|
private int retry = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ZhangJunSmsImpl
|
||||||
|
* <p>构造器,用于构造短信实现模块
|
||||||
|
*
|
||||||
|
* @author :Wind
|
||||||
|
*/
|
||||||
|
public ZhangJunSmsImpl(ZhangJunConfig config, Executor pool, DelayedTime delayedTime) {
|
||||||
|
super(config, pool, delayedTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ZhangJunSmsImpl
|
||||||
|
* <p>构造器,用于构造短信实现模块
|
||||||
|
*/
|
||||||
|
public ZhangJunSmsImpl(ZhangJunConfig config) {
|
||||||
|
super(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSupplier() {
|
||||||
|
return "zhangjun";
|
||||||
|
}
|
||||||
|
private LinkedHashMap<String, String> buildBody(String phone, String message){
|
||||||
|
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
||||||
|
map.put("appId", getConfig().getAppId());
|
||||||
|
map.put("sid", getConfig().getSid());
|
||||||
|
map.put("templateId", getConfig().getTemplateId());
|
||||||
|
map.put("phone", phone);
|
||||||
|
Map<String, Object> data = new HashMap<>();
|
||||||
|
data.put("code", message);
|
||||||
|
map.put("data", JSONUtil.toJsonStr(data));
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public SmsResponse sendMessage(String phone, String message) {
|
||||||
|
return sendMessage(phone, getConfig().getTemplateId(), buildBody(phone,message));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||||
|
String messageStr = JSONUtil.toJsonStr(messages);
|
||||||
|
return getSmsResponse(phone, messageStr, templateId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SmsResponse massTexting(List<String> phones, String message) {
|
||||||
|
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
||||||
|
// map.put(getConfig().getTemplateName(), message);
|
||||||
|
return massTexting(phones, getConfig().getTemplateId(), map);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||||
|
String messageStr = JSONUtil.toJsonStr(messages);
|
||||||
|
return getSmsResponse(SmsUtils.arrayToString(phones), messageStr, templateId);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SmsResponse getSmsResponse(String phone, String message, String templateId) {
|
||||||
|
try {
|
||||||
|
SmsResponse smsResponse = getResponse(http.postJson(getConfig().getUrl(), null, message));
|
||||||
|
if(smsResponse.isSuccess() || retry == getConfig().getMaxRetries()){
|
||||||
|
retry = 0;
|
||||||
|
return smsResponse;
|
||||||
|
}
|
||||||
|
return requestRetry(phone, message, templateId);
|
||||||
|
}catch (SmsBlendException e){
|
||||||
|
return requestRetry(phone, message, templateId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private SmsResponse requestRetry(String phone, String message, String templateId) {
|
||||||
|
http.safeSleep(getConfig().getRetryInterval());
|
||||||
|
retry++;
|
||||||
|
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||||
|
return getSmsResponse(phone, message, templateId);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SmsResponse getResponse(JSONObject resJson) {
|
||||||
|
SmsResponse smsResponse = new SmsResponse();
|
||||||
|
smsResponse.setSuccess("OK".equals(resJson.getStr("Code")));
|
||||||
|
smsResponse.setData(resJson);
|
||||||
|
smsResponse.setConfigId(getConfigId());
|
||||||
|
return smsResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -73,4 +73,12 @@ sms:
|
|||||||
base-url: https://app.cloopen.com:8883/2013-12-26
|
base-url: https://app.cloopen.com:8883/2013-12-26
|
||||||
access-key-id: 你的Access Key
|
access-key-id: 你的Access Key
|
||||||
access-key-secret: 你的Access Key Secret
|
access-key-secret: 你的Access Key Secret
|
||||||
sdkAppId: 你的应用ID
|
sdkAppId: 你的应用ID
|
||||||
|
#自定义广州掌骏短信,添加factory全路径。config,factory,SmsImpl复制其他默认实现即可,修改对应的supplier和发送核心逻辑即可
|
||||||
|
zhangjun:
|
||||||
|
supplier: zhangjun
|
||||||
|
factory: org.dromara.sms4j.example.zhangjun.ZhangJunFactory
|
||||||
|
templateId: d2a****777
|
||||||
|
appId: 64c52d2a****77775fe72e3
|
||||||
|
sid: d2a****777
|
||||||
|
url: https://sms.idowe.com/**/**/**/send
|
||||||
@ -1,12 +1,18 @@
|
|||||||
package org.dromara.sms4j.starter.config;
|
package org.dromara.sms4j.starter.config;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
import org.dromara.sms4j.api.SmsBlend;
|
import org.dromara.sms4j.api.SmsBlend;
|
||||||
|
import org.dromara.sms4j.comm.constant.Constant;
|
||||||
|
import org.dromara.sms4j.comm.enumerate.ConfigType;
|
||||||
import org.dromara.sms4j.provider.config.SmsConfig;
|
import org.dromara.sms4j.provider.config.SmsConfig;
|
||||||
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
|
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -23,6 +29,26 @@ public class SupplierConfig {
|
|||||||
return new LinkedHashMap<>();
|
return new LinkedHashMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnBean({SmsConfig.class})
|
||||||
|
@SneakyThrows
|
||||||
|
protected List<BaseProviderFactory<? extends SmsBlend, ? extends org.dromara.sms4j.api.universal.SupplierConfig>> factoryList(Map<String, Map<String, Object>> blends, SmsConfig smsConfig) {
|
||||||
|
//注入自定义实现工厂
|
||||||
|
List<BaseProviderFactory<? extends SmsBlend, ? extends org.dromara.sms4j.api.universal.SupplierConfig>> factoryList = new ArrayList<>();
|
||||||
|
if (ConfigType.YAML.equals(smsConfig.getConfigType())) {
|
||||||
|
for (String configId : blends.keySet()) {
|
||||||
|
Map<String, Object> configMap = blends.get(configId);
|
||||||
|
Object factoryPath = configMap.get(Constant.FACTORY_PATH);
|
||||||
|
if (ObjectUtil.isNotEmpty(factoryPath)) {
|
||||||
|
//反射创建实例
|
||||||
|
Class<BaseProviderFactory<? extends SmsBlend, ? extends org.dromara.sms4j.api.universal.SupplierConfig>> newClass = (Class<BaseProviderFactory<? extends SmsBlend, ? extends org.dromara.sms4j.api.universal.SupplierConfig>>) Class.forName(factoryPath.toString());
|
||||||
|
BaseProviderFactory<? extends SmsBlend, ? extends org.dromara.sms4j.api.universal.SupplierConfig> factory = newClass.newInstance();
|
||||||
|
factoryList.add(factory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return factoryList;
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
protected SmsBlendsInitializer smsBlendsInitializer(List<BaseProviderFactory<? extends SmsBlend, ? extends org.dromara.sms4j.api.universal.SupplierConfig>> factoryList,
|
protected SmsBlendsInitializer smsBlendsInitializer(List<BaseProviderFactory<? extends SmsBlend, ? extends org.dromara.sms4j.api.universal.SupplierConfig>> factoryList,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user