网站搭建实操五后台管理-短信模块阿里云短信注册阿里云短信获取AccessKey短信模块完整流程图pom配置文件读取配置工具类dtocontroller实现类源码阿里云短信用户登陆注册可以使用短信我这使用阿里云短信注册阿里云短信登录阿里云找到短信服务进入后需要完成五步1.申请资质2.申请签名3.申请模板4.系统设置5.发送短信以前个人可以申请但是现在个人需要绑定企业所以我们申请【短信认证】产品选择开通2023年以前的版本不适配需要升级可以查看操作指南和api文档可以看到免费赠送的签名短信模板然后绑定手机号去测试使用登录注册模板点击发起调用后手机就会收到验证码获取AccessKey鼠标悬停右上角头像点击 AccessKey我们需要访问API自定义名称后点击执行认证完成后生成AccessKey ID和AccessKey Secret这两个在调用api会会用到短信模块完整流程图pom?xml version1.0encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdforum-backend/artifactIdgroupIdorg.example/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdforum-sms/artifactIddescription微服务论坛系统-短信模块/descriptiondependencies!--阿里云短信服务SDK--dependencygroupIdcom.aliyun/groupIdartifactIdaliyun-java-sdk-core/artifactIdversion4.6.0/version/dependencydependencygroupIdcom.aliyun/groupIdartifactIdaliyun-java-sdk-dysmsapi/artifactIdversion2.2.1/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!--BeanValidation--dependencygroupIdjavax.validation/groupIdartifactIdvalidation-api/artifactId/dependencydependencygroupIdorg.example/groupIdartifactIdforum-common/artifactIdversion1.0-SNAPSHOT/versionscopecompile/scope/dependency/dependencies/project配置文件server:port:8084spring:application:name:forum-sms # 阿里云短信配置 aliyun:sms:access-key-id:${ALIYUN_SMS_ACCESS_KEY_ID}access-key-secret:${ALIYUN_SMS_ACCESS_KEY_SECRET}sign-name:论坛APPtemplate-code:SMS_123456789region-id:cn-hangzhou domain:dysmsapi.aliyuncs.com version:2017-05-25# 验证码有效期秒 code-expire-seconds:300# 发送频率限制秒 send-rate-limit-seconds:60accessKey和secret可以直接写在配置中也可以配置在服务器环境变量中在服务器上设置环境变量推荐exportALIYUN_SMS_ACCESS_KEY_IDLTAI5txxxxxxxxxxxxexportALIYUN_SMS_ACCESS_KEY_SECRETxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx读取配置packagecom.forum.sms.config;importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.Configuration;/** * 阿里云短信配置类 */DataConfigurationConfigurationProperties(prefixaliyun.sms)publicclassSmsConfig{privateStringaccessKeyId;privateStringaccessKeySecret;privateStringsignName;privateStringtemplateCode;privateStringregionIdcn-hangzhou;privateStringdomaindysmsapi.aliyuncs.com;privateStringversion2017-05-25;privateIntegercodeExpireSeconds300;privateIntegersendRateLimitSeconds60;}工具类packagecom.forum.sms.config.utils;importcom.forum.common.exception.BusinessException;importcom.forum.common.utils.RedisUtils;importcom.forum.sms.config.SmsConfig;importlombok.RequiredArgsConstructor;importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Component;importcom.aliyuncs.CommonRequest;importcom.aliyuncs.CommonResponse;importcom.aliyuncs.DefaultAcsClient;importcom.aliyuncs.IAcsClient;importcom.aliyuncs.exceptions.ClientException;importcom.aliyuncs.http.MethodType;importcom.aliyuncs.profile.DefaultProfile;/** * 阿里云短信工具类 * * 功能封装阿里云短信SDK调用 * 流程生成验证码 → 存入Redis → 调用阿里云API发送短信 */Slf4jComponentRequiredArgsConstructorpublicclassSmsUtils{privatefinalSmsConfigsmsConfig;privatefinalRedisUtilsredisUtils;privatestaticfinalStringACTION_SEND_SMSSendSms;privatestaticfinalStringREDIS_CODE_PREFIXsms:code:;privatestaticfinalStringREDIS_RATE_LIMIT_PREFIXsms:rate:;/** * 发送短信验证码 * * param phone 手机号 * return 验证码 */publicStringsendSmsCode(Stringphone){// 1. 频率限制检查checkRateLimit(phone);// 2. 生成6位随机验证码StringcodegenerateCode();// 3. 调用阿里云发送短信booleansuccesssendSms(phone,code);if(success){// 4. 将验证码存入Redis设置过期时间StringredisKeyREDIS_CODE_PREFIXphone;redisUtils.set(redisKey,code,smsConfig.getCodeExpireSeconds(),java.util.concurrent.TimeUnit.SECONDS);// 5. 记录发送频率限制StringrateLimitKeyREDIS_RATE_LIMIT_PREFIXphone;redisUtils.set(rateLimitKey,1,smsConfig.getSendRateLimitSeconds(),java.util.concurrent.TimeUnit.SECONDS);log.info(短信验证码发送成功: phone{}, code{},phone,code);returncode;}thrownewBusinessException(短信发送失败请稍后重试);}/** * 校验验证码 */publicbooleanverifyCode(Stringphone,Stringcode){StringredisKeyREDIS_CODE_PREFIXphone;StringcachedCode(String)redisUtils.get(redisKey);if(cachedCodenull){thrownewBusinessException(验证码已过期请重新获取);}if(!cachedCode.equals(code)){thrownewBusinessException(验证码错误);}// 验证成功后删除验证码防止重复使用redisUtils.delete(redisKey);returntrue;}/** * 调用阿里云API发送短信 */privatebooleansendSms(Stringphone,Stringcode){try{// 创建客户端DefaultProfileprofileDefaultProfile.getProfile(smsConfig.getRegionId(),smsConfig.getAccessKeyId(),smsConfig.getAccessKeySecret());IAcsClientclientnewDefaultAcsClient(profile);// 构建请求CommonRequestrequestnewCommonRequest();request.setSysMethod(MethodType.POST);request.setSysDomain(smsConfig.getDomain());request.setSysVersion(smsConfig.getVersion());request.setSysAction(ACTION_SEND_SMS);// 设置参数request.putQueryParameter(RegionId,smsConfig.getRegionId());request.putQueryParameter(PhoneNumbers,phone);request.putQueryParameter(SignName,smsConfig.getSignName());request.putQueryParameter(TemplateCode,smsConfig.getTemplateCode());request.putQueryParameter(TemplateParam,{\code\:\code\});// 发送请求CommonResponseresponseclient.getCommonResponse(request);Stringdataresponse.getData();log.debug(阿里云短信响应: {},data);// 解析响应returndata!nulldata.contains(\Code\:\OK\);}catch(ClientExceptione){log.error(阿里云短信发送失败: {},e.getMessage(),e);returnfalse;}}/** * 频率限制检查 */privatevoidcheckRateLimit(Stringphone){StringrateLimitKeyREDIS_RATE_LIMIT_PREFIXphone;ObjectrateLimitredisUtils.get(rateLimitKey);if(rateLimit!null){thrownewBusinessException(发送过于频繁请smsConfig.getSendRateLimitSeconds()秒后再试);}}/** * 生成6位随机验证码 */privateStringgenerateCode(){intcode(int)((Math.random()*91)*100000);returnString.valueOf(code);}}dtoDatapublicclassSmsSendDTO{NotBlank(message手机号不能为空)Pattern(regexp^1[3-9]\\d{9}$,message手机号格式不正确)privateStringphone;privateStringtypelogin;// login:登录注册, reset:找回密码}packagecom.forum.sms.config.dto;importlombok.Data;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.Pattern;DatapublicclassSmsVerifyDTO{NotBlank(message手机号不能为空)Pattern(regexp^1[3-9]\\d{9}$,message手机号格式不正确)privateStringphone;NotBlank(message验证码不能为空)Pattern(regexp^\\d{6}$,message验证码必须是6位数字)privateStringcode;}controllerpackagecom.forum.sms.config.controller;importcom.forum.common.result.Result;importcom.forum.sms.config.dto.SmsSendDTO;importcom.forum.sms.config.dto.SmsVerifyDTO;importcom.forum.sms.config.service.SmsService;importio.swagger.annotations.Api;importio.swagger.annotations.ApiOperation;importlombok.RequiredArgsConstructor;importlombok.extern.slf4j.Slf4j;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.validation.Valid;importstaticcom.forum.common.result.Result.success;Slf4jApi(tags短信服务)RestControllerRequestMapping(/api/sms)RequiredArgsConstructorpublicclassSmsController{privatefinalSmsServicesmsService;ApiOperation(发送验证码)PostMapping(/send)publicResultVoidsendCode(ValidRequestBodySmsSendDTOdto){smsService.sendCode(dto);returnsuccess();}ApiOperation(校验验证码)PostMapping(/verify)publicResultVoidverifyCode(ValidRequestBodySmsVerifyDTOdto){smsService.verifyCode(dto);returnsuccess();}}实现类packagecom.forum.sms.config.service.impl;importcom.forum.sms.config.dto.SmsSendDTO;importcom.forum.sms.config.dto.SmsVerifyDTO;importcom.forum.sms.config.service.SmsService;importcom.forum.sms.config.utils.SmsUtils;importlombok.RequiredArgsConstructor;importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Service;Slf4jServiceRequiredArgsConstructorpublicclassSmsServiceImplimplementsSmsService{privatefinalSmsUtilssmsUtils;OverridepublicvoidsendCode(SmsSendDTOdto){log.info(发送短信验证码: phone{}, type{},dto.getPhone(),dto.getType());smsUtils.sendSmsCode(dto.getPhone());}OverridepublicvoidverifyCode(SmsVerifyDTOdto){log.info(校验短信验证码: phone{},dto.getPhone());smsUtils.verifyCode(dto.getPhone(),dto.getCode());}}源码https://gitee.com/qfp17393120407/forum