配置阿里云短信控制台
签名模版
这三个都要审核,申请玩之后每个每行都有详情,我们只需要关注最后两个
AccessKey和AccessSecret
点进去点开始使用子账户进去创建,以下模版名称随便填访问方式都点上,其他的你们随意
创建好之后下载文件或者直接复制AccessKey和AccessSecret
然后添加权限,搜索短信就会看到这两个添加上去
开始写代码
添加依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.0</version>
<scope>compile</scope>
</dependency>
Yaml文件配置
aliyun: sms: accessKeyId: AccessKey accessKeySecret: AccessSecret signName: 签名名称 templateCode: 模板CODE
发送短信工具类
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class SmsUtils {
@Value("${aliyun.sms.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.sms.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.sms.signName}")
private String signName;
@Value("${aliyun.sms.templateCode}")
private String templateCode;
public SendSmsResponse sendSms(String phoneNumbers, String code) throws ClientException {
// 初始化acsClient,暂不支持region化
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
IAcsClient acsClient = new DefaultAcsClient(profile);
// 创建SendSmsRequest对象,每个字段与控制台中SMS Document的内容对应,具体可参考SMS API文档
SendSmsRequest request = new SendSmsRequest();
// 必填:待发送手机号
request.setPhoneNumbers(phoneNumbers);
// 必填:短信签名-可在短信控制台中找到
request.setSignName(signName);
// 必填:短信模板-可在短信控制台中找到
request.setTemplateCode(templateCode);
// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam("{\"code\":\"" + code + "\"}");
// 发起请求,调用sendSms方法发送短信
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse;
}
/**
* 生成验证码
* @return
*/
public static String generateVerificationCode() {
// 这里实现验证码生成逻辑,比如生成一个6位数的验证码
return String.valueOf((int) ((Math.random() * 900000) + 100000));
}
}
Service层
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
@Service
@Slf4j
public class SmsServiceImpl implements SmsService {
@Resource
private SmsUtils smsUtils;
/**
* 发送验证码
* @param phone 手机号
* @return
*/
@Override
public ResultData getPhoneLogin(String phone) {
//判断手机号是否为空
if(EmptyUtils.isNotEmpty(phone)){
//使用正则表达式判断手机号是否正确
if(phone.length() == 11){
//获得6位随机数
String s = SmsUtils.generateVerificationCode();
SendSmsResponse sendSmsResponse = null;
try {
//发送手机短信
sendSmsResponse = smsUtils.sendSms(phone, s);
//ok代表发送成功
if(sendSmsResponse.getCode().equals("OK") || sendSmsResponse.getCode().equals("ok")
&& sendSmsResponse.getMessage().equals("Ok") || sendSmsResponse.getMessage().equals("ok")
){
//在缓存中存储并设置15分钟过期
long time = 60*15;
redisUtil.setStr(Constants.USERPHONE+phone,s,time);
//成功返回1
return ResultData.success(1);
}
} catch (ClientException e) {
//失败给出的提示 系统异常
return ResultData.fail(ReturnCodeEnum.RC500.getCode(), ReturnCodeEnum.RC500.getMessage());
}
}
//失败给出的提示手机格式不正确
return ResultData.fail(ReturnCodeEnum.PHONEFORMAT.getCode(), ReturnCodeEnum.PHONEFORMAT.getMessage());
}
//手机号不能为空提示
return ResultData.fail(ReturnCodeEnum.PHONEFORMAT.getCode(), ReturnCodeEnum.PHONEFORMAT.getMessage());
}}
controller层
@Slf4j
@RestController
@RequestMapping("/pet/user/consumer")
public class UserController {
@Resource
private SmsService SmsService;
/**
* 发送验证码
* @param phone
* @return
*/
@PostMapping("/getPhoneLogin")
public ResultData getPhoneLogin(@RequestParam(value = "phone") String phone){
return userService.getPhoneLogin(phone);
}
}
以上只是发送单个手机号的代码,到此结束