From d615fc515fc52d6ed970c11d59a017e48de4be32 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Tue, 16 Jun 2026 16:43:58 +0800
Subject: [PATCH] 1

---
 src/main/java/com/nq/service/impl/SmsServiceImpl.java |  136 +++++++++++++++++++++++++++++++++++----------
 1 files changed, 105 insertions(+), 31 deletions(-)

diff --git a/src/main/java/com/nq/service/impl/SmsServiceImpl.java b/src/main/java/com/nq/service/impl/SmsServiceImpl.java
index ce18fed..dee4544 100644
--- a/src/main/java/com/nq/service/impl/SmsServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/SmsServiceImpl.java
@@ -1,14 +1,20 @@
 package com.nq.service.impl;
 
-
-import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
 import com.nq.common.ServerResponse;
 import com.nq.dao.SiteSmsLogMapper;
+import com.nq.dao.UserMapper;
+import com.nq.pojo.SiteInfo;
 import com.nq.pojo.SiteSmsLog;
+import com.nq.pojo.User;
+import com.nq.service.ISiteInfoService;
 import com.nq.service.ISmsService;
 import com.nq.utils.DateTimeUtil;
+import com.nq.utils.PhoneUtil;
+import com.nq.utils.PropertiesUtil;
 import com.nq.utils.redis.RedisShardedPoolUtils;
