1.添加pom.xml依賴
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.6</version>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
2.application.yml添加配置文件
#短信
sms:
aliyun:
accessKeyID: #keyID
accessKeySecret: #KeySecret秘鑰
domain: dysmsapi.aliyuncs.com #固定
regionId: cn-hangzhou #固定
templateCode: #模板code
signName: #簽名名稱
3.創(chuàng)建隨機(jī)驗(yàn)證碼工具類
public class RandomUtils {
private static final String[] ARR = {"0","1","2","3","4","5","6","7","8","9"};
private static final Random random = new Random();
/**
* 生成指定長(zhǎng)度隨機(jī)數(shù)(數(shù)字)
* @param length 長(zhǎng)度
* @return 驗(yàn)證碼
*/
public static String createRandomInt(int length){
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
int index = random.nextInt(ARR.length);
sb.append(ARR[index]);
}
return sb.toString();
}
}
4.創(chuàng)建發(fā)送驗(yàn)證碼工具類
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
@Component
public class SendSmsUtils {
private static Logger log = LoggerFactory.getLogger(SendSmsUtils.class);
//aliyuncs的參數(shù)
private static String accessKeyID;
private static String accessKeySecret;
//短信api的請(qǐng)求地址 固定
private static String domain;
//指定地域名稱 短信API的就是 cn-hangzhou 不能改變
private static String regionId;
//您的申請(qǐng)簽名
private static String signName;
//你的模板
private static String templateCode;
/**
* 發(fā)送短信接口
*
* @param phoneNum 手機(jī)號(hào)
* @return 驗(yàn)證碼
*/
public static String sendSms(String phoneNum) {
String code = RandomUtils.createRandomInt(6);
// 指定地域名稱 短信API的就是 cn-hangzhou 不能改變 后邊填寫您的 accessKey 和 accessKey Secret
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyID, accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile);
// 創(chuàng)建通用的請(qǐng)求對(duì)象
CommonRequest request = new CommonRequest();
// 指定請(qǐng)求方式
request.setSysMethod(MethodType.POST);
// 短信api的請(qǐng)求地址 固定
request.setSysDomain(domain);
//簽名算法版本 固定
request.setSysVersion("2017-05-25");
//請(qǐng)求 API 的名稱
request.setSysAction("SendSms");
//指定地域名稱
request.putQueryParameter("RegionId", regionId);
// 要給哪個(gè)手機(jī)號(hào)發(fā)送短信 指定手機(jī)號(hào)
request.putQueryParameter("PhoneNumbers", phoneNum);
// 您的申請(qǐng)簽名
request.putQueryParameter("SignName", signName);
// 您申請(qǐng)的模板 code
request.putQueryParameter("TemplateCode", templateCode);
Map<String, Object> params = new HashMap<>();
//這里的key就是短信模板中的 ${xxxx}
params.put("code", code);
// 放入?yún)?shù) 需要把 map轉(zhuǎn)換為json格式 使用fastJson進(jìn)行轉(zhuǎn)換
request.putQueryParameter("TemplateParam", JSON.toJSONString(params));
try {
CommonResponse response = client.getCommonResponse(request);
log.info(JSON.parseObject(response.getData(), Map.class).get("Message").toString());
if(response.getHttpResponse().isSuccess()) {
return code;
}
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return null;
}
public static String getAccessKeyID() {
return accessKeyID;
}
@Value("${sms.aliyun.accessKeyID}")
public void setAccessKeyID(String accessKeyID) {
SendSmsUtils.accessKeyID = accessKeyID;
}
public static String getAccessKeySecret() {
return accessKeySecret;
}
@Value("${sms.aliyun.accessKeySecret}")
public void setAccessKeySecret(String accessKeySecret) {
SendSmsUtils.accessKeySecret = accessKeySecret;
}
public static String getDomain() {
return domain;
}
@Value("${sms.aliyun.domain}")
public void setDomain(String domain) {
SendSmsUtils.domain = domain;
}
public static String getRegionId() {
return regionId;
}
@Value("${sms.aliyun.regionId}")
public void setRegionId(String regionId) {
SendSmsUtils.regionId = regionId;
}
public static String getSignName() {
return signName;
}
@Value("${sms.aliyun.signName}")
public void setSignName(String signName) {
SendSmsUtils.signName = signName;
}
public static String getTemplateCode() {
return templateCode;
}
@Value("${sms.aliyun.templateCode}")
public void setTemplateCode(String templateCode) {
SendSmsUtils.templateCode = templateCode;
}
}
注意事項(xiàng):在application.yml
中配置了accessKeyID等參數(shù)
,想在一個(gè)工具類里面的靜態(tài)方法使用,于是使用了靜態(tài)變量。使用@Value
注解獲取值,如下:
@Value("${sms.aliyun.accessKeyID}")
private static String accessKeyID;
debug發(fā)現(xiàn)獲取不到,為null
。原因如下:
- spring不允許/不支持把值注入到靜態(tài)變量中;
- Spring的@Value依賴注入是依賴set方法;
- set方法是普通的對(duì)象方法;
- static變量是類的屬性,static沒有set方法。
?解決辦法,把@Value注解放到set方法上,去除set方法static關(guān)鍵字。如下:
//aliyuncs的參數(shù)
private static String accessKeyID;
@Value("${sms.aliyun.accessKeyID}")
public void setAccessKeyID(String accessKeyID) {
SendSmsUtils.accessKeyID = accessKeyID;
}
public static String getAccessKeyID() {
return accessKeyID;
}
?同時(shí),工具類還需要交給spring管理,在類上添加注解@Component
。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-427195.html
5.測(cè)試文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-427195.html
@GetMapping("sms")
public ResponseBo sms(String phone) {
String code = SendSmsUtils.sendSms(phone);
System.out.println(code);
return ResponseBo.ok(code);
}
到了這里,關(guān)于springboot集成阿里云短信驗(yàn)證碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!