SpringBoot 阿里云发送短信验证码小例子

SpringBoot 发送短信验证码

1.创建用户信息

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

2. 打开控制台 ,点击个人头像,找到AccessKey 管理,点击打开

3.点击进入之后会看到这个,一定要保管好这个accesskey 不要泄露,选择使用子用户的

SpringBoot 阿里云发送短信验证码小例子_第1张图片

4.新建一个用户组

SpringBoot 阿里云发送短信验证码小例子_第2张图片

点击创建用户组,然后根据提示填写即可

SpringBoot 阿里云发送短信验证码小例子_第3张图片

创建完成之后点击新建的用户组进去
SpringBoot 阿里云发送短信验证码小例子_第4张图片

5. 给用户组添加权限

找到权限管理,添加权限

SpringBoot 阿里云发送短信验证码小例子_第5张图片

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

6.创建用户

SpringBoot 阿里云发送短信验证码小例子_第6张图片

根据提示填写就可以

编程访问一定要勾选上,因为我们是通过代码操作的

点击确定即可

创建用户之后点击进入会看到这个用户的所有信息
SpringBoot 阿里云发送短信验证码小例子_第7张图片

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

然后点击加入的组,将刚才创建好的用户组添加进去即可

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

2. 开通短信服务

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

2.第一次进入他会让开通短信服务,直接同意开通即可,可以自己查看计费规则及其他的信息

3.添加短信的模板

SpringBoot 阿里云发送短信验证码小例子_第8张图片

SpringBoot 阿里云发送短信验证码小例子_第9张图片

根据提示填写就可以,一定不要乱写,填写正当理由,审核未通过接着审核就行

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

4. 添加签名

SpringBoot 阿里云发送短信验证码小例子_第10张图片

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

一定要等审核通过了才可以使用

5. 找到帮助文档 打开找到SDK参考选择java的,正常公司的开发都是使用SDK方式的,这里也是使用这个方式

这个帮助文档有api参考,可以自行了解
SpringBoot 阿里云发送短信验证码小例子_第11张图片

进入官方的demo中

3.代码阶段

pom.xml 在pom.xml中导入以下依赖


    com.aliyun
    aliyun-java-sdk-core
    4.5.3



    com.alibaba
    fastjson
    1.2.73



    org.springframework.boot
    spring-boot-starter-data-redis
    2.3.2.RELEASE
先测试一下能不能使用,直接将官方的demo代码复制放到测试类中测试一下
/**
*  你自己的 accessKeyId      相当于账号
* accessSecret  在创建用户时的 accessSecret 相当于密码
*/
@Test
void contextLoads() {
    DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", "");
   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 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
@CrossOrigin
public class SendSmsApiController {

    @Autowired
    private SendSmsService sendSmsService;
    /**
     * 使用redis的模板
     */
    @Autowired
    private RedisTemplate 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 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 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
 */
@Service
public class SendSmsImpl implements SendSmsService {

    /**
     * @param phoneNum     发送的手机号
     * @param TemplateCode 短信模板的code
     * @param code         验证码
     * @return
     */
    @Override
    public boolean sendSms(String phoneNum, String TemplateCode, Map code) {
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", "");
        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  我这里使用的是本地的redis
spring:
  redis:
    host: 127.0.0.1  
    port: 6379

现在看下是不是已经发送成功了!

你可能感兴趣的:(java,springboot,后端,spring)