!124 接入鼎众短信,修复JavaSE配置对象启动未经过拦截器处理的问题

Merge pull request !124 from sh1yu/dev-3.0.x
This commit is contained in:
风如歌 2023-12-27 10:37:30 +00:00 committed by Gitee
commit d359a1070a
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
9 changed files with 333 additions and 0 deletions

View File

@ -55,4 +55,9 @@ public abstract class SupplierConstant {
*/
public static final String LIANLU = "lianlu";
/**
* 鼎众
*/
public static final String DINGZHONG = "dingzhong";
}

View File

@ -24,6 +24,7 @@ import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.core.proxy.processor.*;
import org.dromara.sms4j.core.proxy.SmsProxyFactory;
import org.dromara.sms4j.ctyun.config.CtyunFactory;
import org.dromara.sms4j.dingzhong.config.DingZhongFactory;
import org.dromara.sms4j.emay.config.EmayFactory;
import org.dromara.sms4j.huawei.config.HuaweiFactory;
import org.dromara.sms4j.javase.util.YamlUtils;
@ -39,6 +40,12 @@ import org.dromara.sms4j.unisms.config.UniFactory;
import org.dromara.sms4j.yunpian.config.YunPianFactory;
import org.dromara.sms4j.zhutong.config.ZhutongFactory;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -99,6 +106,33 @@ public class SEInitializer {
if (CollUtil.isEmpty(configList)) {
return;
}
try{
Map<String, Map<String, Object>> blends = new HashMap<>();
for (SupplierConfig supplierConfig : configList) {
Map<String, Object> param = new HashMap<>();
String channel = supplierConfig.getSupplier();
Class<? extends SupplierConfig> clazz = supplierConfig.getClass();
BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
Method readMethod = propertyDescriptor.getReadMethod();
Object item = readMethod.invoke(supplierConfig);
param.put(propertyDescriptor.getName(),item);
}
blends.put(channel,param);
}
//持有初始化配置信息
EnvirmentHolder.frozenEnvirmet(smsConfig, blends);
//注册执行器实现
SmsProxyFactory.addProcessor(new RestrictedProcessor());
SmsProxyFactory.addProcessor(new BlackListProcessor());
SmsProxyFactory.addProcessor(new BlackListRecordingProcessor());
SmsProxyFactory.addProcessor(new SingleBlendRestrictedProcessor());
SmsProxyFactory.addProcessor(new CoreMethodParamValidateProcessor());
}catch (Exception e){
log.error("配置对象转换配置信息失败但不影响基础功能的使用。【注意】未加载SMS4J扩展功能模块拦截器参数校验可能失效");
}
for (SupplierConfig supplierConfig : configList) {
SmsFactory.createSmsBlend(supplierConfig);
}
@ -194,6 +228,7 @@ public class SEInitializer {
ProviderFactoryHolder.registerFactory(YunPianFactory.instance());
ProviderFactoryHolder.registerFactory(ZhutongFactory.instance());
ProviderFactoryHolder.registerFactory(LianLuFactory.instance());
ProviderFactoryHolder.registerFactory(DingZhongFactory.instance());
if (SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) {
ProviderFactoryHolder.registerFactory(JdCloudFactory.instance());
}

View File

@ -0,0 +1,45 @@
package org.dromara.sms4j.dingzhong.config;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.sms4j.comm.constant.SupplierConstant;
import org.dromara.sms4j.provider.config.BaseConfig;
/**
* @author Wind
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class DingZhongConfig extends BaseConfig {
/**
* 模板变量名称
*/
private String templateName;
/**
* 请求地址
*/
private String requestUrl = "http://demoapi.321sms.com:8201";
/**
* 基础接口名称
*/
private String baseAction = "Sms/SendSms";
/**
* 模板接口名称
*/
private String templateAction = "Sms/SendTemplateSms";
/**
* 获取供应商
*
* @since 3.0.0
*/
@Override
public String getSupplier() {
return SupplierConstant.DINGZHONG;
}
}

View File

