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

SpringBoot 发送短信验证码

1.建立用户信息

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

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

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

image

4.新建一个用户组

image

点击建立用户组,而后根据提示填写便可java

image

建立完成以后点击新建的用户组进去
imageweb

5. 给用户组添加权限

找到权限管理,添加权限redis

image

输入SMS点击管理短信服务,跳到有边,点击肯定便可spring

6.建立用户

image
image

根据提示填写就能够编程

编程访问必定要勾选上,由于咱们是经过代码操做的json

点击肯定便可api

建立用户以后点击进入会看到这个用户的全部信息
image跨域

这里的accesskeyid accessSecret 必定要妥善保管,由于一旦建立了用户以后就看不到密码了,若是泄露,要即便禁用或者删除app

而后点击加入的组,将刚才建立好的用户组添加进去便可dom

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

2. 开通短信服务

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

2.第一次进入他会让开通短信服务,直接赞成开通便可,能够本身查看计费规则及其余的信息

3.添加短信的模板

image

image

根据提示填写就能够,必定不要乱写,填写正当理由,审核未经过接着审核就行

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

4. 添加签名

image

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

必定要等审核经过了才能够使用

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

这个帮助文档有api参考,能够自行了解
image

进入官方的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 至关于密码
*/
@Test
void 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
@CrossOrigin
public 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
 */
@Service
public 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  我这里使用的是本地的redis
spring:
  redis:
    host: 127.0.0.1  
    port: 6379

如今看下是否是已经发送成功了!

相关文章
相关标签/搜索