Java調用阿裡雲短信服務
- 一、注冊登陸
- 二、開通短信服務
- 三、添加簽名
- 四、添加模闆
- 五、國内消息設定
- 六、賬戶餘額充值
- 七、AccessKey 管理
- 八、開發
-
- 8.1、版本說明
- 8.2、 原版 SDK
-
- 8.2.1、直接使用
- 8.2.2、封裝短信工具類
- 8.3、更新版SDK
一、注冊登陸
阿裡雲官網:https://www.aliyun.com/
如果沒有注冊需要注冊并進行實名認證
實名位址:https://account.console.aliyun.com/v2/#/authc/home
二、開通短信服務
進入短信服務
免費開通
三、添加簽名
選擇國内消息–>簽名管理–>添加簽名
簽名内容
四、添加模闆
五、國内消息設定
安全設定
發送頻率設定
聯系人管理,用來通知安全設定中的限制
黑名單解除記錄
六、賬戶餘額充值
想要發送短信,賬戶中必須要有餘額
首頁:https://usercenter2.aliyun.com/home
使用支付寶進行支付就可以了,可以是任意金額,非常友善
國内短信定價
-
按量付費
根據短信的發送條數進行實時梯度計費。短信模闆的類型不同,短信的單價也不同。實時計費,自動跨檔,跨檔後當月所有發送量按新階梯價重新計算。
-
國内通用短信套餐包
為了降低使用者的使用成本,短信服務提供國内短信套餐包。 僅可用于國内文本短信,不包括國際及港澳台短信。使用短信服務時優先抵用套餐包中的數量。
套餐包時長為24個月,即短信額度的有效時長為24個月。超出24個月之後按照短信模闆類型梯度計費。
七、AccessKey 管理
請記住申請完子使用者AccessKey後不要立即關閉視窗,先将申請的AccessKeySecret進行儲存,因為關閉後,再也沒辦法進行檢視AccessKeySecret,隻能檢視到AccessKeyId。
八、開發
8.1、版本說明
目前短信服務SDK分為:更新版SDK(推薦使用)和原版SDK。兩者的差別如下所示:
說明 BusinessRequest版本SDK不再維護
對比項 | 更新版SDK | 原版SDK |
---|---|---|
生成方案 | 基于DSL語言 Darabonba | 基于模版生成,各程式設計語言之間采用不同的模版方案,各個語言之間功能完備程度不一緻,使用體驗不一。 |
語言支援 | 支援主流6門語言的SDK生成 | 大部分雲産品的老版本SDK無法支援超過3門以上的主流語言。 |
SDK示例 | 各語言間的代碼在邏輯行為上保持一緻,通過中間語言來統一生成,具有校驗能力,有效保證示例代碼的準确性。 | 各語言間的代碼示例不一緻,不能保證代碼的正确性。 |
SDK場景化示例 | 通過DSL一次編寫就能生成多語言的SDK場景化示例,可以協助開發者極大的簡化SDK使用的了解成本。 | 多語言場景化示例編寫難度大,覆寫語言數較少。 |
8.2、 原版 SDK
8.2.1、直接使用
導入項目所需依賴包
<dependencies>
<!--原版 SDK - 阿裡雲Java SDK核心庫-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.16</version>
</dependency>
<!--阿裡 FastJSON,json格式轉換-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.39</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
拷貝“使用示例”代碼,并替換示例代碼中關鍵資訊
示例位址:https://help.aliyun.com/document_detail/112148.html?spm=a2c4g.11186623.6.670.97dd1e08nhV97h
package com.java521.controller;
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;
/**
* @Author: xuwendong
* @Date: 2021/7/16 14:22
* @Description: 阿裡雲短信測試
*/
public class SendSms {
private static String accessKeyId = "LTAI5tKmStGAf3QzS18*****";
private static String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZRsg*****";
public static void main(String[] args) {
/*
* ap-northeast-1代表RegionID
* 表明使用那個服務區域伺服器發生短信,建議根據項目所在伺服器選擇
* 具體情況可以參考下面的【阿裡雲伺服器地域介紹】
*
*/
//DefaultProfile profile = DefaultProfile.getProfile("ap-northeast-1", "<accessKeyId>", "<accessSecret>");
DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", accessKeyId, accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("PhoneNumbers", "1314520****");
request.putQueryParameter("SignName", "用生命研發技術");
request.putQueryParameter("TemplateCode", "SMS_21890****");
request.putQueryParameter("TemplateParam", "{\"code\":\"6666\"}");
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
}
發送短信測試
8.2.2、封裝短信工具類
定義短信發送工具類
package com.java521.utils;
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;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;
/**
* @Author: xuwendong
* @Date: 2021/7/16 15:05
* @Description: 阿裡雲短信發送工具類
*/
@Slf4j
public class AliyunSmsUtil {
//短信發送成功狀态碼
private static final String OK = "OK";
//阿裡雲短信發送相關參數設定
private static final String REGIONID = "cn-beijing";
private static final String DOMAIN = "dysmsapi.aliyuncs.com";
private static final String VERSION = "2017-05-25";
private static final String ACTION = "SendSms";
//
private static final String accessKeyId = "LTAI5tKmStGAf3QzS18*****";
private static final String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZRsg*****";
/**
* 功能描述: 阿裡雲短信發送接口,支援通知、驗證碼、激活碼類短信
*
* @param map map中所需參數,參數名稱固定,如下(注意:參數首字母都是小寫的):
* phoneNumbers : 手機号碼,支援多個中間以“,”英文逗号分隔 (必填)
* signName :簽名(必填)
* templateCode :模闆code(必填)
* templateParam :模闆參數(不必填,如果是通知類短信,該參數可以不設定)
* @return : java.lang.Boolean
* true-短信發送成功;false-短信發送失敗
*/
public static Boolean sendSms(Map<String, String> map) {
Boolean flag = false;
DefaultProfile profile = DefaultProfile.getProfile(REGIONID, accessKeyId, accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
//發送短信域名,不要改變
request.setSysDomain(DOMAIN);
request.setSysVersion(VERSION);
request.setSysAction(ACTION);
request.putQueryParameter("PhoneNumbers", map.get("phoneNumbers"));
request.putQueryParameter("SignName", map.get("signName"));
request.putQueryParameter("TemplateCode", map.get("templateCode"));
//通知類短信,模闆不需要參數。判斷傳遞的模闆參數是否為空,如果為空可能是通知類短信,則不需要添加模闆參數條件
if (map.get("templateParam") != null) {
request.putQueryParameter("TemplateParam", map.get("templateParam"));
}
try {
//發送短信
CommonResponse response = client.getCommonResponse(request);
//發送短信結果轉為Map類型
Map<String, String> responseMap = JSON.parseObject(response.getData(), Map.class);
//判斷短信發送是否成功
if (OK.equals(responseMap.get("Code"))) {
flag = true;
}
log.debug("send fail[code={}, message={}]", responseMap.get("Code"), responseMap.get("Message"));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return flag;
}
}
測試發送短信工具類
package com.java521.controller;
import com.java521.utils.AliyunSmsUtil;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: xuwendong
* @Date: 2021/7/16 15:06
* @Description: 工具類短信發送測試
*/
public class AliyunSendSmsTest {
public static void main(String[] args) {
//封裝工具類所需參數
Map<String,String> map = new HashMap<>();
map.put("phoneNumbers","1314520****");
map.put("signName","用生命研發技術");
map.put("templateCode","SMS_21890****");
map.put("templateParam","{\"code\":\"8888\"}");
//調用工具類完成短信發送
Boolean success = AliyunSmsUtil.sendSms(map);
//驗證短信發送是否成功
if(success){
System.out.println("短信發送成功");
}else{
System.out.println("短信發送失敗");
}
}
}
發送短信測試
8.3、更新版SDK
添加更新版SDK依賴
<!--更新版 SDK-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.0.16</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-console</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-util</artifactId>
<version>0.2.11</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea</artifactId>
<version>[1.0.3, 2.0.0)</version>
</dependency>
編寫示例
package com.java521.controller;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;
/**
* @Author: xuwendong
* @Date: 2021/7/16 15:29
* @Description:
*/
public class Sample {
/**
* 使用AK&SK初始化賬号Client
*
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
Config config = new Config()
// 您的AccessKey ID
.setAccessKeyId(accessKeyId)
// 您的AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// 通路的域名
config.endpoint = "dysmsapi.aliyuncs.com";
return new Client(config);
}
public static void main(String[] args_) throws Exception {
String accessKeyId = "LTAI5tKmStGAf3QzS18*****";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZRsg*****";
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.dysmsapi20170525.Client client = Sample.createClient(accessKeyId, accessKeySecret);
SendSmsRequest sendSmsRequest = new SendSmsRequest()
.setPhoneNumbers("1314520****")
.setSignName("用生命研發技術")
.setTemplateCode("SMS_21890****")
.setTemplateParam("{\"code\":\"520520\"}");
// 複制代碼運作請自行列印 API 的傳回值
SendSmsResponse response = client.sendSms(sendSmsRequest);
System.out.println(response.getHeaders());
System.out.println("=========");
/**
* "RequestId": "10C14877-9808-4C80-84E1-8F7D45B92502",
* "Message": "OK",
* "BizId": "626211126421974956^0",
* "Code": "OK"
*/
System.out.println(response.getBody().getRequestId());
System.out.println(response.getBody().getMessage());
System.out.println(response.getBody().getBizId());
System.out.println(response.getBody().getCode());
}
}
發送短信測試