@ -0,0 +1,48 @@
package org.dromara.sms4j.dingzhong.config;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.sms4j.comm.constant.SupplierConstant;
import org.dromara.sms4j.dingzhong.service.DingZhongSmsImpl;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
/**
* DingZhongFactory
* <p> 鼎众对象建造者
*
* @author :Sh1yu
* 2023/12/26 14:54
**/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class DingZhongFactory extends AbstractProviderFactory<DingZhongSmsImpl, DingZhongConfig> {
private static final DingZhongFactory INSTANCE = new DingZhongFactory();
/**
* 获取建造者实例
* @return 建造者实例
*/
public static DingZhongFactory instance() {
return INSTANCE;
}
/**
* 创建短信实现对象
* @param dingZhongConfig 短信配置对象
* @return 短信实现对象
*/
@Override
public DingZhongSmsImpl createSms(DingZhongConfig dingZhongConfig) {
return new DingZhongSmsImpl(dingZhongConfig);
}
/**
* 获取供应商
* @return 供应商
*/
@Override
public String getSupplier() {
return SupplierConstant.DINGZHONG;
}
}

View File

@ -0,0 +1,91 @@
package org.dromara.sms4j.dingzhong.service;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.comm.constant.SupplierConstant;
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
import org.dromara.sms4j.comm.utils.SmsUtils;
import org.dromara.sms4j.dingzhong.config.DingZhongConfig;
import org.dromara.sms4j.dingzhong.util.DingZhongHelper;
import org.dromara.sms4j.provider.service.AbstractSmsBlend;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;
/**
* <p>类名: DingZhongSmsImpl
* <p>说明 鼎众短信实现
*
* @author :Sh1yu
* 2023/12/26 17:16
**/
@Slf4j
public class DingZhongSmsImpl extends AbstractSmsBlend<DingZhongConfig> {
/**
* DingZhongSmsImpl
* <p>构造器用于构造短信实现模块
*
* @author :Sh1yu
*/
public DingZhongSmsImpl(DingZhongConfig config, Executor pool, DelayedTime delayedTime) {
super(config, pool, delayedTime);
}
/**
* DingZhongSmsImpl
* <p>构造器用于构造短信实现模块
*/
public DingZhongSmsImpl(DingZhongConfig config) {
super(config);
}
@Override
public String getSupplier() {
return SupplierConstant.DINGZHONG;
}
@Override
public SmsResponse sendMessage(String phone, String message) {
DingZhongHelper helper = new DingZhongHelper(getConfig(), http);
Map<String, Object> paramMap = new LinkedHashMap<>(4);
paramMap.put("cdkey", getConfig().getAccessKeyId());
paramMap.put("password", getConfig().getAccessKeySecret());
paramMap.put("mobile", phone);
paramMap.put("msg", message);
return helper.smsResponse(paramMap);
}
@Override
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
return sendMessage(phone, getConfig().getTemplateId(), messages);
}
@Override
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
DingZhongHelper helper = new DingZhongHelper(getConfig(), http);
Map<String, Object> paramMap = new LinkedHashMap<>(5);
paramMap.put("cdkey", getConfig().getAccessKeyId());
paramMap.put("password", getConfig().getAccessKeySecret());
paramMap.put("mobile", phone);
paramMap.put("templateId", templateId);
JSONObject params = new JSONObject();
params.putAll(messages);
paramMap.put("msgParam", params.toString());
return helper.smsResponse(paramMap);
}
@Override
public SmsResponse massTexting(List<String> phones, String message) {
return sendMessage(SmsUtils.arrayToString(phones), message);
}
@Override
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
return sendMessage(SmsUtils.arrayToString(phones), templateId, messages);
}
}

View File

@ -0,0 +1,68 @@
package org.dromara.sms4j.dingzhong.util;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.comm.constant.Constant;
import org.dromara.sms4j.comm.exception.SmsBlendException;
import org.dromara.sms4j.comm.utils.SmsHttpUtils;
import org.dromara.sms4j.comm.utils.SmsUtils;
import org.dromara.sms4j.dingzhong.config.DingZhongConfig;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 鼎众 Helper
*
* @author sh1yu
* @since 2023/12/26 20:57
*/
@Slf4j
public class DingZhongHelper {
private final DingZhongConfig config;
private final SmsHttpUtils http;
private int retry = 0;
public DingZhongHelper(DingZhongConfig config, SmsHttpUtils http) {
this.config = config;
this.http = http;
}
public SmsResponse smsResponse(Map<String, Object> paramMap) {
String url = String.format("%s/%s", config.getRequestUrl(), SmsUtils.isEmpty(paramMap.get("templateId"))?config.getBaseAction():config.getTemplateAction());
Map<String, String> headers = new LinkedHashMap<>(2);
headers.put("Accept", Constant.ACCEPT);
headers.put("Content-Type", Constant.FROM_URLENCODED);
SmsResponse smsResponse = null;
try {
smsResponse = getResponse(http.postFrom(url, headers, paramMap));
} catch (SmsBlendException e) {
smsResponse = new SmsResponse();
smsResponse.setSuccess(false);
smsResponse.setData(e.getMessage());
}
if (smsResponse.isSuccess() || retry == config.getMaxRetries()) {
retry = 0;
return smsResponse;
}
return requestRetry(paramMap);
}
private SmsResponse requestRetry(Map<String, Object> paramMap) {
http.safeSleep(config.getRetryInterval());
retry++;
log.warn("短信第 {" + retry + "} 次重新发送");
return smsResponse(paramMap);
}
private SmsResponse getResponse(JSONObject resJson) {
SmsResponse smsResponse = new SmsResponse();
smsResponse.setSuccess("0".equals(resJson.getStr("resCode")));
smsResponse.setData(resJson);
smsResponse.setConfigId(this.config.getConfigId());
return smsResponse;
}
}

