第一步:pom文件引入所需依赖包
<!--aliyun短信发送-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.5.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
<scope>compile</scope>
</dependency>
了解<scope></scope>:
<scope></scope>表示对于该包的依赖范围作用域,默认取值为compile。
<scope>test</scope>
test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖。
<scope>compile</scope>
compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去。
<scope>provided</scope>
provided范围指的是在编译和测试的过程有效,最后生成war包时不会加入。
<scope>runtime</scope>
runtime在运行的时候依赖,在编译的时候不依赖。
第二步:配置文件
#阿里云短信配置
aliyun:
sms:
accessKeyId: ****** //此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
accessKeySecret: ****** //此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
product: Dysmsapi //产品名称:云通信短信API产品,开发者无需替换
domain: dysmsapi.aliyuncs.com //产品域名,开发者无需替换
regionId: cn-hangzhou
signName: ****** //短信签名-可在短信控制台中找到
dateFormat: yyyyMMdd
endpointName: cn-hangzhou
templateCode: ****** //短信模板-可在短信控制台中找到
outId: yourOutId //outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
第三步:代码
1.阿里云短信配置类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "aliyun.sms")
public class AliyunSMSConfig {
private String accessKeyId;
private String accessKeySecret;
private String product;
private String domain;
private String regionId;
private String signName;
private String dateFormat;
private String endpointName;
private String templateCode;
private String outId;
}
2.阿里云发送短信相关类
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.ciip.cloud.core.common.util.SpringContextUtil;
import cn.hutool.core.util.StrUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Title: AliYunSMSSender
* Description: 阿里云发送短信相关
*
*/
@Component
@Slf4j
public class AliYunSMSSender {
// 自动注册短信服务的配置
@Autowired
private AliyunSMSConfig smsConfig;
public static SMS newSMS(){
return new SMS();
}
// 一个短信实体
@Data
public static class SMS {
private String phoneNumbers;
private String templateParam;
private String outId;
private String templateCode;
private String signName;
}
@Data
public static class Result {
private SendSmsResponse sendSmsResponse;
private SMS sms;
}
//发送短信
public static SendSmsResponse send(SMS sms) {
AliYunSMSSender aliYunSMSSender = (AliYunSMSSender) SpringContextUtil.getBean("aliYunSMSSender");
return aliYunSMSSender.sendSms(sms);
}
//发送短信
public SendSmsResponse sendSms(SMS sms) {
sms.setTemplateCode(StrUtil.isEmpty(sms.getTemplateCode())?smsConfig.getTemplateCode():sms.getTemplateCode());
sms.setOutId(smsConfig.getOutId());
IAcsClient acsClient = getClient();
SendSmsRequest request = getRequest(sms);
SendSmsResponse sendSmsResponse = null;
try {
sendSmsResponse = acsClient.getAcsResponse(request);
} catch (ClientException e) {
log.error("发送短信发生错误。错误代码是 [{}],错误消息是 [{}],错误请求ID是 [{}],错误Msg是 [{}],错误类型是 [{}]", e.getErrCode(), e.getMessage(), e.getRequestId(), e.getErrMsg(), e.getErrorType());
e.printStackTrace();
}
return sendSmsResponse;
}
// 获取短信请求
private SendSmsRequest getRequest(SMS sms) {
SendSmsRequest request = new SendSmsRequest();
request.setPhoneNumbers(sms.getPhoneNumbers());
request.setSignName(StrUtil.isEmpty(sms.getSignName())?smsConfig.getSignName():sms.getSignName());
request.setTemplateCode(sms.getTemplateCode());
request.setTemplateParam(sms.getTemplateParam());
request.setOutId(sms.getOutId());
return request;
}
// 获取短信发送服务机
private IAcsClient getClient() {
IClientProfile profile = DefaultProfile.getProfile(smsConfig.getRegionId(), smsConfig.getAccessKeyId(), smsConfig.getAccessKeySecret());
try {
DefaultProfile.addEndpoint(smsConfig.getEndpointName(), smsConfig.getRegionId(), smsConfig.getProduct(), smsConfig.getDomain());
} catch (ClientException e) {
e.printStackTrace();
}
return new DefaultAcsClient(profile);
}
// 构建一个查询器
@Data
public static class Query {
/** 业务ID */
private String bizId;
private String phoneNumber;
private Date sendDate;
private Long pageSize;
private Long currentPage;
}
/**
* 查询短信发送结果
* @param query 查询条件
*/
public QuerySendDetailsResponse querySendDetails(Query query) {
IAcsClient acsClient = getClient();
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
request.setPhoneNumber(query.getPhoneNumber());
request.setBizId(query.getBizId());
SimpleDateFormat ft = new SimpleDateFormat(smsConfig.getDateFormat());
request.setSendDate(ft.format(query.getSendDate()));
request.setPageSize(query.getPageSize());
request.setCurrentPage(query.getCurrentPage());
QuerySendDetailsResponse querySendDetailsResponse = null;
try {
querySendDetailsResponse = acsClient.getAcsResponse(request);
} catch (ClientException e) {
e.printStackTrace();
}
return querySendDetailsResponse;
}
}
3.阿里云发送短信接口
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
/**
* 阿里云发送短信接口
*
*/
public class AliYunSMSUtils {
/**
* 短信验证码信息
*
* @param code
* @param phone
* @return
*/
public static String sendValidateCode(String code,String phone){
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
AliYunSMSSender.SMS sms= AliYunSMSSender.newSMS();
sms.setPhoneNumbers(phone);
//必填:短信签名-可在短信控制台中找到
sms.setSignName("XXXXXX");
//必填:短信模板-可在短信控制台中找到
sms.setTemplateCode("SMS_XXXXXX");
sms.setTemplateParam("{\"code\":\""+code+"\"}");
SendSmsResponse sendSmsResponse = AliYunSMSSender.send(sms);
if(sendSmsResponse.getCode() != null) {
return sendSmsResponse.getCode();
}else {
return null;
}
}
4.controller类:
/**
* 获取手机验证码
* @param sourceType 来源类型
* @param mobile 手机号
* @param request
* @return
*/
@ApiOperation(value="获取手机验证码", notes = "")
@PostMapping(value = CIIPCommonConstant.ApiAuth.ANON +"/register/getMobileValidateCode")
public ResponseMessage getMobileValidateCode(@RequestParam(value = "sourceType",required = true) String sourceType,
@RequestParam(value = "mobile",required = true) String mobile, HttpServletRequest request){
return ciipUserService.getMobileValidateCode(sourceType,mobile,request);
}
5.service层:
/**
* 获取手机验证码
* @param mobile 手机号
* @param request 请求对象
* @return
*/
ResponseMessage getMobileValidateCode(String type,String mobile, HttpServletRequest request);
6.service实现层:
@Override
public ResponseMessage getMobileValidateCode(String type,String mobile, HttpServletRequest request) {
if(StringUtils.isEmpty(type)||StringUtils.isEmpty(mobile)){
return ResultUtil.error(UserCenterStatusCode.PARAM_ERROR.getCode(),UserCenterStatusCode.PARAM_ERROR.getMsg());
}
//此处是生成6位数验证码工具类
String validateCode = CoreUtils.randomString(6, true);
//响应code
String respCode=null;
if(type.equals(CIIPCommonConstant.MobileValidateCodeSouceType.BINDING)){
//手机绑定
respCode = AliYunSMSUtils.sendValidateCode(validateCode, mobile);
}else if(type.equals(CIIPCommonConstant.MobileValidateCodeSouceType.UPDATE)){
//手机变更
respCode = AliYunSMSUtils.sendValidateCode(validateCode, mobile);
}else{
return ResultUtil.error(UserCenterStatusCode.PARAM_ERROR.getCode(),UserCenterStatusCode.PARAM_ERROR.getMsg());
}
//发送成功后存入redis
if(respCode!=null){
//默认,300s,5分钟过期
int time=300;
//TODO 这里根据来源类别来存储不同类型的验证码
if(type.equals(CIIPCommonConstant.MobileValidateCodeSouceType.BINDING)){
//手机绑定 ->验证码
redisUtil.setWithExpireTime(CIIPCommonConstant.CIIP_PROTAL, CIIPCommonConstant.VALIDATE_CODE_KEY_BINDING + mobile,JSON.toJSONString(validateCode), time);
}else if (type.equals(CIIPCommonConstant.MobileValidateCodeSouceType.UPDATE)){
//手机变更 ->验证码
redisUtil.setWithExpireTime(CIIPCommonConstant.CIIP_PROTAL, CIIPCommonConstant.VALIDATE_CODE_KEY_UPDATE+ mobile,JSON.toJSONString(validateCode), time);
}else {
return ResultUtil.error(UserCenterStatusCode.PARAM_ERROR.getCode(),UserCenterStatusCode.PARAM_ERROR.getMsg());
}
return ResultUtil.success(UserCenterStatusCode.REG_SEND_MOBLIE_VALIDATE_SUCCESS.getCode(),UserCenterStatusCode.REG_SEND_MOBLIE_VALIDATE_SUCCESS.getMsg());
}
return ResultUtil.error(UserCenterStatusCode.REG_SEND_MOBLIE_VALIDATE_ERROR.getCode(),UserCenterStatusCode.REG_SEND_MOBLIE_VALIDATE_ERROR.getMsg());
}