SpringBoot短信发送功能
这里我采用的是阿里云提供的短信服务,且无需我们写几行代码,阿里云自动帮我们写好了代码,只需要拿来用即可
一、购买短信套餐
因为做测试用所以我是直接在官网上领的免费试用100条,公司有大需求的话也可以搜索短信服务购买短信套餐即可,一条短信也就几分钱。
二、创建用户组
创建用户组后会得到一个组,随后可以添加权限
点进用户组后我们进去权限管理搜索sms就会出现短信服务的权限,添加即可。
三、添加用户
添加了用户组之后我们还需添加用户,填写好名称(自定义),我们重点是需要勾选上编程访问,
这是我们能够通过编写代码发送短信的前提。
随后我们就会生成一个AccessKey的账号密码,这个一定到记住(拿小本本记下来,关闭后就不会再显示密码了),程序中需要用到。
随后我们可以将用户添加到用户组里,他会继承用户组的权限,我们也可以自己添加权限。
四、开通短信服务
用户测试完后我们就进入到短信模板阶段了,需要添加好签名(短信开头的名称部分)和模板(短信模板),这两个都是需要阿里云审核的所以理由要正当,一般几分钟就审核好了。
五、查看帮助文档生成代码
短信设置好后我们就可以开始编码环节了,首先我们需要查看一下帮组文档如何使用阿里云的短信服务。点进帮助文档选择SDK参考
里面就有每门编程语言的使用方法,我们选择java查看一下
这里面告诉我们需要有java环境并导入依赖就可使用了,如何使用的代码,阿里云也帮我们写好了我们只需要点进OpenAPI Explorer查看代码即可
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
OpenAPI Explorer是一个在线调试工具,可以真实测试发送短信功能,我们可以复制代码到idea中进行开发
六、编写发送短信的代码
我们在SpringBoot项目的测试方法中进行测试
首先我们需要导入阿里云的发送短信服务的依赖和json转换的依赖
(代码中密码和手机号涉及带个人隐私就没展示,可用你自己的)
<!--依赖安装阿里云Java SDK核心库。发送短信用-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<!--阿里云提供的json转换依赖 转换为json字符串-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.74</version>
</dependency>
#开启redis服务
spring.redis.host=39.99.247.62
spring.redis.port=6379
//阿里云发送短信服务 代码由阿里云短信服务平台生成,拿来用即可 配置相关个人信息
@Test
void smsMessage(){ //AccessKey ID 账号 AccessKey secret密码
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4G16F251gw8zRaePUPQo", "你自己的密码");
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", "156161123XX"); //发送给哪个手机号
request.putQueryParameter("SignName", "清峰小栈"); //自己配置的短信签名
request.putQueryParameter("TemplateCode", "SMS_205128031"); //自己配置的模板 模版CODE
//构建一个短信验证码
HashMap<String, Object> map = new HashMap<>();
map.put("code",8456);
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map)); //转换成json字符串
try {
CommonResponse response = client.getCommonResponse(request); //发送至客户端
System.out.println(response.getData());
} catch (ClientException e) {
e.printStackTrace();
}
}
运行代码即可收到验证码信息
七,真实业务开发
在真实业务开发中,我们的验证码是随机生成(可使用UUID生成),并且验证码需要保存并且过一会就要过期(存储到redis中设置过期时间)
1、导入依赖
<!--依赖安装阿里云Java SDK核心库。发送短信用-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<!--阿里云提供的json转换依赖 转换为json字符串-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.74</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
2、编写业务层代码
//接口 传入参数为电话号码,模板编号,验证码
public interface SendSms {
boolean addSendSms(String PhoneNumbers, String TemplateCode, Map code);
}
@Service
public class SendSmsImpl implements SendSms {
@Override
public boolean addSendSms(String PhoneNumbers, String TemplateCode, Map code) {
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4G16F251gw8zRaePUPQo", "你自己的密码");
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", PhoneNumbers); //发送至手机号
request.putQueryParameter("SignName", "清峰小栈"); //自己配置的短信签名
request.putQueryParameter("TemplateCode", TemplateCode); //自己配置的模板 模版CODE
//构建一个短信验证码
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code)); //转换成json字符串
try {
CommonResponse response = client.getCommonResponse(request); //发送至客户端
System.out.println(response.getData());
return response.getHttpResponse().isSuccess();//返回是否发送成功
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
}
3、编写控制器代码
@RestController
@CrossOrigin //跨域请求
public class SendSmsController {
@Autowired
SendSms sendSms;
@Autowired
RedisTemplate<String,String> redisTemplate;
@GetMapping("/sms/{phone}")
public String sendSms(@PathVariable("phone") String phone){
System.out.println(phone);
//得到电话,先看查一下redis中有无存放验证码
String code = redisTemplate.opsForValue().get(phone);
//有则返回已存在
if (!StringUtils.isEmpty(code)){
return phone+":"+code+"已存在,还没有过期!";
}else {
//没有则生成验证码,uuid随机生成四位数验证码
code = UUID.randomUUID().toString().substring(0,4); //随机生成四个数形成验证码
HashMap<String, Object> map = new HashMap<>();
map.put("code",code);
//调用方法发送信息 传入电话,模板,验证码
boolean send = sendSms.addSendSms(phone, "SMS_205128031", map);
//返回ture则发送成功
if (send){
//存入redis中并设置过期时间
redisTemplate.opsForValue().set("phone",code,5, TimeUnit.SECONDS);
return phone+":"+code+"发送成功!";
}else {
//返回false则发送失败
return "发送失败";
}
}
}
}
代码编写完成,接收前端传来的电话号码即可实现发送验证码到指定电话用户。