提交 1d264c8d authored 作者: renjiancai's avatar renjiancai

--no commit message

上级 7a388f0d
package com.zrqx.third.message.commons.config;
import java.util.HashMap;
import java.util.Map;
import com.zrqx.core.enums.message.MessageBusinessTypeEnum;
import com.zrqx.core.exception.BaseException;
/**
* 阿里云短信配置
* TODO 放到数据字典中维护
* @author lpf
* @date 2020-06-22
*/
public class AliConfig {
/** 产品名称:云通信短信API产品,开发者无需替换 */
public static String product = "Dysmsapi";
/** 产品域名,开发者无需替换 */
public static String domain = "dysmsapi.aliyuncs.com";
/** 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找) */
public static String accessKeyId = "LTAIEvKzhAFYvN8T";
public static String accessKeySecret = "lE7dkXvPEBDMyoar2uX2zrzOD6QUuR";
/** 必填:短信签名-可在短信控制台中找到 */
public static String signName="北京中软启信技术有限公司";
/** 业务类型对应模板id */
public static Map<String, String> TEMPLATE_CODE_MAP = new HashMap<>();
static {
TEMPLATE_CODE_MAP.put(MessageBusinessTypeEnum.REGISTER_CAPTCHA.getCode(), "SMS_145480878");
TEMPLATE_CODE_MAP.put(MessageBusinessTypeEnum.LOGIN_CAPTCHA.getCode(), "SMS_145480880");
TEMPLATE_CODE_MAP.put(MessageBusinessTypeEnum.RESET_PASSWORD_CAPTCHA.getCode(), "SMS_145480877");
// 后续扩展模板
}
/**
* 根据业务类型 查找对应的模板id
* @param key
* @return
*/
public static String getTemplateCode(String key) {
String value = TEMPLATE_CODE_MAP.get(key);
if (value == null) {
throw new BaseException("根据业务类型key:" + key + "找不到短信模板");
}
return value;
}
}
package com.zrqx.third.message.commons.constant;
import com.zrqx.core.enums.captcha.CaptchaBusinessTypeEnum;
import java.util.HashMap;
import java.util.Map;
/**
* message 常量类
* @author lpf
* @date 2020-06-19
*/
public class MessageConstant {
}
package com.zrqx.third.message.commons.model;
import lombok.Data;
/**
* @author lpf
* @date 2020-06-19
*/
@Data
public class PhoneLog {
}
package com.zrqx.third.message.controller;
import java.util.List;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.zrqx.core.enums.message.MessageBusinessTypeEnum;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* @author lpf
* @date 2020-06-19
*/
@RestController
@Api(description = "消息服务公用接口")
public class MessageController {
private static final Logger log = LoggerFactory.getLogger(MessageController.class);
@ApiOperation("获取消息发送业务方式")
@GetMapping("/business-type")
public List<MessageBusinessTypeEnum> getMessageType() {
return MessageBusinessTypeEnum.stream().collect(Collectors.toList());
}
}
package com.zrqx.third.message.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.zrqx.core.components.message.form.PhoneMessageForm;
import com.zrqx.core.util.response.CallBack;
import com.zrqx.third.message.service.phone.PhoneService;
import io.swagger.annotations.Api;
/**
* @author lpf
* @date 2020-06-22
*/
@RestController
@Api(description = "手机短信接口")
@RequestMapping("/phone")
public class PhoneController {
private static final Logger log = LoggerFactory.getLogger(PhoneController.class);
@Autowired
private PhoneService phoneService;
@PostMapping("/send-captcha")
public CallBack<String> sendPhoneCaptcha(@RequestBody PhoneMessageForm form) {
log.info("手机发送短信验证码start");
String value = phoneService.sendPhoneCaptcha(form);
log.info("手机发送短信验证码end,{}", value);
return CallBack.success(value);
}
/* @ApiOperation("手机发送短信,value即发送内容")
@GetMapping("/send")
public CallBack<?> sendPhone(PhoneMessageForm form) {
log.info("手机发送短信start");
phoneService.send(form);
log.info("手机发送短信end,{}");
return CallBack.success();
}*/
}
package com.zrqx.third.message.service;
import com.zrqx.core.components.message.form.MessageForm;
/**
* 消息发送接口
* @author lpf
* @date 2020-06-19
*/
public interface MessageService<T extends MessageForm> {
/**
* 消息发送
* @param form
*/
void send(T form);
}
package com.zrqx.third.message.service.phone;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.zrqx.core.components.message.form.PhoneMessageForm;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.util.datatype.StringUtils;
import com.zrqx.third.message.commons.config.AliConfig;
import com.zrqx.third.message.commons.model.PhoneLog;
/**
* 阿里短信服务
* @author lpf
* @date 2020-06-19
*/
@Component
public class AliPhoneServiceImpl extends BasePhoneServiceImpl {
private static final Logger log = LoggerFactory.getLogger(AliPhoneServiceImpl.class);
/** 连接超时时间 */
private String defaultConnectTimeout = "10000";
/** 读取超时时间 */
private String defaultReadTimeout = "10000";
@Override
protected void send(PhoneMessageForm form, PhoneLog phoneLog) {
// 可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", defaultConnectTimeout);
System.setProperty("sun.net.client.defaultReadTimeout", defaultReadTimeout);
//初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", AliConfig.accessKeyId, AliConfig.accessKeySecret);
try {
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", AliConfig.product, AliConfig.domain);
} catch (ClientException e) {
log.error("创建阿里短信client失败", e);
throw new BaseException("创建阿里短信client失败", e);
}
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
//必填:待发送手机号
request.setPhoneNumbers(form.getTarget());
//必填:短信签名-可在短信控制台中找到
request.setSignName(AliConfig.signName);
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(AliConfig.getTemplateCode(form.getBusinessType()));
// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam(form.getValue());
SendSmsResponse sendSmsResponse = null;
try {
sendSmsResponse = acsClient.getAcsResponse(request);
log.info("发送短信成功request:{},response:{}",request, sendSmsResponse);
} catch (ClientException e) {
log.error("发送短信失败request:" + request,e);
}
// TODO 发送结果处理
}
@Override
public String sendPhoneCaptcha(PhoneMessageForm form) {
String code = super.random(4);
if (StringUtils.isEmpty(form.getValue())) {
form.setValue("{'code':'"+ code +"'}");
}
log.info("发送短信验证码form:{}",form);
this.send(form);
return code;
}
}
package com.zrqx.third.message.service.phone;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zrqx.core.components.message.form.PhoneMessageForm;
import com.zrqx.core.exception.ValidateException;
import com.zrqx.core.util.datatype.StringUtils;
import com.zrqx.third.message.commons.model.PhoneLog;
/**
* @author lpf
* @date 2020-06-19
*/
public abstract class BasePhoneServiceImpl implements PhoneService{
private static final Logger log = LoggerFactory.getLogger(BasePhoneServiceImpl.class);
/**
* 发送短信并保存日志
* @param form
*/
@Override
public void send(PhoneMessageForm form) {
log.info("发送短信form:{}", form);
if (StringUtils.isEmpty(form.getTarget())) {
throw new ValidateException("form.target不能为空");
}
if (StringUtils.isEmpty(form.getValue())) {
throw new ValidateException("form.value不能为空");
}
PhoneLog phoneLog = new PhoneLog();
// TODO 日志未实现
log.info("短信保存日志{}", phoneLog);
log.info("发送短信start");
this.send(form, phoneLog);
}
/**
* 发送短信并更新日志
* @param form
* @param phoneLog
*/
protected abstract void send(PhoneMessageForm form, PhoneLog phoneLog);
/**
* 生成num位随机数
* @param num
* @return
*/
protected String random(int num) {
char[] str = "0123456789".toCharArray();
Random rd = new Random();
String suiji = "";
int temp = 0;
for (int i = 0; i < num; i++) {
temp = rd.nextInt(10);
suiji += str[temp];
}
return suiji;
}
}
package com.zrqx.third.message.service.phone;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zrqx.core.components.message.form.PhoneMessageForm;
import com.zrqx.third.message.commons.model.PhoneLog;
/**
* 华为云短信服务
* @author lpf
* @date 2020-06-19
*/
public class HuaweiPhoneServiceImpl extends BasePhoneServiceImpl {
private static final Logger log = LoggerFactory.getLogger(HuaweiPhoneServiceImpl.class);
@Override
protected void send(PhoneMessageForm form, PhoneLog phoneLog) {
// TODO 华为短信服务
}
@Override
public String sendPhoneCaptcha(PhoneMessageForm form) {
return null;
}
}
package com.zrqx.third.message.service.phone;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zrqx.core.components.message.form.PhoneMessageForm;
import com.zrqx.third.message.commons.model.PhoneLog;
/**
* 漫道科技短信服务
* @author lpf
* @date 2020-06-19
*/
public class ManDaoPhoneServiceImpl extends BasePhoneServiceImpl {
private static final Logger log = LoggerFactory.getLogger(ManDaoPhoneServiceImpl.class);
@Override
protected void send(PhoneMessageForm form, PhoneLog phoneLog) {
// TODO 漫道科技短信服务
}
@Override
public String sendPhoneCaptcha(PhoneMessageForm form) {
return null;
}
}
package com.zrqx.third.message.service.phone;
import com.zrqx.core.components.message.form.PhoneMessageForm;
import com.zrqx.third.message.service.MessageService;
/**
* @author lpf
* @date 2020-06-19
*/
public interface PhoneService extends MessageService<PhoneMessageForm>{
/**
* 发送手机短信验证码
* @param form
* @return
*/
String sendPhoneCaptcha(PhoneMessageForm form);
}
......@@ -55,13 +55,14 @@ public class SmsController {
request.setTemplateCode(SmsEnum.getName(smsForm.getType()));
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam("{'name':'"+smsForm.getName()+"', 'code':'"+smsForm.getCode()+"'}");
//request.setTemplateParam("{'name':'"+smsForm.getName()+"', 'code':'"+smsForm.getCode()+"'}");
request.setTemplateParam("{'code':'"+smsForm.getCode()+"'}");
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.setOutId(smsForm.getOutId());
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
sendSmsResponse.setCode(smsForm.getCode());
return sendSmsResponse;
}
......
......@@ -11,6 +11,6 @@ public class SmsConfig {
public static String accessKeyId = "LTAIEvKzhAFYvN8T";
public static String accessKeySecret = "lE7dkXvPEBDMyoar2uX2zrzOD6QUuR";
//必填:短信签名-可在短信控制台中找到
public static String signName="中软启信";
public static String signName="北京中软启信技术有限公司";
}
......@@ -2,10 +2,20 @@ package com.zrqx.third.sms.config;
public enum SmsEnum {
//用户注册code
REGIST(0,"SMS_76606370"),
//更换手机号验证验证码code
CHANGE_PHONE(1,"SMS_184220912"),
// 身份验证验证码
VERIFICATION(2,"SMS_145180881"),
// 登录确认验证码
LOGIN(3,"SMS_145480880"),
// 登录异常验证码
LOGIN_EXCEPTION(4,"SMS_145480879"),
// 用户注册验证码
REGISTER(5,"SMS_145480878"),
//修改密码code
PASSWORD(1,"SMS_76606369");
UPDATE_PASSWORD(6,"SMS_145480877"),
// 信息变更验证码
INFORMATION_CHANGE(7,"SMS_145480876");
private final Integer code;
private final String name;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论