SpringBoot 发送短信验证码

1.创立用户信息

1.申请一个阿里云的账号

2. 关上控制台 ,点击个人头像,找到AccessKey 治理,点击关上

3.点击进入之后会看到这个,肯定要保存好这个accesskey 不要泄露,抉择应用子用户的

4.新建一个用户组

点击创立用户组,而后依据提醒填写即可

创立实现之后点击新建的用户组进去

5. 给用户组增加权限

找到权限治理,增加权限

输出SMS点击治理短信服务,跳到有边,点击确定即可

6.创立用户


依据提醒填写就能够

编程拜访肯定要勾选上,因为咱们是通过代码操作的

点击确定即可

创立用户之后点击进入会看到这个用户的所有信息

这里的accesskeyid accessSecret 肯定要妥善保存,因为一旦创立了用户之后就看不到明码了,如果泄露,要即便禁用或者删除

而后点击退出的组,将方才创立好的用户组增加进去即可

该子用户会继承用户组的权限

2. 开明短信服务

1. 在控制台首页间接搜寻短信服务 即可 ,点击进入

2.第一次进入他会让开明短信服务,间接批准开明即可,能够本人查看计费规定及其他的信息

3.增加短信的模板

依据提醒填写就能够,肯定不要乱写,填写正当理由,审核未通过接着审核就行

${code}这个肯定要有,不要批改他,要通过这个将验证码的变量传进去

4. 增加签名

第一次进去的时候验证码是能够选用的,选用验证码就行,因为我申请过了,所以不能在抉择了

肯定要等审核通过了才能够应用

5. 找到帮忙文档 关上找到SDK参考抉择java的,失常公司的开发都是应用SDK形式的,这里也是应用这个形式

这个帮忙文档有api参考,能够自行理解

进入官网的demo中

3.代码阶段

