一、准备工作
1、进入控制台,创建用户组和用户
注意:创建用户成功的时候有个文件要下载下来(账号和密码),因为以后都不会显示了,所以要保存好
2、开通短信服务(签名和模板)
二、用SpringBoot和Redis实现基本功能
1、创建一个空的SpringBoot项目,然后导入以下的依赖
<!--导入依赖-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、用Test测试以下
由于这些都是使用手册上面的源码,所以我就不仔细讲解了
package com.wu;
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 org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
@SpringBootTest
class SendsmsApplicationTests {
@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("AddSmsSign");
//自定义参数(手机号,验证码,签名,模板)
request.setSysAction("SendSms");//新版本必须加上这一句
request.putQueryParameter("PhoneNumbers", "手机号码");
request.putQueryParameter("SignName", "签名的名称");
request.putQueryParameter("TemplateCode", "模板的CODE");
//构建一个验证码
HashMap<String, Object> map = new HashMap<>();
//下面是随便搞的一个验证码,后面会随机生成
map.put("code", 22233);
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();
}
}
}
运行即可,然后你的手机上就会收到一条短信,当然了,要钱的,不过很便宜
3、封装(代码可以复用)
1、application.yml(连接Redis)
#配置redis
spring:
redis:
host: 你的Reddis的地址(本地的或者云服务器的)
port: 6379 #redis的端口号(缺省值6379)
database: 0
#设置端口号
server:
port: 9090
2、SendSms.java(业务接口)
public interface SendSms {
//电话号码,验证码
public boolean send(String phoneNum, Map<String, Object> map);
}
3、SendSmsImpl.java(实现接口)
package com.wu.service;
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 org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class SendSmsImpl implements SendSms {
@Override
public boolean send(String phoneNum, Map<String, Object> 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("AddSmsSign");
request.setSysAction("SendSms");//新版本必须加上这一句
//自定义参数(手机号,验证码,签名,模板)
request.putQueryParameter("PhoneNumbers", phoneNum);
request.putQueryParameter("SignName", "签名的名称");
request.putQueryParameter("TemplateCode", "模版的CODE");
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
return response.getHttpResponse().isSuccess();
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
}
4、SmsApiController.java(控制层)
package com.wu.controller;
import com.aliyuncs.utils.StringUtils;
import com.wu.service.SendSms;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
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;
@RestController
@CrossOrigin //跨域支持
public class SmsApiController {
@Autowired
private SendSms sendSms;
@Autowired
private RedisTemplate<String, String> redisTemplate;
@GetMapping("/send/{phone}")
public String code(@PathVariable("phone") String phone) {
//调用方法发送(模拟真 实业务 redis)
String code = redisTemplate.opsForValue().get(phone);
if (!StringUtils.isEmpty(code)) {
return phone + ":" + code + "已经存在,还没有过期!";
}
//生成验证码,并存储到redis中
code = UUID.randomUUID().toString().substring(0, 5);
HashMap<String, Object> map = new HashMap();
map.put("code", code);
boolean isSend = sendSms.send(phone, map);
if (isSend) {
//把验证码存到Redis里面,然后设置时间5分钟后失效
redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
return phone + ":" + code + "发送成功!";
} else {
return phone + ":" + code + "发送失败,请重新发送!";
}
}
}
5、启动SpringBoot并启动Redis
访问 127.0.0.1:9090\send\手机号 就行,然后你就会收到一条信息,并且你的redis里面get 手机号xxx 会有一个值