Java调用阿里云短信服务
一、注册登陆
阿里云官网: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());
}
}
发送短信测试