package com.ruoyi.admin.service.impl;
|
|
import cn.hutool.core.util.RandomUtil;
|
import com.ruoyi.admin.entity.Order;
|
import com.ruoyi.admin.service.SendSmsService;
|
import com.ruoyi.admin.utils.SendSmsUtil;
|
import com.ruoyi.common.core.constant.Constants;
|
import com.ruoyi.common.core.constant.RedisConstants;
|
import com.ruoyi.common.core.exception.GlobalException;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* @author HJL
|
* @version 1.0
|
* @since 2024-05-31 14:45
|
*/
|
@Service
|
public class SendSmsServiceImpl implements SendSmsService {
|
|
@Resource
|
private RedisTemplate<String, Object> redisTemplate;
|
@Resource
|
private SendSmsUtil sendSmsUtil;
|
|
@Override
|
public String workerSettleSms(String phone) {
|
return sendPhoneCode(phone, RedisConstants.WORKER_SETTLE_KEY,
|
sendSmsUtil.applyId);
|
}
|
|
@Override
|
public String workerLoginSms(String phone) {
|
return sendPhoneCode(phone, RedisConstants.WORKER_APPLY_KEY,
|
sendSmsUtil.loginId);
|
}
|
|
@Override
|
public String userLoginSms(String phone) {
|
return sendPhoneCode(phone, RedisConstants.USER_LOGIN_PHONE_CODE,
|
sendSmsUtil.loginId);
|
}
|
|
@Override
|
public String dispatchOrder(Order order) {
|
// 发送验证码
|
String phone = order.getReservationPhone();
|
String[] arr = {order.getOrderNumber()};
|
sendSmsUtil.sendSms(new SendSmsUtil.SendSmsRequest(phone, sendSmsUtil.reservationId, arr));
|
return "发送成功!";
|
}
|
|
private String sendPhoneCode(String phone, String redisKey, String templateId) {
|
// 生成随机 6位数字 验证码
|
String phoneCode = RandomUtil.randomNumbers(6);
|
// 判断redis中是否存在手机验证码
|
Object phoneCodeRedis = redisTemplate.opsForValue().get(redisKey + phone);
|
if (phoneCodeRedis == null) {
|
// 将手机验证码 key: reg:用户输入的手机号码 value: 随机验证码:时间戳
|
phoneCodeRedis = phoneCode;
|
} else {
|
// redis有验证码,获取redis中value的时间戳,判断是否过期
|
long oldTime = Long.parseLong(String.valueOf(phoneCodeRedis).split(":")[1]);
|
// 没有超过1分钟的重发时间
|
if (System.currentTimeMillis() - oldTime < (long) Constants.SIXTY * Constants.ONE) {
|
throw new GlobalException("操作频繁,稍后重试!!!");
|
} else {
|
phoneCode = String.valueOf(phoneCodeRedis).split(":")[0];
|
}
|
}
|
/*
|
* 保存信息到redis
|
* key为 --> phone_code:手机号码 (phone_code表示该业务为 验证码登录)
|
* value为 --> 随机验证码:时间戳 (时间戳用于计算是否超过1分钟的重发时间)
|
*/
|
redisTemplate.opsForValue().set(redisKey + phone, phoneCode + ":" + System.currentTimeMillis(),
|
Constants.FIVE, TimeUnit.MINUTES);
|
String sendMessage = "验证码发送成功,您的验证码为:" + phoneCode + ",该验证码三分钟内有效,请及时完成登陆";
|
System.out.println(sendMessage);
|
String[] param = {phoneCode};
|
// 发送验证码
|
sendSmsUtil.sendSms(new SendSmsUtil.SendSmsRequest(phone, templateId, param));
|
return phoneCode;
|
}
|
|
}
|