简介
当您使用短信的API接口发送短信后,可以通过使用MNS的Queue模型来接收短信的回执消息,假如服务出现异常情况时(如网络问题),导致消息回执未成功获取,还可以通过短信发送状态查询API接口进行一定的补偿(目前支持30天内发送记录的查询)。
消息的订阅
- 云通信的所有业务消息都用过MNS消息服务向外发送。用户每订阅一个类别的消息(比如上行短信消息SmsUp),系统都会为用户分配一个独立的消息队列。
- 用户可以通过阿里云账号拿到一个临时的token用于获取队列中的消息。用户可以下载demo,编写简单的消息处理类即可完成消息处理的任务。
- 在页面上订阅消息,订阅完消息后,能拿到消息队列名称(queueName)。比如:Alicom-Queue-xxxxxx-SmsReport 。队列名字每个用户都不同。
消息类型
短信提供2种消息类型SmsReport(短信回执报告消息) 和 SmsUp(上行短信消息)
- 通过订阅SmsReport短信状态报告,可以获知每条短信的发送情况,了解短信是否达到终端用户的状态与相关信息
- 通过订阅SmsUp上行短信消息,可以获知终端用户回复短信的内容
短信回执消息SmsReport消息体格式
上行短信消息SmsUp
技术对接步骤
下载消息SDK
下载对应短信的消息DEMO工程,工程所需要的所有依赖php包都放在DEMO工程的目录下,将对于的php包引入到您的工程当中既可按照DEMO样例编写接收消息的程序。
SDK&DEMO[
下载地址]
编写样例程序
<pre style='background: rgb(246, 246, 246); font: 12px/1.6 "YaHei Consolas Hybrid", Consolas, "Meiryo UI", "Malgun Gothic", "Segoe UI", "Trebuchet MS", Helvetica, monospace, monospace; padding: 10px; outline: 0px; border-radius: 3px; border: 1px solid rgb(221, 221, 221); color: rgb(51, 51, 51); text-transform: none; text-indent: 0px; letter-spacing: normal; overflow: auto; margin-top: 0px; margin-right: 0px; margin-bottom: 0px !important; margin-left: 0px; word-spacing: 0px; white-space: pre-wrap; word-wrap: break-word; box-sizing: border-box; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;' prettyprinted?="" linenums="">
- class ReceiveAlicomMsgDemo {
- public function dealMessage($message) {
- echo $message;
- //TODO 这里开始写业务代码
- return true;//返回true,则工具类自动删除已拉取的消息。返回false,消息不删除可以下次获取
- }
- public function receiveMsg(){
- //此处需要替换成开发者自己的AK
- $accessKeyId = "your_accessKeyId";
- $accessKeySecret = "your_accessKeySecret";
- $messageType = "SmsReport";//短信回执:SmsReport,短息上行:SmsUp,语音呼叫:VoiceReport,流量直冲:FlowReport
- $queueName = "your_queueName"; //在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName
- DefaultProfile::addEndpoint("cn-hangzhou","cn-hangzhou","Dybaseapi","dybaseapi.aliyuncs.com");
- $tokenGetterForAlicom = new TokenGetterForAlicom($accessKeyID,$accessKeySecret);
- $i = 0;
- while ( $i <= 3) {//取回执消息失败5 次停止循环拉取
- $i++;
- try
- {
- $tokenForAlicom = $tokenGetterForAlicom->getToeknByMessageType($messageType,$queueName);
- $queue = $tokenForAlicom->getClient()->getQueueRef($queueName);
- // 3. receive message
- $receiptHandle = NULL;
- // when receiving messages, it's always a good practice to set the waitSeconds to be 30.
- // it means to send one http-long-polling request which lasts 30 seconds at most.
- $res = $queue->receiveMessage(2);
- echo "ReceiveMessage Succeed! \n";
- $bodyMD5 = md5(base64_encode($res->getMessageBody()));
- $receiptHandle = $res->getReceiptHandle();
- if (strtoupper($bodyMD5) == $res->getMessageBodyMD5())
- {
- if($this->dealMessage($res->getMessageBody())){
- $res = $queue->deleteMessage($receiptHandle);
- echo "DeleteMessage Succeed! \n";
- }
- }
- }
- catch (MnsException $e)
- {
- echo "ex:".($e->getMnsErrorCode()) ;
- echo "ReceiveMessage Failed: " . $e;
- echo "<br>";
- #return;
- }
- }
- }
- }
- $demo = new ReceiveAlicomMsgDemo();
- $demo->receiveMsg();
- echo "<br>end";