Controller.java
@RequestMapping("/testSms")
public ResponseEntity<String> testSms(@RequestParam("phone")String phone){
try {
SendSmsResponse sendSmsResponse = smsUtil.sendSms(phone);
// 记录日志
log.info("[短信服务]已发送短信验证码,手机号码:{}",phone);
} catch (ClientException e) {
e.printStackTrace();
log.error(e.getMessage());
}
return ResponseEntity.status(HttpStatus.OK).body(null);
}
SmsUtil.java
@Component
@EnableConfigurationProperties(SmsProperties.class)//作用是:使使用 @ConfigurationProperties 注解的类生效。
public class SmsUtil {
@Autowired
private SmsProperties smsProperties;
//产品名称:云通信短信API产品,开发者无需替换
static final String product = "Dysmsapi";
//产品域名,开发者无需替换
static final String domain = "dysmsapi.aliyuncs.com";
public SendSmsResponse sendSms(String phoneNumber) throws ClientException {
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", smsProperties.getAccessKeyId(), smsProperties.getAccessKeySecret());
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
request.setMethod(MethodType.POST);
//必填:待发送手机号
request.setPhoneNumbers(phoneNumber);
//必填:短信签名-可在短信控制台中找到
request.setSignName(smsProperties.getSignName());
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(smsProperties.getVerifyCodeTemplate());
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
String codeNumber = String.valueOf(Math.random()).substring(2,8);
request.setTemplateParam("{code:"+codeNumber+"}");
//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
//request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.setOutId("123456");
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse;
}
}
SmsProperties.java 配置类
//注意,没在配置类上加注解@EnableConfigurationProperties(属性类.class)的话,这里会报红
@ConfigurationProperties(prefix = "lurenwu.sms")
@Component
public class SmsProperties {
String accessKeyId;
String accessKeySecret;
String signName;
String verifyCodeTemplate;
public SmsProperties() {
}
public SmsProperties(String accessKeyId, String accessKeySecret, String signName, String verifyCodeTemplate) {
this.accessKeyId = accessKeyId;
this.accessKeySecret = accessKeySecret;
this.signName = signName;
this.verifyCodeTemplate = verifyCodeTemplate;
}
public String getAccessKeyId() {
return accessKeyId;
}
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public String getAccessKeySecret() {
return accessKeySecret;
}
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
public String getSignName() {
return signName;
}
public void setSignName(String signName) {
this.signName = signName;
}
public String getVerifyCodeTemplate() {
return verifyCodeTemplate;
}
public void setVerifyCodeTemplate(String verifyCodeTemplate) {
this.verifyCodeTemplate = verifyCodeTemplate;
}
}
application.yml
lurenwu:
sms:
accessKeyId: AccessKeyId # 你自己的accessKeyId
accessKeySecret: letmeLookLookAccessKeySecret(๑˘ ₃˘๑) # 你自己的AccessKeySecret
signName: 起于山野之风 # 签名名称
verifyCodeTemplate: SMS_110119120 # 模板名称
pom.xml 所需依赖
<!--阿里短信-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.6</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
<!--注解配置java配置类所需-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>