一、申请阿里云短信服务
1.
2.申请模板
3.创建accesskey(鼠标悬停在右上角头像)
二.代码实现
1.springboot引入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
2.application.yml(根据实际情况修改
aliyun.sms.accessKeyId=阿里密钥
aliyun.sms.accessKeySecret=阿里密钥
aliyun.sms.template_code=签名密钥
aliyun.sms.sign_name=签名名称(注意中文乱码)
#rabbitMQ
spring.rabbitmq.host=127.0.0.1
#redis
spring.redis.host=127.0.0.1
3.controller
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserInfoRegServiceImpl userInfoRegServiceImpl;
@RequestMapping(value="/sendsms/{mobile}",method= RequestMethod.POST)
public Result sendsms(@PathVariable String mobile ){
userInfoRegServiceImpl.sendSms(mobile);
return new Result(true, StatusCode.OK,"发送成功");
}
}
4.service
@Service
public class UserInfoRegServiceImpl {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendSms(String mobile) {
//生成6位数验证码
String checkcode = RandomStringUtils.randomNumeric(6);
//验证码存入缓存,为了注册的时候校验验证码是否正确
redisTemplate.opsForValue().set("checkcode"+mobile,checkcode,5, TimeUnit.MINUTES);
//验证码放入消息队列
Map<String,String> map = new HashMap();
map.put("mobile",mobile);
map.put("checkcode",checkcode);
rabbitTemplate.convertAndSend("sms",map);
}
}
5.短信工具类
@Component
public class SmsUtil {
//产品名称:云通信短信API产品,开发者无需替换
static final String product = "Dysmsapi";
//产品域名,开发者无需替换
static final String domain = "dysmsapi.aliyuncs.com";
@Autowired
private Environment env;
// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
/**
* 发送短信
* @param mobile 手机号
* @param template_code 模板号
* @param sign_name 签名
* @param param 参数
* @return
* @throws ClientException
*/
public SendSmsResponse sendSms(String mobile,String template_code,String sign_name,String param) throws ClientException {
String accessKeyId =env.getProperty("aliyun.sms.accessKeyId");
String accessKeySecret = env.getProperty("aliyun.sms.accessKeySecret");
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
//必填:待发送手机号
request.setPhoneNumbers(mobile);
//必填:短信签名-可在短信控制台中找到
request.setSignName(sign_name);
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(template_code);
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam(param);
//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
//request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.setOutId("yourOutId");
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse;
}
public QuerySendDetailsResponse querySendDetails(String mobile,String bizId) throws ClientException {
String accessKeyId =env.getProperty("accessKeyId");
String accessKeySecret = env.getProperty("accessKeySecret");
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
//必填-号码
request.setPhoneNumber(mobile);
//可选-流水号
request.setBizId(bizId);
//必填-发送日期 支持30天内记录查询,格式yyyyMMdd
SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
request.setSendDate(ft.format(new Date()));
//必填-页大小
request.setPageSize(10L);
//必填-当前页码从1开始计数
request.setCurrentPage(1L);
//hint 此处可能会抛出异常,注意catch
QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
return querySendDetailsResponse;
}
}
6.短信监听类
@Component
@RabbitListener(queues = "sms")
public class SmsListener {
@Autowired
private SmsUtil smsUtil;
@Value("${aliyun.sms.template_code}")
private String template_code;
@Value("${aliyun.sms.sign_name}")
private String sign_name;
@RabbitHandler
public void executeSms(Map<String,String> map){
String mobile = map.get("mobile");
String checkcode = map.get("checkcode");
try {
smsUtil.sendSms(mobile,template_code,sign_name,"{\"code\":\""+checkcode+"\"}");
} catch (ClientException e) {
e.printStackTrace();
}
}
}
7.公共类
public class Result {
private boolean flag; //是否成功
private Integer code; //返回码
private String msg; //返回信息
private Object data; //返回数据
public Result() {
}
public Result(boolean flag, Integer code, String msg, Object data) {
this.flag = flag;
this.code = code;
this.msg = msg;
this.data = data;
}
public Result(boolean flag, Integer code, String msg) {
this.flag = flag;
this.code = code;
this.msg = msg;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return msg;
}
public void setMessage(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
8.状态码类
public class StatusCode {
public static final int SMS = 0;//发送成功
public static final int OK = 0;//成功
public static final int ERROR = 201;//失败
public static final int LOGINERROR = 202;//用户名密码错误
public static final int ACCESSERROR = 203;//权限不足
public static final int REMOTEERROR = 204;//远程调用失败
public static final int REPERROR = 205;//重复操作
}