Quellcode durchsuchen

开发了发送短信验证码接口

jinshihui vor 1 Woche
Ursprung
Commit
36498cc21e

+ 40 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WeChatController.java

@@ -5,6 +5,7 @@ import cn.hutool.core.io.FileUtil;
 import cn.hutool.extra.qrcode.QrCodeUtil;
 import cn.hutool.extra.qrcode.QrConfig;
 import cn.hutool.json.JSONObject;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ylx.common.annotation.Log;
 import com.ylx.common.config.RuoYiConfig;
@@ -15,6 +16,9 @@ import com.ylx.common.core.domain.R;
 import com.ylx.common.core.domain.model.BindPhoneBody;
 import com.ylx.common.core.domain.model.PhoneLoginBody;
 import com.ylx.common.core.domain.model.WxLoginUser;
+import com.ylx.common.core.domain.model.aliyun.SMSVerificationCode;
+import com.ylx.common.core.domain.model.aliyun.SendSmsComponents;
+import com.ylx.common.core.domain.model.aliyun.SendSmsEnum;
 import com.ylx.common.core.redis.RedisCache;
 import com.ylx.common.enums.BusinessType;
 import com.ylx.common.utils.MessageUtils;
@@ -70,6 +74,10 @@ public class WeChatController extends BaseController {
     private final static String REFRESH_TOKEN = "refresh_token";
     private final static String OPEN_ID = "openid";
 
+    public static final String PHONE_VERIFICATION_CODE_KEY = "sys:clientLogin:phone:";
+
+    public static final Integer PHONE_VERIFICATION_CODE_KEY_TIME = 5;
+
     /**
      * 二维码保存路径
      */
@@ -99,9 +107,13 @@ public class WeChatController extends BaseController {
 
     @Resource
     private TJsService jsService;
+
     @Autowired
     private RedisCache redisCache;
 
+    @Autowired
+    private SendSmsComponents sendSms;
+
     /**
      * 发送验证码开关(true:调用真实发送接口,false:验证码写死123456)
      */
@@ -610,4 +622,32 @@ public class WeChatController extends BaseController {
         log.info("手机号: {} 登录成功", phone);
         return R.ok(wxUser);
     }
+
+    /**
+     * 发送短信验证码
+     *
+     * @param phone 手机号
+     * @return R<String> 发送结果
+     */
+    @GetMapping("/sendMsg")
+    @ApiOperation(value = "发送短信验证码", notes = "发送短信验证码")
+    public R<String> sendMsg(@RequestParam String phone , HttpServletRequest request) {
+        if (org.apache.commons.lang3.StringUtils.isEmpty(phone)) {
+            return R.fail("手机号不能为空");
+        }
+        Random rand = new Random();
+        // randNumber 将被赋值为一个 MIN 和 MAX 范围内的随机数
+        int randNumber = rand.nextInt(9999 - 1000 + 1) + 1000;
+        // 保存验证码到redis
+        redisCache.setCacheObject(PHONE_VERIFICATION_CODE_KEY + phone, String.valueOf(randNumber), PHONE_VERIFICATION_CODE_KEY_TIME, TimeUnit.MINUTES);
+        try {
+            SMSVerificationCode smsVerificationCode = new SMSVerificationCode(String.valueOf(randNumber));
+            String jsonString = JSON.toJSONString(smsVerificationCode);
+            sendSms.sendSms(phone, SendSmsEnum.SMS_220650023, jsonString);
+            return R.ok("发送成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return R.fail("发送失败");
+    }
 }

+ 6 - 0
nightFragrance-admin/src/main/resources/application-dev.yml

@@ -281,3 +281,9 @@ ffmpeg:
 # 高德地图
 amap:
   apiKey: 5457092e6c62b83c1b2e45dbe973d858
+
+## 阿里云短信
+aliyun:
+  api:
+    access-key-id: LTAI5tPMfiyeXCfJ2nYhx5zp
+    access-key-secret: VWP8tw3uGlKkxCbCH8ZzTrYVRsWvxj

+ 6 - 0
nightFragrance-common/pom.xml

@@ -200,6 +200,12 @@
             <artifactId>spring-boot-configuration-processor</artifactId>
             <optional>true</optional>
         </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>3.1.0</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 16 - 0
nightFragrance-common/src/main/java/com/ylx/common/core/domain/model/aliyun/AliyunApiProperties.java

@@ -0,0 +1,16 @@
+package com.ylx.common.core.domain.model.aliyun;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "aliyun.api")
+public class AliyunApiProperties {
+    //
+    private String accessKeyId;
+
+    //
+    private String accessKeySecret;
+}

+ 13 - 0
nightFragrance-common/src/main/java/com/ylx/common/core/domain/model/aliyun/SMSVerificationCode.java

@@ -0,0 +1,13 @@
+package com.ylx.common.core.domain.model.aliyun;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@AllArgsConstructor
+@Data
+public class SMSVerificationCode {
+
+    @JsonProperty(value = "code")
+    private String code;
+}

+ 66 - 0
nightFragrance-common/src/main/java/com/ylx/common/core/domain/model/aliyun/SendSmsComponents.java

@@ -0,0 +1,66 @@
+package com.ylx.common.core.domain.model.aliyun;
+
+import com.aliyun.dysmsapi20170525.Client;
+import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teaopenapi.models.Config;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class SendSmsComponents {
+    private final AliyunApiProperties properties;
+
+    /**
+     * @description: 创建请求
+     * @author: wenks
+     * @date: 2024/11/6 8:46
+     * @return:
+     **/
+    private Client createClient() throws Exception {
+        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
+        // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
+        Config config = new Config()
+                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
+                .setAccessKeyId(properties.getAccessKeyId())
+                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+                .setAccessKeySecret(properties.getAccessKeySecret());
+        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
+        config.endpoint = "dysmsapi.aliyuncs.com";
+        return new Client(config);
+    }
+
+    public void sendSms(String phoneNumber, SendSmsEnum sendSmsEnum, String templateParam) throws Exception {
+        Client client = createClient();
+        SendSmsRequest sendSmsRequest = new SendSmsRequest()
+                .setPhoneNumbers(phoneNumber)
+                .setSignName(sendSmsEnum.getSignName())
+                .setTemplateCode(sendSmsEnum.getCode())
+                .setTemplateParam(templateParam);
+
+        sendSmsData(client, sendSmsRequest);
+    }
+
+    private void sendSmsData(Client client, SendSmsRequest sendSmsRequest) {
+        try {
+            // 复制代码运行请自行打印 API 的返回值
+            client.sendSms(sendSmsRequest);
+        } catch (TeaException error) {
+            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
+            // 错误 message
+            log.info(error.getMessage());
+            // 诊断地址
+            log.info((String) error.getData().get("Recommend"));
+        } catch (Exception _error) {
+            TeaException error = new TeaException(_error.getMessage(), _error);
+            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
+            // 错误 message
+            log.info(error.getMessage());
+            // 诊断地址
+            log.info((String) error.getData().get("Recommend"));
+        }
+    }
+}

+ 17 - 0
nightFragrance-common/src/main/java/com/ylx/common/core/domain/model/aliyun/SendSmsEnum.java

@@ -0,0 +1,17 @@
+package com.ylx.common.core.domain.model.aliyun;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum SendSmsEnum {
+
+    SMS_220650023("SMS_220650023", "山西掌柜鼎科技", "验证码短信");
+
+    private final String code;
+
+    private final String signName;
+
+    private final String desc;
+}

+ 1 - 1
nightFragrance-framework/src/main/java/com/ylx/framework/config/SecurityConfig.java

@@ -111,7 +111,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                 .antMatchers("/login", "/register", "/captchaImage", "/wx/login",
                         "/api/lbt/v1/getAll", "/api/js/v1/select", "/api/xiangmu/v1/wx/getAll", "/api/order/v1/getStatus",
                         "/api/xiangmu/v1/getByid", "/api/xiangmu/v1/highlights", "/api/js/v1/wx/getByid", "/api/js/v1/wx/select", "/api/js/v1/wx/add", "/api/recharge/v1/test",
-                        "/wx/pay/payNotify", "/wx/pay/refundNotify", "/weChat/getAccessToken","/weChat/phoneLogin", "/weChat/getCode", "/weChat/verifyToken", "/sq/getAccessToken",
+                        "/wx/pay/payNotify", "/wx/pay/refundNotify", "/weChat/getAccessToken","/weChat/phoneLogin","/weChat/sendMsg", "/weChat/getCode", "/weChat/verifyToken", "/sq/getAccessToken",
                         "/area/select", "/system/dept/list", "/api/xiangmu/v1/wx/recommend", "/product/category/create","/area/code","/area/city","/product/category/list",
                         "/api/products/options","/wx/pay/query/order/{outTradeNo}","/api/products/options/service").permitAll()
                 // 静态资源,可匿名访问

+ 5 - 4
nightFragrance-framework/src/main/java/com/ylx/framework/security/handle/LogoutSuccessHandlerImpl.java

@@ -42,11 +42,12 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler {
     /**
      * 退出处理
      *
-     * @return
+     * @param request
+     * @param response
+     * @param authentication
      */
     @Override
-    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
-            throws IOException, ServletException {
+    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
         log.info("用户退出登录");
         LoginUser loginUser = tokenService.getLoginUser(request);
         if (StringUtils.isNotNull(loginUser)) {
@@ -60,9 +61,9 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler {
             log.info("微信用户退出登录");
             WxLoginUser wxUser = wxTokenService.getWxUser(request);
             if (StringUtils.isNotNull(wxUser)) {
-                String userName = wxUser.getUsername();
                 // 删除用户缓存记录
                 wxTokenService.delWxUser(wxUser.getToken());
+                String userName = wxUser.getUsername();
                 // 记录用户退出日志
                 AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, MessageUtils.message("user.logout.success")));
             }