pom.xml 在pom.xml中导入以下依赖
<!--导入依赖sms  发送短信的外围依赖--><dependency>    <groupId>com.aliyun</groupId>    <artifactId>aliyun-java-sdk-core</artifactId>    <version>4.5.3</version></dependency><!--FastJson 对于数据的解决的依赖--><dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson</artifactId>    <version>1.2.73</version></dependency><!--redis  因为短信验证码都是几分钟后无奈应用,所以放在redis中--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-redis</artifactId>    <version>2.3.2.RELEASE</version></dependency>
先测试一下能不能应用,间接将官网的demo代码复制放到测试类中测试一下
/*** <accessKeyId> 你本人的 accessKeyId      相当于账号* accessSecret  在创立用户时的 accessSecret 相当于明码*/@Testvoid contextLoads() {    DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");   IAcsClient client = new DefaultAcsClient(profile);        //构建申请        CommonRequest request = new CommonRequest();        request.setSysMethod(MethodType.POST);        request.setSysDomain("dysmsapi.aliyuncs.com");//不能改 改了就会报错        request.setSysVersion("2017-05-25");//不能改  改了就会报错         request.setSysAction("SendSms");//个别也不会该改        //自定义的参数(手机号,验证码,模板,签名)        //参数名称不要乱写        //手机号        request.putQueryParameter("PhoneNumbers", "承受短信的手机号");        //签名名称        request.putQueryParameter("SignName", "方才定义好的签名名称");        //模板code        request.putQueryParameter("TemplateCode", "自定义短信模板的模板CODE编码");        //构建一个短信验证码        Map<String,Object> map  = new HashMap<>();        map.put("code","1234");        //将定义好的验证码放入进去        //短信验证码        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));    try {        CommonResponse response = client.getCommonResponse(request);        //控制台打印返回的信息        System.out.println(response.getData());    } catch (ServerException e) {        e.printStackTrace();    } catch (ClientException e) {        e.printStackTrace();    }}

在导包的时候肯定不要导错了,导阿里云的,有些包是重名的

测试发送短信
{"Message":"OK","RequestId":"D12E6D53-3A2B-4342-87CE-8B78C9A5A8FC","BizId":"174403396982142436^0","Code":"OK"}

在控制台看到这句话就证实短信发送胜利了

是不是曾经收到短信了!

发送短信的正式代码

controller

package com.mango.controller;import com.mango.Service.SendSmsService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;import java.util.UUID;import java.util.concurrent.TimeUnit;/** * @Author:   * @Date:     2020/8/9 22:11 * @CrossOrigin//跨域反对 */@RestController@CrossOriginpublic class SendSmsApiController {    @Autowired    private SendSmsService sendSmsService;    /**     * 应用redis的模板     */    @Autowired    private RedisTemplate<String,String> redisTemplate;    @GetMapping("/send/{phone}")    public String sendSms(@PathVariable("phone")String phone){        //调用发送短信的办法(应用redis)        //获取redis中的手机号        String code = redisTemplate.opsForValue().get(phone);        //判断以后的code的不为空        if(!StringUtils.isEmpty(code)){            return phone+":"+code +"已存在,还没有过期";        }        //否则就是没有验证码,生成验证码并且存储到redis中,设置他的过期工夫        //生成随机验证码        code = UUID.randomUUID().toString().substring(0, 4);        HashMap<String, Object> map = new HashMap<>();        map.put("code",code);        //发送短信        boolean isSend = sendSmsService.sendSms(phone, "自定义短信模板的模板CODE编码", map);        if(isSend){            //如果短信发送胜利就放入到redis中,设置5分钟之后过期            redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);            return phone+":"+code +"发送胜利";        }else {            return "发送胜利";        }    }}

service

package com.mango.Service;import java.util.Map;/** * @Author:   * @Date:     2020/8/9 22:12 */public interface SendSmsService {    /**     * @param phoneNum  发送的手机号     * @param TemplateCode  短信模板的code     * @param code          验证码     * @return     */    public boolean sendSms(String phoneNum, String TemplateCode , Map<String,Object> code);}

servcieImpl

package com.mango.Service.impl;import com.alibaba.fastjson.JSONObject;import com.aliyuncs.CommonRequest;import com.aliyuncs.CommonResponse;import com.aliyuncs.DefaultAcsClient;import com.aliyuncs.IAcsClient;import com.aliyuncs.exceptions.ClientException;import com.aliyuncs.exceptions.ServerException;import com.aliyuncs.http.MethodType;import com.aliyuncs.profile.DefaultProfile;import com.mango.Service.SendSmsService;import org.springframework.stereotype.Service;import java.util.Map;/** * @Author:   * @Date:     2020/8/9 22:12 */@Servicepublic class SendSmsImpl implements SendSmsService {    /**     * @param phoneNum     发送的手机号     * @param TemplateCode 短信模板的code     * @param code         验证码     * @return     */    @Override    public boolean sendSms(String phoneNum, String TemplateCode, Map<String, Object> code) {        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");        IAcsClient client = new DefaultAcsClient(profile);        //构建申请        CommonRequest request = new CommonRequest();        //不要改        request.setSysMethod(MethodType.POST);        //不能改 改了就会报错        request.setSysDomain("dysmsapi.aliyuncs.com");        //不能改  改了就会报错        request.setSysVersion("2017-05-25");        //个别也不会该改        request.setSysAction("SendSms");        //自定义的参数(手机号,验证码,模板,签名)        //参数名称不要乱写        //手机号        request.putQueryParameter("PhoneNumbers", phoneNum);        //签名名称        request.putQueryParameter("SignName", "方才定义好的签名名称");        //模板code        request.putQueryParameter("TemplateCode", TemplateCode);        //短信验证码        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));        try {            CommonResponse response = client.getCommonResponse(request);            //这个是他自带的判断他发送的是否胜利,胜利就间接返回            return response.getHttpResponse().isSuccess();        } catch (ServerException e) {            e.printStackTrace();        } catch (ClientException e) {            e.printStackTrace();        }        return false;    }}

application.yml

server:  port: 8090# redis  我这里应用的是本地的redisspring:  redis:    host: 127.0.0.1      port: 6379

当初看下是不是曾经发送胜利了!