View File

@ -15,6 +15,7 @@ import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.core.proxy.processor.*;
import org.dromara.sms4j.core.proxy.SmsProxyFactory;
import org.dromara.sms4j.ctyun.config.CtyunFactory;
import org.dromara.sms4j.dingzhong.config.DingZhongFactory;
import org.dromara.sms4j.emay.config.EmayFactory;
import org.dromara.sms4j.huawei.config.HuaweiFactory;
import org.dromara.sms4j.jdcloud.config.JdCloudFactory;
@ -103,6 +104,7 @@ public class SmsBlendsInitializer {
ProviderFactoryHolder.registerFactory(YunPianFactory.instance());
ProviderFactoryHolder.registerFactory(ZhutongFactory.instance());
ProviderFactoryHolder.registerFactory(LianLuFactory.instance());
ProviderFactoryHolder.registerFactory(DingZhongFactory.instance());
if(SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) {
ProviderFactoryHolder.registerFactory(JdCloudFactory.instance());
}

View File

@ -6,6 +6,7 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.comm.constant.SupplierConstant;
import org.dromara.sms4j.comm.utils.SmsUtils;
@ -14,6 +15,7 @@ import org.dromara.sms4j.lianlu.service.LianLuSmsImpl;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
@ -241,4 +243,39 @@ class Sms4jTest {
Assert.isTrue(smsResponse.isSuccess());
}
/**
* 鼎众普通短信
*/
@Test
public void dingZhongSmsTest() {
if (StrUtil.isBlank(PHONE)) {
return;
}
SmsBlend dz = SmsFactory.getBySupplier(SupplierConstant.DINGZHONG);
LinkedHashMap<String, String> messages = new LinkedHashMap<>();
messages.put("code", SmsUtils.getRandomInt(6));
ArrayList<String> phones = new ArrayList<>();
phones.add(PHONE);
phones.add(PHONE);
SmsResponse smsResponse = dz.sendMessage(PHONE, "测试短信" + SmsUtils.getRandomInt(6));
log.info(JSONUtil.toJsonStr(smsResponse));
Assert.isTrue(smsResponse.isSuccess());
SmsResponse smsResponse1 = dz.sendMessage(PHONE, messages);
log.info(JSONUtil.toJsonStr(smsResponse1));
Assert.isTrue(smsResponse1.isSuccess());
SmsResponse smsResponse3 = dz.massTexting(phones, "测试短信" + SmsUtils.getRandomInt(6));
log.info(JSONUtil.toJsonStr(smsResponse3));
Assert.isTrue(smsResponse3.isSuccess());
SmsResponse smsResponse4 = dz.massTexting(phones, "" ,messages);
log.info(JSONUtil.toJsonStr(smsResponse4));
Assert.isTrue(smsResponse4.isSuccess());
}
}

View File

@ -16,6 +16,7 @@ import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.core.proxy.processor.*;
import org.dromara.sms4j.core.proxy.SmsProxyFactory;
import org.dromara.sms4j.ctyun.config.CtyunFactory;
import org.dromara.sms4j.dingzhong.config.DingZhongFactory;
import org.dromara.sms4j.emay.config.EmayFactory;
import org.dromara.sms4j.huawei.config.HuaweiFactory;
import org.dromara.sms4j.jdcloud.config.JdCloudFactory;
@ -101,6 +102,7 @@ public class SmsBlendsInitializer {
ProviderFactoryHolder.registerFactory(YunPianFactory.instance());
ProviderFactoryHolder.registerFactory(ZhutongFactory.instance());
ProviderFactoryHolder.registerFactory(LianLuFactory.instance());
ProviderFactoryHolder.registerFactory(DingZhongFactory.instance());
if(SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) {
ProviderFactoryHolder.registerFactory(JdCloudFactory.instance());
}