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
com.aliyun
aliyun-java-sdk-core
4.0.3
*/
public class SendSms {
public static void main(String[] args) {
// 2 创建一个用于发送短信的客户端的配置类
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", "");
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
在当前项目文件中添加依赖:
com.aliyun
aliyun-java-sdk-core
4.1.0
(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 使用总结
- 使用“阿里大于”可以很方便快速为项目提供短信服务
- 正因为官方文档非常全面,所以出此总结