1 阿里大於簡介
1.1 短信服務
短信服務(Short Message Service)是一種存儲和轉發服務。也就是,短消息並不是直接從發送人發送到接收人,而始終通過短信服務中心進行轉發。
1.2 阿里大於
阿里大於是由阿里雲為用戶提供,與三大運營商合作;支持向國內和國際快速發送驗證碼、短信通知和推廣信息的一項短信服務。
1.3 產品優勢
快速穩定、覆蓋面廣、高並發處理、消息堆積處理、易開發管理、智能監控調度
1.4 應用場景
(1)短信驗證碼
APP、網站注冊賬號,向手機下發驗證碼; 登錄賬戶、異地登錄時的安全提醒; 找回密碼時的安全驗證; 支付認證、身份校驗、手機綁定等
(2)系統信息推送
向注冊用戶下發系統相關信息,包括: 升級或維護、服務開通、價格調整、 訂單確認、物流動態、消費確認、 支付通知等普通通知短信
(3)推廣短信
向注冊用戶和潛在客戶發送通知和推廣信息,包括促銷活動通知、業務推廣、新產品宣講、會員關懷等商品與活動的推廣信息。增加企業產品曝光率、提高產品和企業的知名度。
阿里大於短信服務官方介紹文檔
2 准備工作
2.1 登錄阿里雲控制台
(1)賬號准備
(2)登錄阿里雲控制台
(3)點擊“短信服務”

阿里雲控制台
2.2 短信服務配置
(1)短信服務界面介紹

① 包含了短信服務對接需要的訪問密鑰(AccessKey)和在線API調試工具。
② 包括短信簽名以及短信模板,可以在這里快捷修改短信簽名與模板。
③ 這里是短信服務所提供的套餐包,可以按需購買,支持超出滿足更高級流量包自動按量更高套餐計費。
(2)用戶AccessKey的創建
選擇①中的“AccessKey”打開“安全信息管理”界面:

點擊“創建AccessKey”會提示發送驗證碼到當前賬號的手機號上,填寫收到驗證碼,則創建成功。
(3)簽名申請
選擇②中“添加簽名”進入“添加簽名”界面:

Tips: ①這里注意需要盡量使用真實應用名;②如果為個人使用,使用場景選擇“驗證碼”,否則需要提供簽名來源以及證明文件;③注意這里的審核還是很迅速的,記得及時去查看直接的簽名審核結果。
(4)模板添加
選擇②中“添加模板”進入相應頁面:

這里提供我的模板以供參考:

萬事具備,只差集成代碼。 233...
3 Java對接
3.1 使用OpenAPI Explorer
(1)進入OpenAPI Explorer界面
選擇①中“OpenAPI Explorer”進入到接口在線調試界面:

(2)設置參數
選擇右下角“API簽名”設置參數:AccessKey、AccessSecret
在界面右側設置參數:PhoneNumbers、Signature、TemplateCode、TemplateParam
Tips:其中參數TemplateParam為Json格式。例如:{"code":"1111"}
這里附上官方請求參數介紹文檔
(3)返回結果示例

