Spring Boot实现阿里云短信发送
今天写了个阿里云的短信发送业务 , 具体阿里云短信申请这些就不记录了官网写的很清楚,记录下代码以后忘记了好快速复制粘贴 ,哈哈狗头
先导入依赖: 阿里云 和 fastjson lomback, redis 直接在boot init 中勾选即可
<!--阿里云-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<!--lomback-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
编写一个测试代码 没有对其 封装 参考官方文档写的
@Test
void sendMsg(){
DefaultProfile profile = DefaultProfile.getProfile("cn-qingdao", "accessKeyId", "accessKeySecret");
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
//下面这3个不要改动
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
//接收短信的手机号码
request.putQueryParameter("PhoneNumbers","接收短信的手机号码");
//短信签名名称
request.putQueryParameter("SignName","短信签名名称");
//短信模板ID
request.putQueryParameter("TemplateCode","短信模板ID");
//短信模板变量对应的实际值 ${code} 中的值
Map<String,String> param = new HashMap<>(2);
param.put("code","1024");
request.putQueryParameter("TemplateParam",JSONObject.toJSONString(param));
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
对其进行方法封装
1.创建 AliyunSendMsgConfig 类保存配置
package com.szqbl.cxy.hzty.aliyun;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* 发送短信配置
*/
@Configuration
@ConfigurationProperties(prefix = "aliyun.send-msg")
@Data
public class AliyunSendMsgConfig {
private String accessKeyId;
private String accessKeySecret;
///短信签名名称
private String SignName;
//短信模板ID
private String TemplateCode;
}
2.以上完成后 就可以到 application.yml 或者 .properties 配置参数避免 硬编码
#阿里云 msg
aliyun:
send-msg:
accessKeyId : 你的accessKeyId
accessKeySecret : 你的accessKeySecret
SignName : 短信签名名称
TemplateCode : 短信模板ID
3.创建sendMsgService 接口 分层操作
public interface SendMsgService {
/**
*
* @param phoneNumbers 手机
* @param param 发送 code
* @return
*/
public Boolean sendMsg(String phoneNumbers, Map<String ,Integer> param);
}
4.创建sendMsgService Impl 实现类
@Service
public class SendMsgServiceImpl implements SendMsgService {
//注入之前写好的配置类
@Autowired
private AliyunSendMsgConfig aliyunSendMsgConfig;
/**
* @param phoneNumbers 手机
* @param param 发送 code
* @return
*/
@Override
public Boolean sendMsg(String phoneNumbers, Map<String, Integer> param) {
DefaultProfile profile = DefaultProfile.getProfile("cn-qingdao", aliyunSendMsgConfig.getAccessKeyId(), aliyunSendMsgConfig.getAccessKeySecret());
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",aliyunSendMsgConfig.getSignName());
//短信模板ID
request.putQueryParameter("TemplateCode",aliyunSendMsgConfig.getTemplateCode());
//短信模板变量对应的实际值
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param));
try {
CommonResponse response = client.getCommonResponse(request);
// 是否发送成功
return response.getHttpResponse().isSuccess();
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
}
5.创建 控制器 Controller 配合 redis
/**
* 短信发送
*/
@Controller
@RequestMapping("api/")
//@AnonymousPermission 公司的权限注解 可以去掉
// BaseApiController 这个是公司封装的可以去掉
public class SendMsgController extends BaseApiController {
@Autowired
private SendMsgService sendMsgService;
// RedisTemplate
@Resource
private RedisTemplate<String,String> redisTemplate;
//公司封装的 可以去掉
// @Autowired
// protected DataCacheService dataCacheService;
//BaseResult 可以自己创建一个 返回视图类 data code msg
@RequestMapping(value = "sendMsg.do",method = RequestMethod.GET)
@ResponseBody
public BaseResult<?> sendMsg(@RequestParam String phone){
// CheckUtil.isMobilePhone(phone) 这个手机号码正则 可以 百度一个 这个是公司封装的
if (StringUtils.isNotBlank(phone) && CheckUtil.isMobilePhone(phone)){
String code = redisTemplate.opsForValue().get(phone);
if (stringUtils.isNotBlank(code)){
return result("验证码未过期,请勿重复发送");
}
//if (dataCacheService.exists(phone)){
// return result("验证码未过期,请勿重复发送");
// }
Map<String,Integer> param =new HashMap<>(2);
//随机生成一个4位数的 数字
param.put("code",(int) ((Math.random() * 9 + 1) * 1000));
Boolean isSend = sendMsgService.sendMsg(phone, param);
//发送成功
if (isSend){
//添加到缓存 5分钟
redisTemplate.opsForValue().set(phone,String.valueOf(param.get("code")),5, TimeUnit.SECONDS);
String s = redisTemplate.opsForValue().get(phone);
System.out.println(s);
// 这个是公司自己封装的redis 模板dataCacheService.set(phone,String.valueOf(param.get("code")),300L);
return result("发送成功");
}
}
throw new BaseValidationException("请输入正确的手机号码!");
}
}
以上就完成了springboot 操作阿里云发送短信的功能了