阿里云目前提供的短信服务主要有四项:
1:短信发送API
2:短信查询API
3:短信消息API
4:短信批量发送API
群发由于需要升级到企业用户才可以使用,暂时不在学习使用的考虑范围内了就。
-->短信发送API
编写了简单的form表单进行测试,在input框内输入电话号码,点击begin test按钮后,会收到验证码。
验证码是固定的,写成了"2tong",可以根据需要进行相应的修改。
使用方式为:
在pom.xml文件中引入:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.7.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
新建java文件,编写相应的方法:
public void test() throws ServerException, ClientException {
//设置超时时间-可自行调整
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化ascClient需要的几个参数
final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
//替换成自己的AK
final String accessKeyId = "";//你的accessKeyId(需要修改)
final String accessKeySecret = "";//你的accessKeySecret(需要修改)
//初始化ascClient,暂时阿里云不支持多region(就不要动了)
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,
accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象
SendSmsRequest request = new SendSmsRequest();
//使用post提交
request.setMethod(MethodType.POST);
//必填:待发送手机号。发送国际/港澳台消息时,接收号码格式为00+国际区号+号码,如“0085200000000”。
request.setPhoneNumbers(this.phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName(""); //这个会是短信的那个提示,例如[吃货店铺]
//必填:短信模板-这个可以在短信控制台中找到,自己设定短信模版后,阿里云会分配给你一个模版码值
request.setTemplateCode("");
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
//友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
request.setTemplateParam("{\"code\":\"2tong\"}"); //我这里只需要一个,因此,就只写了这个,而且写成了固定的
//可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.setOutId(""); //你的outId
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
//请求成功
System.out.println("that is ok,2tong");
//可以增添一些业务代码,如果需要的话
}
else {
//请求失败,可以查看失败码值
System.out.println(sendSmsResponse.getCode());
}
return;
}
失败码值介绍的链接是:https://help.aliyun.com/knowledge_detail/57717.html?spm=a2c4g.11186623.2.9.H9gbF8
-->短信查询API
阿里云支持对某一个号码30天内的短信追踪
编写了简单的form表单进行测试,在input框内依次输入想要查询的手机号码、短信发送时返回的BizId、诸如20180528形式的日期,点击begin test可以看到查询结果。
使用方式为:
在pom.xml文件中引入:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.7.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
编写相应的方法:
public void testQuery() throws ClientException {
//设置超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//云通信产品-短信API服务产品名称(短信产品名固定,无需修改)
final String product = "Dysmsapi";
//云通信产品-短信API服务产品域名(接口地址固定,无需修改)
final String domain = "dysmsapi.aliyuncs.com";
//此处需要替换成自己的AK信息
final String accessKeyId = "";
final String accessKeySecret = "";
//初始化ascClient
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
//必填-号码
request.setPhoneNumber(this.phone);
//可选-调用发送短信接口时返回的BizId
request.setBizId(this.BizId);
//必填-短信发送的日期 支持30天内记录查询(可查其中一天的发送数据),格式yyyyMMdd
request.setSendDate(this.dateTime);
//必填-页大小
request.setPageSize(10L);
//必填-当前页码从1开始计数
request.setCurrentPage(1L);
//hint 此处可能会抛出异常,注意catch
QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
//获取返回结果
if(querySendDetailsResponse.getCode() != null && querySendDetailsResponse.getCode().equals("OK")){
//代表请求成功
System.out.println("短信明细查询接口返回数据----------------");
System.out.println("Code=" + querySendDetailsResponse.getCode());
System.out.println("Message=" + querySendDetailsResponse.getMessage());
int i = 0;
for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs())
{
System.out.println("SmsSendDetailDTO["+i+"]:");
System.out.println("Content=" + smsSendDetailDTO.getContent());
System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());
System.out.println("OutId=" + smsSendDetailDTO.getOutId());
System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());
System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());
System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());
}
System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());
System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());
}
}
-->短信消息API
这个API是阿里云在用户反馈后新增的一个API,支持:
支持上行消息接收、状态报告接收两项,两项下又依次支持MNS消息队列消费模式、HTTP批量推送模式。
只学习了MNS消息队列消费模式。
用户返回消息:12给发送短信的号码:
点击begin test后,可以得到如下的响应:
使用方式为:
确保如下jar包加入到了工程之中:
而后,在文件中新建类、方法:
public class ReceiveAlicomMsg {
private static Log logger=LogFactory.getLog(ReceiveAlicomMsg.class);
static class MyMessageListener implements MessageListener{
private Gson gson=new Gson();
public boolean dealMessage(Message message) {
// TODO Auto-generated method stub
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//消息的几个关键值
System.out.println("message receiver time from mns:" + format.format(new Date()));
System.out.println("message handle: " + message.getReceiptHandle());
System.out.println("message body: " + message.getMessageBodyAsString());
System.out.println("message id: " + message.getMessageId());
System.out.println("message dequeue count:" + message.getDequeueCount());
System.out.println("Thread:" + Thread.currentThread().getName());
try{
Map<String,Object> contentMap=gson.fromJson(message.getMessageBodyAsString(), HashMap.class);
//TODO 根据文档中具体的消息格式进行消息体的解析
String arg = (String) contentMap.get("arg");
//TODO 这里开始编写您的业务代码
}catch(com.google.gson.JsonSyntaxException e){
logger.error("error_json_format:"+message.getMessageBodyAsString(),e);
//理论上不会出现格式错误的情况,所以遇见格式错误的消息,只能先delete,否则重新推送也会一直报错
return true;
} catch (Throwable e) {
//您自己的代码部分导致的异常,应该return false,这样消息不会被delete掉,而会根据策略进行重推
return false;
}
//消息处理成功,返回true, SDK将调用MNS的delete方法将消息从队列中删除掉
return true;
}
}
}