短信回执消息API---Java
本文为您介绍Java调用短信回执消息API的操作流程。
当前页面为旧版SDK和API,已不再维护。我们强烈推荐您使用新版SDK及配套的API接口,详情请参见回执消息简介与配置流程。
如您仍需访问和使用旧版SDK和API,可继续阅读本文。
简介
当您使用短信的API接口发送短信后,可以通过使用MNS的Queue模型来接收短信的回执消息,假如服务出现异常情况时(如网络问题),导致消息回执未成功获取,还可以通过短信发送记录查询API接口进行一定的补偿(目前支持30天内发送记录的查询,可查询一天的发送数据)。
消息的订阅
云通信的所有业务消息都通过MNS消息服务向外发送。用户每订阅一个类别的消息(比如上行短信消息SmsUp),系统都会为用户分配一个独立的消息队列。
用户可以通过阿里云账号拿到一个临时的token用于获取队列中的消息。用户可以下载demo,编写简单的消息处理类即可完成消息处理的任务。
在页面上订阅消息,订阅完消息后,能拿到消息队列名称(queueName)。比如:Alicom-Queue-xxxxxx-SmsReport 。队列名字每个用户都不同。
路径:短信产品进入控制台→应用开发→接口调用→云通信消息接收→短信状态报告接收→向右滑动 (MNS消息队列消费模式。接收消息队列信息,请下载消息服务SDK进行程序编写,详见API文档)位置如下图所有示; 点击进入控制台。
消息类型
短信提供2种消息类型SmsReport(短信回执报告消息)和SmsUp(上行短信消息)。
通过订阅SmsReport短信状态报告,可以获知每条短信的发送情况,了解短信是否达到终端用户的状态与相关信息。
通过订阅SmsUp上行短信消息,可以获知终端用户回复短信的内容。
短信回执消息SmsReport消息体格式
名称 | 类型 | 描述 | 示例 |
---|---|---|---|
phone_number | String | 短信接收号码 | 1390000**** |
success | Boolean | 发送是否成功 | true |
biz_id | String | 发送回执ID | 1234^345 |
out_id | String | 调用发送短信接口时传的outId | 123456 |
send_time | String | 转发给运营商的时间 | 2017-06-01 10:00:00 |
report_time | String | 收到运营商回执的时间 | 2017-06-01 10:00:05 |
err_code | String | 错误码 | UNKNOW |
err_msg | String | 错误信息 | 未知异常 |
sms_size | String | 140字节算一条短信,短信长度超过140字节时会拆分成多条短信发送 | 1,2,3 |
上行短信消息SmsUp
名称 | 类型 | 描述 | 示例 |
---|---|---|---|
phone_number | String | 短信接收号码 | 1390000**** |
content | String | 短信内容 | true |
sign_name | String | 短信签名 | 【阿里云】 |
send_time | String | 时间 | 2017-06-01 10:00:00 |
dest_code | String | 扩展码 | 123456 |
sequence_id | Double | 消息序列ID | 123456 |
技术对接步骤
下载消息SDK
下载对应短信的消息DEMO工程,工程所需要的所有依赖jar包都放在DEMO工程的lib目录下,将对于的jar包引入到您的工程当中既可按照DEMO样例编写接收消息的程序。
SDK&DEMO[下载地址]
/**
* 只能用于接收云通信的消息,不能用于接收其他业务的消息
*/
public class ReceiveAlicomMsgDemo {
private static Log logger=LogFactory.getLog(ReceiveAlicomMsgDemo.class);
//以短信回执消息处理为例
static class MyMessageListener implements MessageListener{
private Gson gson=new Gson();
@Override
public boolean dealMessage(Message message) {
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());
//以短信回执消息处理为例
try{
Map<String,Object> contentMap=gson.fromJson(message.getMessageBodyAsString(), HashMap.class);
String phoneNumber=(String)contentMap.get("phone_number");
Boolean success=(Boolean)contentMap.get("success");
String bizId=(String)contentMap.get("biz_id");
String outId=(String)contentMap.get("out_id");
String sendTime=(String)contentMap.get("send_time");
String reportTime=(String)contentMap.get("report_time");
String errCode=(String)contentMap.get("err_code");
String errMsg=(String)contentMap.get("err_msg");
//TODO 这里开始写业务代码
}catch(com.google.gson.JsonSyntaxException e){
logger.error("error_json_format:"+message.getMessageBodyAsString(),e);
}
Boolean dealResult=true;
return dealResult;//返回true,则工具类自动删除已拉取的消息。
}
}
public static void main(String[] args) throws com.aliyuncs.exceptions.ClientException, ParseException {
DefaultAlicomMessagePuller puller=new DefaultAlicomMessagePuller();
String accessKeyId="yourAccessKeyId";
String accessKeySecret="yourAccessKeySecret";
String messageType="SmsReport";//短信回执:SmsReport,短信上行:SmsUp
String queueName="yourQueueName";//在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName
puller.startReceiveMsg(accessKeyId,accessKeySecret ,messageType,queueName , new MyMessageListener());
}
}