-import com.nq.utils.sms.ali.AliyunSms;
+import com.nq.utils.captcha.CaptchaUtil;
+import com.nq.utils.sms.SmsBaoClient;
+import com.nq.utils.sms.SmsConstants;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -16,46 +22,114 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
 @Service("iSmsService")
 public class SmsServiceImpl implements ISmsService {
     private static final Logger log = LoggerFactory.getLogger(SmsServiceImpl.class);
 
-
     @Autowired
     SiteSmsLogMapper siteSmsLogMapper;
 
-    public ServerResponse sendAliyunSMS(String phoneNum, String ali_template) {
-        System.out.println(phoneNum);
-        if (StringUtils.isBlank(phoneNum)) return ServerResponse.createByErrorMsg("发送失败,手机号不能为空");
+    @Autowired
+    UserMapper userMapper;
+
+    @Autowired
+    ISiteInfoService iSiteInfoService;
+
+    @Override
+    public ServerResponse sendRegSms(String phoneNum, String captchaCode, String captchaToken, HttpServletRequest request) {
+        if (!SmsConstants.isVerifyEnabled()) {
+            return ServerResponse.createBySuccess();
+        }
+        if (StringUtils.isBlank(phoneNum)) {
+            return ServerResponse.createByErrorMsg("发送失败,手机号不能为空");
+        }
+        if (!PhoneUtil.isValidChinaMobile(phoneNum)) {
+            return ServerResponse.createByErrorMsg("请输入正确的手机号码");
+        }
+        if (!verifyCaptcha(request, captchaCode, captchaToken)) {
+            return ServerResponse.createByErrorMsg("图形验证码错误");
+        }
+
+        String phone = PhoneUtil.normalizeChinaMobile(phoneNum);
+        User exist = userMapper.findByPhone(phone);
+        if (exist != null) {
+            return ServerResponse.createByErrorMsg("该手机号已注册");
+        }
+
+        String lockKey = SmsConstants.SMS_SEND_LOCK_PREFIX + phone;
+        if (StringUtils.isNotBlank(RedisShardedPoolUtils.get(lockKey))) {
+            return ServerResponse.createByErrorMsg("请60秒后再试");
+        }
 
         String yzmCode = RandomStringUtils.randomNumeric(4);
-        System.out.println("验证码:" + yzmCode);
+        String signName = resolveSignName();
+        String content = "【" + signName + "】您的验证码是" + yzmCode + "。如非本人操作,请忽略本短信";
 
-        SendSmsResponse response = null;
+        boolean sent = SmsBaoClient.send(phone, content);
+        if (!sent) {
+            return ServerResponse.createByErrorMsg("短信发送失败,请稍后重试");
+        }
+
+        String codeKey = SmsConstants.SMS_CODE_PREFIX + phone;
+        RedisShardedPoolUtils.setEx(codeKey, yzmCode, SmsConstants.SMS_CODE_TTL_SECONDS);
+        RedisShardedPoolUtils.setEx(lockKey, "1", SmsConstants.SMS_SEND_INTERVAL_SECONDS);
+
+        SiteSmsLog siteSmsLog = new SiteSmsLog();
+        siteSmsLog.setSmsPhone(phone);
+        siteSmsLog.setSmsTitle("注册验证码");
+        siteSmsLog.setSmsCnt(yzmCode);
+        siteSmsLog.setSmsTemplate("smsbao-reg");
+        siteSmsLog.setSmsStatus(Integer.valueOf(0));
+        siteSmsLog.setAddTime(DateTimeUtil.getCurrentDate());
+        siteSmsLogMapper.insert(siteSmsLog);
+
+        log.info("注册短信发送成功 phone={}", phone);
+        return ServerResponse.createBySuccessMsg("发送成功");
+    }
+
+    @Override
+    public ServerResponse sendAliyunSMS(String phoneNum, String aliTemplate) {
+        return ServerResponse.createByErrorMsg("请先完成图形验证码校验");
+    }
+
+    private boolean verifyCaptcha(HttpServletRequest request, String captchaCode, String captchaToken) {
+        if (StringUtils.isBlank(captchaCode)) {
+            return false;
+        }
+        if (StringUtils.isNotBlank(captchaToken)) {
+            boolean ok = CaptchaUtil.verifyAndRemove(captchaToken.trim(), captchaCode);
+            if (!ok) {
+                log.warn("图形验证码校验失败(Redis) token={}", captchaToken);
+            }
+            return ok;
+        }
+        if (request == null) {
+            return false;
+        }
+        HttpSession session = request.getSession();
+        String original = (String) session.getAttribute("KAPTCHA_SESSION_KEY");
+        session.removeAttribute("KAPTCHA_SESSION_KEY");
+        return StringUtils.isNotEmpty(original) && captchaCode.trim().equalsIgnoreCase(original.trim());
+    }
+
+    private String resolveSignName() {
+        String configured = PropertiesUtil.getProperty("smsbao.sign.name");
+        if (StringUtils.isNotBlank(configured)) {
+            return configured.trim();
+        }
         try {
-            response = AliyunSms.sendSms(phoneNum, "夜喵科技", ali_template, yzmCode);
+            ServerResponse resp = iSiteInfoService.get();
+            if (resp.isSuccess() && resp.getData() != null) {
+                SiteInfo siteInfo = (SiteInfo) resp.getData();
+                if (StringUtils.isNotBlank(siteInfo.getSiteName())) {
+                    return siteInfo.getSiteName().trim();
+                }
+            }
         } catch (Exception e) {
-            log.error("发送短信异常:{}", e);
+            log.warn("读取站点名称失败,使用默认短信签名", e);
         }
-        System.out.println("短信接口返回的数据----------------");
-        System.out.println("Code=" + response.getCode());
-        System.out.println("Message=" + response.getMessage());
-        System.out.println("RequestId=" + response.getRequestId());
-        System.out.println("BizId=" + response.getBizId());
-        if (response.getCode() != null && response.getCode().equals("OK")) {
-            String keys = "AliyunSmsCode:" + phoneNum;
-            RedisShardedPoolUtils.setEx(keys, yzmCode, 5400);
-            SiteSmsLog siteSmsLog = new SiteSmsLog();
-            siteSmsLog.setSmsPhone(phoneNum);
-            siteSmsLog.setSmsTitle("注册验证码");
-            siteSmsLog.setSmsCnt(yzmCode);
-            siteSmsLog.setSmsTemplate(ali_template);
-            siteSmsLog.setSmsStatus(Integer.valueOf(0));
-            siteSmsLog.setAddTime(DateTimeUtil.getCurrentDate());
-            this.siteSmsLogMapper.insert(siteSmsLog);
-            return ServerResponse.createBySuccessMsg("发送成功");
-        }
-        return ServerResponse.createByErrorMsg("短信发送失败,请重试");
+        return "滁州炬亿科技";
     }
 }

--
Gitblit v1.9.3