技術(shù)干貨實戰(zhàn)(7)- Spring Boot2.x實戰(zhàn)實現(xiàn)阿里云SMS短信發(fā)送功能
作者:
修羅debug
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 by-sa 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
“短信發(fā)送”功能在企業(yè)應(yīng)用系統(tǒng)開發(fā)中應(yīng)該說算是很常見的了,典型的案例 如 “用戶登錄時可以通過手機(jī)號接收平臺發(fā)送的驗證碼進(jìn)行登錄”、“用戶通過手機(jī)號接收平臺發(fā)送的短信驗證碼從而找回密碼”、“雙重驗證用戶身份時需要用手機(jī)號接收平臺發(fā)送的驗證碼已確認(rèn)用戶身份”等等都是比較常見的,本文將基于阿里云SMS短信發(fā)送服務(wù) 在Java Spring Boot應(yīng)用系統(tǒng)實現(xiàn)短信發(fā)送功能
移動互聯(lián)網(wǎng)時代,幾乎人人都有部智能手機(jī),每天的收、發(fā)短信操作想必已成常態(tài),在使用各種APP或者網(wǎng)站應(yīng)用系統(tǒng)時相比也應(yīng)該經(jīng)常都能有所見聞;而作為一名Java開發(fā)者,不知諸位在實際項目、實際應(yīng)用系統(tǒng)中是否有真正地實現(xiàn)過短信發(fā)送以及對短信驗證碼進(jìn)行驗證的功能?今天debug將帶大家一起實戰(zhàn)落地該功能!
順帶提下,我們將基于Spring Boot2.x進(jìn)行代碼實戰(zhàn),別問為什么哈!作為一名Java開發(fā)者,如果都不知道Spring Boot,debug都不知道該怎么說你了!另外,我們將基于阿里云SMS短信發(fā)送服務(wù)功能,其官網(wǎng)如下所示:https://www.aliyun.com/product/sms ,可以點擊購買或者免費開通,如果人品好的話,估計還真的可以免費開通(免費試用幾條);
在這里,debug就假設(shè)諸位已經(jīng)成功開通了阿里云SMS短信發(fā)送服務(wù)了哈(如果沒有開通成功也沒關(guān)系,收藏下文章吧,以后總有用得著的),OK,話不多說,咱們直接開干!
(1)首先,需要加入阿里云短信SMS服務(wù)的SDK,即對于我們Java后端而言,其實就是一個Jar包,如下所示:
<!--阿里云短信服務(wù)-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.0</version>
</dependency>
(2)緊接著是進(jìn)入阿里云短信服務(wù)管理控制臺,獲取AccessKey ID 、AccessKey Secret并創(chuàng)建“短信簽名”以及“短信發(fā)送模板”,如下圖所示:
拿到這些信息之后,接下來需要將這些信息項配置起來,如下所示:
#阿里云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自動注入配置的功能特性將以上配置項加入到一個實體類中,以方便后續(xù)開發(fā)實際業(yè)務(wù)代碼時使用,其定義如下所示:
@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)緊接著,開發(fā)調(diào)用阿里云短信服務(wù)SMS的SDK提供的發(fā)送短信功能 的代碼,如下所示:
@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;
//發(fā)送通用消息
public void sendMsg(AliSmsRequest smsRequest,final Long sendId) throws Exception{
if (!aliSmsProperty.getEnabled()){
return;
}
//參數(shù)校驗
//短信配置初始化
DefaultProfile profile=DefaultProfile.getProfile(aliSmsProperty.getRegionId(),aliSmsProperty.getAccessKeyId(),aliSmsProperty.getAccessSecret());
IAcsClient client=new DefaultAcsClient(profile);
//構(gòu)造短信發(fā)送請求
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));
//發(fā)送短信
CommonResponse response = client.getCommonResponse(request);
log.info("--阿里云短信發(fā)送結(jié)果:{},{},{}----",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())){
//創(chuàng)建一條短信發(fā)送成功的記錄(記錄到數(shù)據(jù)庫DB,以用于后續(xù)的驗證碼驗證)
}else{
//創(chuàng)建一條短信發(fā)送失敗的記錄
}
}
}
}
其中,AliSmsRequest為開放給客戶端調(diào)用的參數(shù),其定義如下所示:
@Data
public class AliSmsRequest implements Serializable{
//要接受短信的手機(jī)號
private String phoneNumbers;
//申請的短信簽名
private String signName;
//申請的模板編碼
private String templateCode;
//短信發(fā)送參數(shù)-json格式的字符串,如{"code":123456}
private String templateParam;
//短信發(fā)送上行編碼-按照官方建議的填就行
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() {
}
}
至此,我們已經(jīng)將發(fā)送短信的核心代碼擼完了,其中傳遞給服務(wù)端的參數(shù)的格式為(以發(fā)送短信驗證碼為例):
{
"phoneNumbers":"15812490898",
"signName":"申請的短信簽名",
"tempCode":"申請的短信模板編碼",
"templateParam":"{\"code\":\"708946\"}",
"smsUpExtendCode":"12345678",
"outId":"12345678"
}
如果過程沒有報錯,不出5秒應(yīng)該會受到一條短信,如下圖所示:
OK,打完收工,咱們下期再見!
總結(jié):