注意:這里接口已經正常調用,證明代碼已經沒有問題。接下就是針對自己開發業務的一個集成
3.2 業務集成
(1)分析OpenAPI Explorer示例代碼
// 1 首先我們需要導入短信服務所需要SDK依賴,也就是以下依賴,直接復制到項目Pom.xml下引入即可。
/*
pom.xml
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.3</version>
</dependency>
*/
public class SendSms {
public static void main(String[] args) {
// 2 創建一個用於發送短信的客戶端的配置類
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
// 3 實例化公共請求對象
CommonRequest request = new CommonRequest();
// 3.1 設置公共請求參數
request.setMethod(MethodType.POST);
request.setDomain("dysmsapi.aliyuncs.com");
request.setVersion("2017-05-25");
request.setAction("SendSms");
// 3.2 設置請求參數
request.putQueryParameter("RegionId", "cn-hangzhou");
request.putQueryParameter("PhoneNumbers", "待接收短信號");
request.putQueryParameter("SignName", "簽名名稱");
request.putQueryParameter("TemplateCode", "短信模板編號");
request.putQueryParameter("TemplateParam", "驗證碼");
// 4 執行請求得到響應實例
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
}
(2)集成SDK
在當前項目文件中添加依賴:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.0</version>
</dependency>
(3)針對短信驗證業務的分析
根據我所處理的只是用於短信驗證的業務,我們需要實現的業務有:
①發送六位隨機驗證碼
②短信驗證碼驗證
③可以靈活的向指定電話號碼發送驗證碼。
(4)參考代碼
以下為我根據示例代碼和業務需求實現的一個發送驗證碼工具類;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.trs.common.base.Defaults;
import lombok.extern.slf4j.Slf4j;
import java.util.Random;
@Slf4j
public class SendSmsUtils {
/**
* @Param 請求密鑰
**/
static final String ACCESS_KEY_ID="***************";
static final String ACCESS_SECRET="**************";
//* @Param 注冊:您正在申請手機注冊,驗證碼為:${code},5分鍾內有效!;
static final String REGISTER_TEMPLATE_CODE="【短信模板編號】";
//* @Param 驗證:您的驗證碼:${code},您正進行身份驗證,打死不告訴別人!
static final String VERIFY_TEMPLATE_CODE="【短信模板編號】";
// @Param 密碼重置:您的動態碼為:${code},您正在進行密碼重置操作,如非本人操作,請忽略本短信!
static final String PWDUPDATE_TEMPLATE_CODE="【短信模板編號】";
// 簽名名稱
static final String SIGNATURE = "【簽名名稱】";
/**
* @Description 根據模板類型發送指定模板類型的驗證短信
* @Param [phone, templateType]
**/
public static CommonResponse sendSmsCodeTophone(String phone,Integer templateFlag,String captCha){
// 1 實例化短信發送客戶端
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_SECRET);
IAcsClient client = new DefaultAcsClient(profile);
// 2 設置請求參數
CommonRequest request = new CommonRequest();
// 2.1 初始化公共參數
setIAcsPublicParams(request);
// 2.2 初始化請求參數
String templateTypeStr = getTemplateType(templateFlag);
setIAcsParams(request, phone, templateTypeStr,captCha);
// 3 執行請求並返回響應結果
return getResponse(client, request);
}
/**
* @Description 隨機生成六位數字驗證碼
* @Param []
**/
public static String getCode(){
int code = new Random().nextInt(900000)+100000;
return String.valueOf(code);
}
/**
* @Description 設置公共請求參數
* @Param [request, phone, templateTypeStr]
**/
private static void setIAcsParams(CommonRequest request, String phone, String templateTypeStr,String captCha) {
request.putQueryParameter("RegionId", "cn-hangzhou");
request.putQueryParameter("PhoneNumbers", phone);
request.putQueryParameter("SignName", SIGNATURE);
request.putQueryParameter("TemplateCode", templateTypeStr);
request.putQueryParameter("TemplateParam", "{\"code\":\""+captCha+"\"}");
}
/**
* @Description 根據傳入模板標志返回模板CODE
* @Param [templateFlag]
**/
private static String getTemplateType(Integer templateFlag) {
String templateTypeStr;
if (templateFlag == 1){
templateTypeStr = VERIFY_TEMPLATE_CODE;
}else if (templateFlag == 2){
templateTypeStr = PWDUPDATE_TEMPLATE_CODE;
}else {
templateTypeStr = REGISTER_TEMPLATE_CODE;
}
return templateTypeStr;
}
/**
* @Description 客戶端執行請求,並返回請求響應實例
* @Param [client, request]
**/
private static CommonResponse getResponse(IAcsClient client, CommonRequest request) {
CommonResponse response = Defaults.defaultValue(CommonResponse.class);
try {
response = client.getCommonResponse(request);
log.info(response.getData());
} catch (ClientException e) {
e.printStackTrace();
}
return response;
}
/**
* @Description 設置公共請求參數
* @Param [request]
**/
private static void setIAcsPublicParams(CommonRequest request) {
request.setMethod(MethodType.POST);
request.setDomain("dysmsapi.aliyuncs.com");
request.setVersion("2017-05-25");
request.setAction("SendSms");
}
}
4 使用總結
- 使用“阿里大於”可以很方便快速為項目提供短信服務
- 正因為官方文檔非常全面,所以出此總結
