我们在项目中经常遇到 需要通过手机号发送验证码实现登录注册等功能。
这里讲一下,Springboot项目中如果通过阿里云的短信功能, 实现发送手机验证码并验证
一、准备工作
1、购买阿里云的短信服务
https://free.aliyun.com/product/cloudcommunication-free-trial
新用户有免费试用产品
个人使用的话,有3个月内100条的免费服务,如果学习的话,足够用了,否则还需要充钱!!!
2、购买后,设置 AccessKey
阿里云会自动获取绑定的手机号,你只需要获取短信验证码就可以创建成功。
3、设置签名
4、添加模板
开发
开发者可以按照阿里云的这个开发者手册开发。
https://help.aliyun.com/document_detail/101300.html?spm=a2c4g.11186623.6.610.5ed850a4DjrhHY
发送短信这个接口如何调用? 这个网址还提供了调试功能,很方便。
https://help.aliyun.com/document_detail/101414.html?spm=a2c4g.11186623.6.624.15b85f30AyGxea
我们可以直接调用 阿里云为我们提供的API
这里只用自定义的方法
1、导入依赖
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.3</version>
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>1.1.0</version>
</dependency>
2、编写工具类
这里自定义工具类进行使用
/*** description:** @author su* @date 2022/2/15 14:41*/
@Component
public class SMSUtils {private static final Logger log = LoggerFactory.getLogger(SMSUtils.class);@Value("${sms.accessKeyId}")private String accessKeyId;@Value("${sms.secret}")private String secret;@Value("${sms.signName}")private String signName; // 短信签名@Value("${sms.templateCode}")private String templateCode; //短信模板@Value("${sms.regionId}")private String regionId; // 短信服务器区域public void sendMsg(String phone, String code) {DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, secret);DefaultAcsClient client = new DefaultAcsClient(profile);CommonRequest request = new CommonRequest();request.setSysMethod(MethodType.POST);//下面两个不能动request.setSysProduct("Dysmsapi");request.setSysDomain("dysmsapi.aliyuncs.com");request.setSysVersion("2017-05-25");request.setSysAction("SendSms");//自定义参数(手机号,验证码,签名,模板)request.putQueryParameter("RegoinId", regionId);request.putQueryParameter("PhoneNumbers", phone);request.putQueryParameter("SignName", signName); //填自己申请的名称request.putQueryParameter("TemplateCode", templateCode);request.putQueryParameter("TemplateParam", "{\"code\":\"" + code + "\"}");try {CommonResponse response = client.getCommonResponse(request);log.info("阿里云短信响应信息:" + response.getData());boolean success = response.getHttpResponse().isSuccess();log.info("短信发送是否成功:" + success);} catch (ClientException e) {e.printStackTrace();}}
}
这些变量放在配置文件中,方便维护
sms:accessKeyId: LTAI5tGF2kkoJbB9ftdH2DwTsecret: YYc2CShh6RVZmMuhQzifAXS5WimvuIsignName: 青橙小店templateCode: SMS_217145407regionId: cn-hangzhou
@RestController
@RequestMapping("admin")
public class UserController {private static final Logger log = LoggerFactory.getLogger(UserController.class);@Autowiredprivate RedisTemplate redisTemplate;@Autowiredpublic SMSUtils smsUtils;@PostMapping("/code")public void sendMsg(@RequestBody MsgVo msgVo) {if (redisTemplate.hasKey("TOMEOUT:" + msgVo.getPhone())) {throw new RuntimeException("不允许重复发送");}String code = RandomStringUtils.randomNumeric(4);log.info("发送的验证码:{}" + code);smsUtils.sendMsg(msgVo.getPhone(), code);redisTemplate.opsForValue().set(msgVo.getPhone(), code, 60, TimeUnit.SECONDS);redisTemplate.opsForValue().set("TOMEOUT:" + msgVo.getPhone(), true, 10, TimeUnit.MINUTES);}
}
启动测试