(e.g. Alicom-Queue-xxxxxx-xxxxxReport) * @param callable $callback

* 回调仅接受一个消息参数; *
回调返回true,则工具类自动删除已拉取的消息; *
回调返回false,消息不删除可以下次获取. *
(e.g. function ($message) { return true; } *

*/ public static function receiveMsg($messageType, $queueName, callable $callback) { $i = 0; // 取回执消息失败3次则停止循环拉取 while ( $i < 3) { try { // 取临时token $tokenForAlicom = static::getTokenGetter()->getTokenByMessageType($messageType, $queueName); // 使用MNSClient得到Queue $queue = $tokenForAlicom->getClient()->getQueueRef($queueName); // ------------------------------------------------------------------ // 1. 单次接收消息,并根据实际情况设置超时时间 $message = $queue->receiveMessage(2); // 计算消息体的摘要用作校验 $bodyMD5 = strtoupper(md5(base64_encode($message->getMessageBody()))); // 比对摘要,防止消息被截断或发生错误 if ($bodyMD5 == $message->getMessageBodyMD5()) { // 执行回调 if(call_user_func($callback, json_decode($message->getMessageBody()))) { // 当回调返回真值时,删除已接收的信息 $receiptHandle = $message->getReceiptHandle(); $queue->deleteMessage($receiptHandle); } } // ------------------------------------------------------------------ // ------------------------------------------------------------------ // 2. 批量接收消息 // $res = $queue->batchReceiveMessage(new BatchReceiveMessageRequest(10, 5)); // 每次拉取10条,超时等待时间5秒 // /* @var \AliyunMNS\Model\Message[] $messages */ // $messages = $res->getMessages(); // foreach($messages as $message) { // // 计算消息体的摘要用作校验 // $bodyMD5 = strtoupper(md5(base64_encode($message->getMessageBody()))); // // 比对摘要,防止消息被截断或发生错误 // if ($bodyMD5 == $message->getMessageBodyMD5()) // { // // 执行回调 // if(call_user_func($callback, json_decode($message->getMessageBody()))) // { // // 当回调返回真值时,删除已接收的信息 // $receiptHandle = $message->getReceiptHandle(); // $queue->deleteMessage($receiptHandle); // } // } // } // ------------------------------------------------------------------ return; // 整个取回执消息流程完成后退出 } catch (MnsException $e) { $i++; echo "ex:{$e->getMnsErrorCode()}\n"; echo "ReceiveMessage Failed: {$e}\n"; } } } } // 调用示例: header('Content-Type: text/plain; charset=utf-8'); echo "消息接口查阅短信状态报告返回结果:\n"; MsgDemo::receiveMsg( // 消息类型,SmsReport: 短信状态报告 "SmsReport", // 在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName "Alicom-Queue-xxxxxxxx-SmsReport", /** * 回调 * @param stdClass $message 消息数据 * @return bool 返回true,则工具类自动删除已拉取的消息。返回false,消息不删除可以下次获取 */ function ($message) { print_r($message); return false; } ); echo "消息接口查阅短信服务上行返回结果:\n"; MsgDemo::receiveMsg( // 消息类型,SmsUp: 短信服务上行 "SmsUp", // 在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName "Alicom-Queue-xxxxxxxx-SmsUp", /** * 回调 * @param stdClass $message 消息数据 * @return bool 返回true,则工具类自动删除已拉取的消息。返回false,消息不删除可以下次获取 */ function ($message) { print_r($message); return false; } );