admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/service/impl/user/SMSServiceImpl.java
@@ -1,122 +1,148 @@
package com.yeshi.fanli.service.impl.user;
import java.math.BigDecimal;
import java.util.Date;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.yeshi.fanli.dao.mybatis.SMSHistoryMapper;
import com.yeshi.fanli.entity.bus.user.SMSHistory;
import com.yeshi.fanli.exception.SMSException;
import com.yeshi.fanli.service.inter.user.SMSService;
import com.yeshi.fanli.util.AliyunSMSUtil;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TencentSMSUtil;
import net.sf.json.JSONObject;
@Service
public class SMSServiceImpl implements SMSService {
   @Resource
   private SMSHistoryMapper smsHistoryMapper;
   @Resource
   private RedisManager redisManager;
   @Override
   public String sendLoginVCode(String phone, int codeLength) throws SMSException {
      boolean limit = redisManager.isSmsFrequencyLimit(phone, SMSHistory.TYPE_LOGIN);
      if (limit)
         throw new SMSException(1001, "请过60秒再试");
      String key = StringUtil.Md5("sms-login-tencent-latest-" + phone);
      String msgCode = StringUtil.getVerifyCode(codeLength);
      // 验证码模板
      String msg = Constant.smsConfig.getSmsLogin().replace("[签名]", Constant.smsConfig.getSmsSign()).replace("[验证码]",
            msgCode);
      // 发送短信
      // 发送间隔2分钟内的采用阿里云短信发送
      if (StringUtil.isNullOrEmpty(redisManager.getCommonString(key))) {
         TencentSMSUtil.sendSingleMsg(phone, msg);
         redisManager.cacheCommonString(key, "1", 120);
      } else {
         // 发送阿里云短信
         JSONObject data = new JSONObject();
         AliyunSMSUtil.sendSingleMsg(phone, Constant.smsConfig.getAliyunLoginTemplatecode(), data.toString());
      }
      // 缓存
      redisManager.sendSms(phone, SMSHistory.TYPE_LOGIN);
      redisManager.saveSMSVCode(phone, SMSHistory.TYPE_LOGIN, msgCode);
      SMSHistory smsHistory = new SMSHistory();
      smsHistory.setContent(msg);
      smsHistory.setCreateTime(new Date());
      smsHistory.setPhone(phone);
      smsHistory.setType(SMSHistory.TYPE_LOGIN);
      smsHistoryMapper.insertSelective(smsHistory);
      return msgCode;
   }
   @Override
   public void sendBindVCode(String phone, int codeLength) throws SMSException {
      boolean limit = redisManager.isSmsFrequencyLimit(phone, SMSHistory.TYPE_BIND);
      if (limit)
         throw new SMSException(1001, "请过60秒再试");
      String msgCode = StringUtil.getVerifyCode(codeLength);
      // 验证码模板
      String msg = Constant.smsConfig.getSmsBind().replace("[签名]", Constant.smsConfig.getSmsSign()).replace("[验证码]",
            msgCode);
      // 发送短信
      TencentSMSUtil.sendSingleMsg(phone, msg);
      // 缓存
      redisManager.sendSms(phone, SMSHistory.TYPE_BIND);
      redisManager.saveSMSVCode(phone, SMSHistory.TYPE_BIND, msgCode);
      SMSHistory smsHistory = new SMSHistory();
      smsHistory.setContent(msg);
      smsHistory.setCreateTime(new Date());
      smsHistory.setPhone(phone);
      smsHistory.setType(SMSHistory.TYPE_BIND);
      smsHistoryMapper.insertSelective(smsHistory);
   }
   @Override
   public void sendExtractVCode(String phone) throws SMSException {
      boolean limit = redisManager.isSmsFrequencyLimit(phone, SMSHistory.TYPE_EXTRACT);
      if (limit)
         throw new SMSException(1001, "请过60秒再试");
      String msgCode = StringUtil.getRandomCode(6);
      String msg = Constant.smsConfig.getSmsExtract().replace("[签名]", Constant.smsConfig.getSmsSign())
            .replace("[验证码]", msgCode);
      // 发送短信
      TencentSMSUtil.sendSingleMsg(phone, msg);
      // 缓存
      redisManager.sendSms(phone, SMSHistory.TYPE_EXTRACT);
      redisManager.saveSMSVCode(phone, SMSHistory.TYPE_EXTRACT, msgCode);
   }
   @Override
   public void sendExtractSuccessMsg(String phone, BigDecimal money) throws SMSException {
      String msg = Constant.smsConfig.getSmsExtractSuccess().replace("[签名]", Constant.smsConfig.getSmsSign())
            .replace("[金额]", money.toString());
      // 发送短信
      TencentSMSUtil.sendSingleMsg(phone, msg);
   }
   @Override
   public void sendExtractFailMsg(String phone, BigDecimal money) throws SMSException {
      String msg = Constant.smsConfig.getSmsExtractFail().replace("[签名]", Constant.smsConfig.getSmsSign())
            .replace("[金额]", money.toString());
      // 发送短信
      TencentSMSUtil.sendSingleMsg(phone, msg);
   }
}
package com.yeshi.fanli.service.impl.user;
import com.yeshi.fanli.dao.mybatis.SMSHistoryMapper;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.entity.bus.user.SMSHistory;
import com.yeshi.fanli.exception.config.SMSException;
import com.yeshi.fanli.service.inter.user.SMSService;
import com.yeshi.fanli.util.*;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
@Service
public class SMSServiceImpl implements SMSService {
    @Resource
    private SMSHistoryMapper smsHistoryMapper;
    @Resource
    private RedisManager redisManager;
    @Override
    public String sendLoginVCode(SystemEnum system, String phone, int codeLength) throws SMSException {
        boolean limit = redisManager.isSmsFrequencyLimit(phone, SMSHistory.TYPE_LOGIN);
        if (limit)
            throw new SMSException(1001, "请过60秒再试");
        String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.emptyKey, StringUtil.Md5("sms-login-tencent-latest-" + phone));
        String msgCode = StringUtil.getVerifyCode(codeLength);
        // 验证码模板
        String msg = Constant.smsConfig.getSmsLogin().replace("[签名]", system.getSmsAlias()).replace("[验证码]",
                msgCode);
        if (Constant.IS_TEST)
            System.out.println(msg);
        // 发送短信
        // 发送间隔2分钟内的采用阿里云短信发送
        String cacheString = redisManager.getCommonString(key);
        if (StringUtil.isNullOrEmpty(cacheString) || Integer.parseInt(cacheString) < 2) {
            TencentSMSUtil.sendSingleMsg(phone, msg);
            redisManager.increase(key);
            redisManager.expire(key, 120);
        } else {
            redisManager.removeCommonString(key);
            // 发送阿里云短信
            JSONObject data = new JSONObject();
            data.put("code", msgCode);
            AliyunSMSUtil.sendSingleMsg(phone, Constant.smsConfig.getAliyunLoginTemplatecode(), data.toString());
        }
        // 缓存
        redisManager.sendSms(phone, SMSHistory.TYPE_LOGIN);
        redisManager.saveSMSVCode(phone, SMSHistory.TYPE_LOGIN, msgCode);
        SMSHistory smsHistory = new SMSHistory();
        smsHistory.setContent(msg);
        smsHistory.setCreateTime(new Date());
        smsHistory.setPhone(phone);
        smsHistory.setType(SMSHistory.TYPE_LOGIN);
        smsHistoryMapper.insertSelective(smsHistory);
        return msgCode;
    }
    @Override
    public void sendBindVCode(SystemEnum system, String phone, int codeLength) throws SMSException {
        boolean limit = redisManager.isSmsFrequencyLimit(phone, SMSHistory.TYPE_BIND);
        if (limit)
            throw new SMSException(1001, "请过60秒再试");
        String msgCode = StringUtil.getVerifyCode(codeLength);
        // 验证码模板
        String msg = Constant.smsConfig.getSmsBind().replace("[签名]", system.getSmsAlias()).replace("[验证码]",
                msgCode);
        // 发送短信
        TencentSMSUtil.sendSingleMsg(phone, msg);
        // 缓存
        redisManager.sendSms(phone, SMSHistory.TYPE_BIND);
        redisManager.saveSMSVCode(phone, SMSHistory.TYPE_BIND, msgCode);
        SMSHistory smsHistory = new SMSHistory();
        smsHistory.setContent(msg);
        smsHistory.setCreateTime(new Date());
        smsHistory.setPhone(phone);
        smsHistory.setType(SMSHistory.TYPE_BIND);
        smsHistoryMapper.insertSelective(smsHistory);
    }
    @Override
    public void sendRemoveVCode(SystemEnum system, String phone, int codeLength) throws SMSException {
        boolean limit = redisManager.isSmsFrequencyLimit(phone, SMSHistory.TYPE_REMVOE);
        if (limit)
            throw new SMSException(1001, "请过60秒再试");
        String msgCode = StringUtil.getVerifyCode(codeLength);
        // 验证码模板
        String msg = Constant.smsConfig.getSmsBind().replace("[签名]", system.getSmsAlias()).replace("[验证码]",
                msgCode);
        // 发送短信
        TencentSMSUtil.sendSingleMsg(phone, msg);
        // 缓存
        redisManager.sendSms(phone, SMSHistory.TYPE_REMVOE);
        redisManager.saveSMSVCode(phone, SMSHistory.TYPE_REMVOE, msgCode);
        SMSHistory smsHistory = new SMSHistory();
        smsHistory.setContent(msg);
        smsHistory.setCreateTime(new Date());
        smsHistory.setPhone(phone);
        smsHistory.setType(SMSHistory.TYPE_REMVOE);
        smsHistoryMapper.insertSelective(smsHistory);
    }
    @Override
    public void sendExtractVCode(SystemEnum system, String phone) throws SMSException {
        boolean limit = redisManager.isSmsFrequencyLimit(phone, SMSHistory.TYPE_EXTRACT);
        if (limit)
            throw new SMSException(1001, "请过60秒再试");
        String msgCode = StringUtil.getRandomCode(6);
        String msg = Constant.smsConfig.getSmsExtract().replace("[签名]", system.getSmsAlias())
                .replace("[验证码]", msgCode);
        // 发送短信
        TencentSMSUtil.sendSingleMsg(phone, msg);
        // 缓存
        redisManager.sendSms(phone, SMSHistory.TYPE_EXTRACT);
        redisManager.saveSMSVCode(phone, SMSHistory.TYPE_EXTRACT, msgCode);
    }
    @Override
    public void sendExtractSuccessMsg(SystemEnum system, String phone, BigDecimal money) throws SMSException {
        String msg = Constant.smsConfig.getSmsExtractSuccess().replace("[签名]", system.getSmsAlias())
                .replace("[金额]", money.toString());
        // 发送短信
        TencentSMSUtil.sendSingleMsg(phone, msg);
    }
    @Override
    public void sendExtractFailMsg(SystemEnum system, String phone, BigDecimal money) throws SMSException {
        String msg = Constant.smsConfig.getSmsExtractFail().replace("[签名]", system.getSmsAlias())
                .replace("[金额]", money.toString());
        // 发送短信
        TencentSMSUtil.sendSingleMsg(phone, msg);
    }
}