通过本文您可以了解如何通过GlobeSmsReport获取国际短信状态报告。此接口针对SendMessageToGlobe发送短信接口设置回执接收。
前提条件
- 您已经注册阿里云账号并生成访问密钥(AccessKey),详情请参见创建AccessKey。
- 确保您可以在本地成功Ping以下三个地址:dysmsapi.aliyuncs.com或mns.cn-hangzhou.aliyuncs.com或dybaseapi.aliyuncs.com。
- 您已创建RAM用户(子用户),并已为RAM用户授权。具体操作,请参见为RAM用户授权。
- 您已仔细阅读回执消息简介与配置流程,了解回执消息模式、类型和配置流程。
国际短信回执消息GlobeSmsReport消息体格式
名称 | 类型 | 描述 | 示例 |
---|---|---|---|
to | String | 短信接收号码。 | 86134235**** |
status | String | 运营商返回的状态码。
|
2 |
message_id | String | 消息序列ID。 | 12441353 |
send_date | String | 转发给运营商的时间。 | 2017-06-01 10:00:00 |
receive_date | String | 收到运营商回执的时间。 | 2017-06-01 10:00:05 |
error_code | String | 错误码。 | SP_UNKNOW_ERROR |
error_description | String | 错误信息。 | 运营商未知错误 |
Demo下载
说明
- Demo下载成功后,部分jar包在lib目录下,您需要单击
Add as Library
完成引入,具体如下图所示。 - 可在pom.xml文件中查找Maven依赖并安装阿里云Java SDK。
示例代码
使用该示例时,您需要注意如下信息。
- 将AccessKey ID和AccessKey Secret换成您的AccessKey信息。
// 此处需要替换成开发者自己的AccessKey信息 String accessKeyId="accessKeyId"; String accessKeySecret="accessKeySecret";
messageType
换成您需要的消息类型,如短信回执(GlobeSmsReport)。短信服务支持的回执消息类型,请参见回执消息简介与配置流程。String messageType="messageType";//此处应该替换成上述消息类型
queueName
是MNS消息队列的名称,您可以登录短信服务控制台,在 国际短信页面查看。String queueName="queueName";//在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName,格式:Alicom-Queue-******GlobeSmsReport
- 以本文示例代码为例,您获取到的国际短信回执内容会由
dealMessage
方法处理,您可以把需要的短信回执内容的业务逻辑写在这个方法里。// 根据文档中具体的消息格式进行消息体的解析 String arg = (String) contentMap.get("arg"); // 这里开始编写您的业务代码
arg
代表回执消息体中的参数,可填写的值为:to、status、message_id、send_date、receive_date、error_code、error_description。
package com.alicom.mns.sample;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.alicom.mns.tools.DefaultAlicomMessagePuller;
import com.alicom.mns.tools.MessageListener;
import com.aliyun.mns.model.Message;
import com.google.gson.Gson;
/**
* 只能用于接收云通信的消息,不能用于接收其他业务的消息
* 短信上行消息接收demo
*/
public class ReceiveDemo {
private static Log logger=LogFactory.getLog(ReceiveDemo.class);
static class MyMessageListener implements MessageListener{
private Gson gson=new Gson();
@Override
public boolean dealMessage(Message message) {
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);
// 根据文档中具体的消息格式进行消息体的解析
String arg = (String) contentMap.get("arg");
// 这里开始编写您的业务代码
}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;
}
}
public static void main(String[] args) throws Exception, ParseException {
DefaultAlicomMessagePuller puller=new DefaultAlicomMessagePuller();
//设置异步线程池大小及任务队列的大小,还有无数据线程休眠时间
puller.setConsumeMinThreadSize(6);
puller.setConsumeMaxThreadSize(16);
puller.setThreadQueueSize(200);
puller.setPullMsgThreadSize(1);
//和服务端联调问题时开启,平时无需开启,消耗性能
puller.openDebugLog(false);
//此处需要替换成开发者自己的AK信息
String accessKeyId="accessKeyId";
String accessKeySecret="accessKeySecret";
/*
*将messageType和queueName替换成您需要的消息类型名称和对应的队列名称
*云通信产品下所有的回执消息类型:
*1:短信回执:SmsReport,
*2:短信上行:SmsUp
*3:国际短信回执:GlobeSmsReport
*4:语音呼叫:VoiceReport
*5:流量直冲:FlowReport
*/
String messageType="messageType";//此处应该替换成相应产品的消息类型
String queueName="queueName";//在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName,格式类似Alicom-Queue-******-GlobeSmsReport
puller.startReceiveMsg(accessKeyId,accessKeySecret, messageType, queueName, new MyMessageListener());
}
}