admin
2024-01-23 81da61b828e29b7745e1382dfbbaeb685dc083ef
fanli/src/main/java/com/yeshi/fanli/controller/client/v1/SMSController.java
@@ -1,181 +1,277 @@
package com.yeshi.fanli.controller.client.v1;
import java.io.PrintWriter;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.yeshi.utils.JsonUtil;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.exception.config.SMSException;
import com.yeshi.fanli.service.inter.user.ForbiddenUserIdentifyCodeService;
import com.yeshi.fanli.service.inter.user.SMSService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.annotation.RequestSerializableByKey;
@Controller
@RequestMapping("api/v1/sms")
public class SMSController {
   @Resource
   private SMSService smsService;
   @Resource
   private RedisManager redisManager;
   @Resource
   private UserInfoService userInfoService;
   @Resource
   private ForbiddenUserIdentifyCodeService forbiddenUserIdentifyCodeService;
   // 发送短信
   @RequestSerializableByKey(key = "#phone+'-'+#uid+'-'+#type")
   @RequestMapping(value = "sendSMS", method = RequestMethod.POST)
   public void sendMSM(AcceptData acceptData, String phone, Long uid, Integer type, PrintWriter out) {
      sendMSM(acceptData, phone, uid, type, StringUtil.Md5(phone + "-" + "-" + uid + "-" + type), out);
   }
   public void sendMSM(AcceptData acceptData, String phone, Long uid, Integer type, String key, PrintWriter out) {
      try {
         if (phone.contains("**") && uid != null && uid > 0) {
            UserInfo userInfo = userInfoService.getUserById(uid);
            if (userInfo == null) {
               out.print(JsonUtil.loadFalseResult(2, "用户不存在"));
               return;
            } else if (StringUtil.isNullOrEmpty(userInfo.getPhone())) {
               out.print(JsonUtil.loadFalseResult(3, "尚未绑定电话号码"));
               return;
            }
            phone = userInfo.getPhone();
         }
         if (!StringUtil.isMobile(phone)) {
            out.print(JsonUtil.loadFalseResult(4, "电话号码格式不正确"));
            return;
         }
         smsService.sendLoginVCode(phone, 6);
         out.print(JsonUtil.loadTrueResult("发送成功"));
      } catch (SMSException e) {
         out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
      }
   }
   /**
    * 1.5.3 登录发送短信
    *
    * @param acceptData
    * @param phone
    * @param uid
    * @param out
    */
   @RequestMapping(value = "sendMSMLogin", method = RequestMethod.POST)
   public void sendMSMLogin(AcceptData acceptData, String phone, boolean slideVerify, PrintWriter out) {
      if (phone == null || !StringUtil.isMobile(phone.replaceAll(" ", ""))) {
         out.print(JsonUtil.loadFalseResult(1, "手机号输入有误,请修改"));
         return;
      }
      phone = phone.replaceAll(" ", "");
      sendMSNnew(phone, slideVerify, 1, StringUtil.Md5(phone + "-" + acceptData.getDevice()), out);
   }
   /**
    * 1.5.3 绑定发送短信
    *
    * @param acceptData
    * @param phone
    * @param uid
    * @param out
    */
   @RequestSerializableByKey(key = "#acceptData.device+'-'+#phone")
   @RequestMapping(value = "sendMSMBind", method = RequestMethod.POST)
   public void sendMSMBind(AcceptData acceptData, String phone, boolean slideVerify, PrintWriter out) {
      if (phone == null || !StringUtil.isMobile(phone.replaceAll(" ", ""))) {
         out.print(JsonUtil.loadFalseResult(1, "手机号输入有误,请修改"));
         return;
      }
      phone = phone.replaceAll(" ", "");
      // 判断手机号码是否被封禁
      // ForbiddenUserIdentifyCode identifyCode1 =
      // forbiddenUserIdentifyCodeService
      // .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.phone,
      // phone);
      // if (identifyCode1 != null && identifyCode1.getEffective() != null &&
      // identifyCode1.getEffective()) {
      // out.print(JsonUtil.loadFalseResult(9001,"该电话号码被占用"));
      // return;
      // }
      //
      // 判断手机号码是否被封禁
      UserInfo phoneUser = userInfoService.getEffectiveUserInfoByPhone(phone);
      if (phoneUser != null) {
         out.print(JsonUtil.loadFalseResult(9001, "该电话号码被占用"));
         return;
      }
      sendMSNnew(phone, slideVerify, 2, StringUtil.Md5(phone + "-" + acceptData.getDevice()), out);
   }
   public void sendMSNnew(String phone, boolean slideVerify, int type, String key, PrintWriter out) {
      try {
         int count = 0;
         String cachekey = null;
         if (type == 1) {
            // 登录验证码
            cachekey = "sendMSNLoginCount" + phone;
         } else if (type == 2) {
            // 绑定验证码
            cachekey = "sendMSNBindCount" + phone;
         }
         if (cachekey == null) {
            out.print(JsonUtil.loadFalseResult(1, "发送失败"));
            return;
         }
         String cacheValue = redisManager.getCommonString(cachekey);
         if (!StringUtil.isNullOrEmpty(cacheValue)) {
            count = Integer.parseInt(cacheValue);
            // 限制3次
            if (count >= 3) {
               out.print(JsonUtil.loadFalseResult(3, "验证码次数超限,请稍后再试"));
               return;
            }
         }
         if (count == 2 && !slideVerify) {
            out.print(JsonUtil.loadFalseResult(2, "需要滑动验证"));
            return;
         }
         // 缓存一个小时
         count++;
         redisManager.cacheCommonString(cachekey, count + "", 60 * 60);
         if (type == 1) {
            // 登录验证码
            smsService.sendLoginVCode(phone, 4);
         } else if (type == 2) {
            // 绑定验证码
            smsService.sendBindVCode(phone, 4);
         }
         out.print(JsonUtil.loadTrueResult("发送成功"));
      } catch (SMSException e) {
         out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
      } catch (Exception e) {
         out.print(JsonUtil.loadFalseResult(1, "发送失败"));
         e.printStackTrace();
      }
   }
}
package com.yeshi.fanli.controller.client.v1;
import java.io.PrintWriter;
import javax.annotation.Resource;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.util.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.yeshi.utils.JsonUtil;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.exception.config.SMSException;
import com.yeshi.fanli.service.inter.user.ForbiddenUserIdentifyCodeService;
import com.yeshi.fanli.service.inter.user.SMSService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.util.annotation.RequestSerializableByKey;
@Controller
@RequestMapping("api/v1/sms")
public class SMSController {
    @Resource
    private SMSService smsService;
    @Resource
    private RedisManager redisManager;
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private ForbiddenUserIdentifyCodeService forbiddenUserIdentifyCodeService;
    // 发送短信
    @RequestSerializableByKey(key = "#phone+'-'+#uid+'-'+#type")
    @RequestMapping(value = "sendSMS", method = RequestMethod.POST)
    public void sendMSM(AcceptData acceptData, String phone, Long uid, Integer type, PrintWriter out) {
        if (Constant.IS_TEST) {
            out.print(JsonUtil.loadTrueResult("发送成功"));
            return;
        }
        sendMSM(acceptData, phone, uid, type, StringUtil.Md5(phone + "-" + "-" + uid + "-" + type), out);
    }
    public void sendMSM(AcceptData acceptData, String phone, Long uid, Integer type, String key, PrintWriter out) {
        try {
            if (phone.contains("**") && uid != null && uid > 0) {
                UserInfo userInfo = userInfoService.getUserById(uid);
                if (userInfo == null) {
                    out.print(JsonUtil.loadFalseResult(2, "用户不存在"));
                    return;
                } else if (StringUtil.isNullOrEmpty(userInfo.getPhone())) {
                    out.print(JsonUtil.loadFalseResult(3, "尚未绑定电话号码"));
                    return;
                }
                phone = userInfo.getPhone();
            }
            if (!StringUtil.isMobile(phone)) {
                out.print(JsonUtil.loadFalseResult(4, "电话号码格式不正确"));
                return;
            }
            smsService.sendLoginVCode(acceptData.getSystem(), phone, 6);
            out.print(JsonUtil.loadTrueResult("发送成功"));
        } catch (SMSException e) {
            out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
        }
    }
    /**
     * 1.5.3 登录发送短信
     *
     * @param acceptData
     * @param phone
     * @param out
     */
    @RequestMapping(value = "sendMSMLogin", method = RequestMethod.POST)
    public void sendMSMLogin(AcceptData acceptData, String phone, boolean slideVerify, PrintWriter out) {
        if (phone == null || !StringUtil.isMobile(phone.replaceAll(" ", ""))) {
            out.print(JsonUtil.loadFalseResult(1, "手机号输入有误,请修改"));
            return;
        }
        phone = phone.replaceAll(" ", "");
        if (Constant.IS_TEST) {
            out.print(JsonUtil.loadTrueResult("发送成功"));
            return;
        }
        sendMSNnew(acceptData.getSystem(), phone, slideVerify, 1, StringUtil.Md5(phone + "-" + acceptData.getDevice()), out);
    }
    /**
     * 1.5.3 绑定发送短信
     *
     * @param acceptData
     * @param phone
     * @param uid
     * @param out
     */
    @RequestSerializableByKey(key = "#acceptData.device+'-'+#phone")
    @RequestMapping(value = "sendMSMBind", method = RequestMethod.POST)
    public void sendMSMBind(AcceptData acceptData, String phone, boolean slideVerify, Long uid, PrintWriter out) {
        if (phone == null || !StringUtil.isMobile(phone.replaceAll(" ", ""))) {
            out.print(JsonUtil.loadFalseResult(1, "手机号输入有误,请修改"));
            return;
        }
        phone = phone.replaceAll(" ", "");
        // 判断手机号码是否被封禁
        // ForbiddenUserIdentifyCode identifyCode1 =
        // forbiddenUserIdentifyCodeService
        // .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.phone,
        // phone);
        // if (identifyCode1 != null && identifyCode1.getEffective() != null &&
        // identifyCode1.getEffective()) {
        // out.print(JsonUtil.loadFalseResult(9001,"该电话号码被占用"));
        // return;
        // }
        //
        // 判断手机号码是否被封禁
        UserInfo phoneUser = userInfoService.getEffectiveUserInfoByPhone(phone, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
        if (phoneUser != null && uid != null) {
            out.print(JsonUtil.loadFalseResult(9001, "该电话号码被占用"));
            return;
        }
        if (Constant.IS_TEST) {
            out.print(JsonUtil.loadTrueResult("发送成功"));
            return;
        }
        sendMSNnew(acceptData.getSystem(), phone, slideVerify, 2, StringUtil.Md5(phone + "-" + acceptData.getDevice()), out);
    }
    public void sendMSNnew(SystemEnum system, String phone, boolean slideVerify, int type, String key, PrintWriter out) {
        try {
            int count = 0;
            String cachekey = null;
            if (type == 1) {
                // 登录验证码
                cachekey = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSLoginCount, phone + "");
            } else if (type == 2) {
                // 绑定验证码
                cachekey = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSBindCount, phone + "");
            }
            if (cachekey == null) {
                out.print(JsonUtil.loadFalseResult(1, "发送失败"));
                return;
            }
            String cacheValue = redisManager.getCommonString(cachekey);
            if (!StringUtil.isNullOrEmpty(cacheValue)) {
                count = Integer.parseInt(cacheValue);
                // 限制3次
                if (count >= 3) {
                    out.print(JsonUtil.loadFalseResult(3, "验证码次数超限,请稍后再试"));
                    return;
                }
            }
            if (count == 2 && !slideVerify) {
                out.print(JsonUtil.loadFalseResult(2, "需要滑动验证"));
                return;
            }
            // 缓存一个小时
            count++;
            redisManager.cacheCommonString(cachekey, count + "", 60 * 60);
            if (type == 1) {
                // 登录验证码
                smsService.sendLoginVCode(system, phone, 4);
            } else if (type == 2) {
                // 绑定验证码
                smsService.sendBindVCode(system, phone, 4);
            }
            out.print(JsonUtil.loadTrueResult("发送成功"));
        } catch (SMSException e) {
            out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult(1, "发送失败"));
            e.printStackTrace();
        }
    }
    /**
     * 注销账户短信验证
     *
     * @param acceptData
     * @param uid
     * @param phone
     * @param out
     */
    @RequestMapping(value = "sendMSMRemove")
    public void sendMSMRemove(String callback, AcceptData acceptData, Long uid, String phone, PrintWriter out) {
        if (Constant.IS_TEST) {
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("发送成功"));
            return;
        }
        if (uid == null || uid <= 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        if (phone == null || !StringUtil.isMobile(phone.replaceAll(" ", ""))) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "请输入正确手机号"));
            return;
        }
        phone = phone.replaceAll(" ", "").trim();
        UserInfo userInfo = userInfoService.selectAvailableByPrimaryKey(uid);
        if (userInfo == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户不存在"));
            return;
        }
        if (!phone.equals(userInfo.getPhone())) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "请输入正确手机号"));
            return;
        }
        try {
            int count = 0;
            String cachekey = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSBindRemove, phone + "");
            String cacheValue = redisManager.getCommonString(cachekey);
            if (!StringUtil.isNullOrEmpty(cacheValue)) {
                count = Integer.parseInt(cacheValue);
                // 限制3次
                if (count >= 3) {
                    JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "验证码次数超限,请稍后再试"));
                    return;
                }
            }
            // 缓存一个小时
            count++;
            redisManager.cacheCommonString(cachekey, count + "", 60 * 60);
            // 发送验证码
            smsService.sendRemoveVCode(acceptData.getSystem(), phone, 4);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("发送成功"));
        } catch (SMSException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "发送失败"));
            e.printStackTrace();
        }
    }
    /**
     * 设备是否允许一键登录
     *
     * @param acceptData
     * @param out
     */
    @RequestMapping(value = "allowOneKeyLogin", method = RequestMethod.POST)
    public void allowOneKeyLogin(AcceptData acceptData, PrintWriter out) {
        String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.oneKeyLoginCount, StringUtil.Md5(StringUtil.isNullOrEmpty(acceptData.getUtdid()) ? acceptData.getDevice() : acceptData.getUtdid()));
        //每天只能用10次
        String value = redisManager.getCommonString(key);
        if (!StringUtil.isNullOrEmpty(value) && Integer.parseInt(value) >= 10) {
            out.print(JsonUtil.loadFalseResult("一键登录每日只能用10次"));
            return;
        }
        out.print(JsonUtil.loadTrueResult(""));
    }
}