赞
踩
@param type 短信类型
@Description: 对接阿里云短信服务实现短信发送
发送验证码类的短信时,每个号码每分钟最多发送一次,每个小时最多发送5次。其它类短信频控请参考阿里云
@Version: V1.0
*/
@RsionLock(key = “aliyunSmsService_send”, value = “#phoneNumbers”, lockTime = 2, waitTime = 2)
public Result send(String phoneNumbers, Map<String, String> map, String templateCode, String type) {
try {
//1分钟
String key1m = SMS_TIMEOUT_REDIS_KEY1M + phoneNumbers + type;
//1小时
String key1h = SMS_TIMEOUT_REDIS_KEY1H + phoneNumbers + type;
//24小时
String key24h = SMS_TIMEOUT_REDIS_KEY24H + phoneNumbers + type;
//验证手机号是否符合规则
boolean mobile = Validator.isMobile(phoneNumbers);
if (!mobile) {
return new Result().getError(SmsResultCode.VERMOBILE);
}
//验证短信模板是否为空templateCode
if (StringUtils.isBlank(templateCode)) {
return new Result().getError(SmsResultCode.VERTEMPLATECODE);
}
//每个号码每分钟最多发送1次
if (redisTemplate.hasKey(key1m)) {
//“该手机号:” + phoneNum + " 剩余:" + redisTemplate.getExpire(phoneNum) + “秒后可再次进行发送!”
return new Result().getError(MessageFormat.format(SmsResultCode.YZMERRORTIMEOUT, phoneNumbers, redisTemplate.getExpire(key1m)));
}
Boolean bolTimeOut1H = sendCount(key1h, 5, 1);
//每个小时最多发送5次
if (!bolTimeOut1H) {
return new Result().getError(SmsResultCode.VERMOBILE_TIME1H);
}
//24小时内只能发送20次
Boolean bolTimeOut24H = sendCount(key24h, 20, 24);
if (!bolTimeOut24H) {
return new Result().getError(SmsResultCode.VERMOBILE_TIME24H);
}
long l = System.currentTimeMillis();
SendSmsResponse sendSmsResponse = sendSms(phoneNumbers, JSON.toJSONString(map), templateCode);
TbuMsgSend tbuMsgSend = new TbuMsgSend();
tbuMsgSend.setC_mobile(phoneNumbers);
tbuMsgSend.setM_type(type);
tbuMsgSend.setC_result(sendSmsResponse.getCode());
tbuMsgSend.setC_result_detail(sendSmsResponse.getMessage());
tbuMsgSend.setRequestid(sendSmsResponse.getRequestId());
tbuMsgSend.setBack_up(sendSmsResponse.getBizId());
String dt = DateUtil.format(new Date(), “yyyyMMddHHmmss”);
tbuMsgSend.setCreate_time(dt);
tbuMsgSend.setUpdate_time(dt);
String code = “”;
if (map.containsKey(“code”)) {
code = map.get(“code”);
tbuMsgSend.setC_content(code);
}
if (sendSmsResponse.getCode().equals(“OK”)) {
redisTemplate.opsForList().rightPush(key1h, l + “”);
redisTemplate.opsForList().rightPush(key24h, l + “”);
// 发送成功之后往redis中存入该手机号以及验证码 并设置超时时间 1 分钟
redisTemplate.opsForValue().set(key1m, code, 1, TimeUnit.MINUTES);
//记录到数据库
insertTbuMsgSend(tbuMsgSend);
return new Result().getOk(MessageFormat.format(SmsResultCode.YZMSUCCESS, phoneNumbers), “”);
} else {
//记录到数据库
insertTbuMsgSend(tbuMsgSend);
//发送失败
return new Result().getError(sendSmsResponse.getCode(), sendSmsResponse.getMessage());
}
} catch (Exception e) {
//throw new CommonException(CodeMsg.SERVER_ERROR, SmsResultCode.ERROR);
return new Result().getError(SmsResultCode.ERROR);
}
}
public void insertTbuMsgSend(TbuMsgSend tbuMsgSend) {
try {
if (tbuMsgSend == null) {
log.error(“短信记录失败,mobile为空”);
return;
}
tbuMsgSendMapper.insertTbuMsgSend(tbuMsgSend);
log.error(“短信已记录:{}” + tbuMsgSend.getC_mobile());
} catch (Exception e) {
log.error(“短信记录失败:{}” + tbuMsgSend.getC_mobile());
}
}
/**
同一个手机号一小时内发送短讯是否超过count次
@param key key 的拼接是 key + 手机号 + 业务类型
@param count 次数
@param h 小时 必须整数
@author
*/
public Boolean sendCount(String key, int count, int h) {
Boolean boo = true;
long size = redisTemplate.opsForList().size(key);
if (size <= count) {
//redisTemplate.opsForList().rightPush(key, System.currentTimeMillis() + “”);
boo = true;
} else {
List t = redisTemplate.opsForList().range(key, 0, (int) size);
Long now = System.currentTimeMillis();
if (now - Long.valueOf(t.get(0)) > h * 60 * 60 * 1000) {
//最开始的一条距现在超过一小时就移除左边的,并添加一条
redisTemplate.opsForList().leftPop(key);
//redisTemplate.opsForList().rightPush(key, System.currentTimeMillis() + “”);
boo = true;
} else {//最左的一条也在n小时内,不能发送短信
boo = false;
}
}
return boo;
}
/**
@param phoneNumbers: 手机号
@param templateParamJson: 模板参数json {“sellerName”:“123456”,“orderSn”:“123456”}
@param templateCode: 阿里云短信模板code
@Description: 对接阿里云短信服务实现短信发送
发送验证码类的短信时,每个号码每分钟最多发送一次,每个小时最多发送5次。其它类短信频控请参考阿里云
@Date: 2019/4/18 16:35
@Version: V1.0
*/
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-FuGiHtkd-1710841939943)]
[外链图片转存中…(img-2CFPcgVb-1710841939944)]
[外链图片转存中…(img-sSXiRZzp-1710841939944)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-Zfmxkej8-1710841939944)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。