技術干貨實戰(7)- Spring Boot2.x實戰實現阿里云SMS短信發送功能

作者: 修羅debug
版權聲明:本文為博主原創文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處鏈接和本聲明。


“短信發送”功能在企業應用系統開發中應該說算是很常見的了,典型的案例 如 “用戶登錄時可以通過手機號接收平臺發送的驗證碼進行登錄”、“用戶通過手機號接收平臺發送的短信驗證碼從而找回密碼”、“雙重驗證用戶身份時需要用手機號接收平臺發送的驗證碼已確認用戶身份”等等都是比較常見的,本文將基于阿里云SMS短信發送服務 在Java Spring Boot應用系統實現短信發送功能


移動互聯網時代,幾乎人人都有部智能手機,每天的收、發短信操作想必已成常態,在使用各種APP或者網站應用系統時相比也應該經常都能有所見聞;而作為一名Java開發者,不知諸位在實際項目、實際應用系統中是否有真正地實現過短信發送以及對短信驗證碼進行驗證的功能?今天debug將帶大家一起實戰落地該功能!


順帶提下,我們將基于Spring Boot2.x進行代碼實戰,別問為什么哈!作為一名Java開發者,如果都不知道Spring Boot,debug都不知道該怎么說你了!另外,我們將基于阿里云SMS短信發送服務功能,其官網如下所示:https://www.aliyun.com/product/sms ,可以點擊購買或者免費開通,如果人品好的話,估計還真的可以免費開通(免費試用幾條);



在這里,debug就假設諸位已經成功開通了阿里云SMS短信發送服務了哈(如果沒有開通成功也沒關系,收藏下文章吧,以后總有用得著的),OK,話不多說,咱們直接開干!


1)首先,需要加入阿里云短信SMS服務的SDK,即對于我們Java后端而言,其實就是一個Jar包,如下所示:   

<!--阿里云短信服務-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.0</version>
</dependency>

2)緊接著是進入阿里云短信服務管理控制臺,獲取AccessKey ID 、AccessKey Secret并創建“短信簽名”以及“短信發送模板”,如下圖所示:




拿到這些信息之后,接下來需要將這些信息項配置起來,如下所示:   

#阿里云sms配置
ali.sms.accessKeyId=這里是你的AccessKey ID
ali.sms.accessSecret=這里是你的AccessKey Secret
ali.sms.regionId=cn-hangzhou
ali.sms.sysDomain=dysmsapi.aliyuncs.com
ali.sms.sysVersion=2017-05-25
ali.sms.sysAction=SendSms
ali.sms.enabled=true

ali.sms.phone.sendCode.bu=申請的短信簽名
ali.sms.phone.sendCode.temp=申請的短信模板編碼
ali.sms.phone.sendCode.msg=備注信息


之后便可以基于Spring Boot自動注入配置的功能特性將以上配置項加入到一個實體類中,以方便后續開發實際業務代碼時使用,其定義如下所示:   

@Configuration
@ConfigurationProperties(prefix = "ali.sms")
@Data
public class AliSmsProperty {
private String accessKeyId;

private String accessSecret;

private String regionId;

private String sysDomain;

private String sysVersion;

private String sysAction;

private Boolean enabled;
}


3)緊接著,開發調用阿里云短信服務SMSSDK提供的發送短信功能 的代碼,如下所示:   

@Service
public class AliSmsService {
private static final Logger log= LoggerFactory.getLogger(AliSmsService.class);

private static final String Channel="aliyun";

@Autowired
private AliSmsProperty aliSmsProperty;

@Autowired
private ObjectMapper objectMapper;

//發送通用消息
public void sendMsg(AliSmsRequest smsRequest,final Long sendId) throws Exception{
if (!aliSmsProperty.getEnabled()){
return;
}

//參數校驗

//短信配置初始化
DefaultProfile profile=DefaultProfile.getProfile(aliSmsProperty.getRegionId(),aliSmsProperty.getAccessKeyId(),aliSmsProperty.getAccessSecret());
IAcsClient client=new DefaultAcsClient(profile);
//構造短信發送請求
CommonRequest request=new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain(aliSmsProperty.getSysDomain());
request.setSysVersion(aliSmsProperty.getSysVersion());
request.setSysAction(aliSmsProperty.getSysAction());

request.putQueryParameter("RegionId", aliSmsProperty.getRegionId());
request.putQueryParameter("PhoneNumbers", smsRequest.getPhoneNumbers());
request.putQueryParameter("SignName", smsRequest.getSignName());
request.putQueryParameter("TemplateCode", smsRequest.getTemplateCode());
request.putQueryParameter("TemplateParam", smsRequest.getTemplateParam());

request.putQueryParameter("SmsUpExtendCode", RandomStringUtils.randomNumeric(4));
request.putQueryParameter("OutId", smsRequest.getTemplateCode()+"_"+RandomStringUtils.randomAlphanumeric(8));

//發送短信
CommonResponse response = client.getCommonResponse(request);
log.info("--阿里云短信發送結果:{},{},{}----",response.getHttpStatus(),response.getHttpResponse(),response.getData());

if (response!=null && StringUtils.isNotBlank(response.getData())){
AliSmsResponse smsResponse=objectMapper.readValue(response.getData(),AliSmsResponse.class);
if (smsResponse!=null && "OK".equals(smsResponse.getCode())){
//創建一條短信發送成功的記錄(記錄到數據庫DB,以用于后續的驗證碼驗證)

}else{
//創建一條短信發送失敗的記錄
}
}
}
}


其中,AliSmsRequest為開放給客戶端調用的參數,其定義如下所示:   

@Data
public class AliSmsRequest implements Serializable{
//要接受短信的手機號
private String phoneNumbers;

//申請的短信簽名
private String signName;

//申請的模板編碼
private String templateCode;

//短信發送參數-json格式的字符串,如{"code":123456}
private String templateParam;

//短信發送上行編碼-按照官方建議的填就行
private String smsUpExtendCode;
//序列id-按照官方建議的填就行
private String outId;

public AliSmsRequest(String phoneNumbers, String signName, String templateCode, String templateParam) {
this.phoneNumbers = phoneNumbers;
this.signName = signName;
this.templateCode = templateCode;
this.templateParam = templateParam;
}

public AliSmsRequest() {
}
}


至此,我們已經將發送短信的核心代碼擼完了,其中傳遞給服務端的參數的格式為(以發送短信驗證碼為例):   

{
"phoneNumbers":"15812490898",
"signName":"申請的短信簽名",
"tempCode":"申請的短信模板編碼",
"templateParam":"{\"code\":\"708946\"}",
"smsUpExtendCode":"12345678",
"outId":"12345678"
}


如果過程沒有報錯,不出5秒應該會受到一條短信,如下圖所示:


OK,打完收工,咱們下期再見!

總結:

我是debug,一個相信技術改變生活、技術成就夢想 的攻城獅;如果本文對你有幫助,請關注公眾號,并動動手指收藏、點贊、以及轉發哦?。?!