tokenGetter = new TokenGetterForAlicom(
$accountId,
$accessKeyId,
$accessKeySecret
);
}
/**
* 获取消息
*
* @param string $messageType 消息类型: SmsReport | SmsUp
* @param string $queueName 在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName
(e.g. Alicom-Queue-xxxxxx-SmsReport)
* @param callable $callback
* 回调仅接受一个消息参数;
*
回调返回true,则工具类自动删除已拉取的消息;
*
回调返回false,消息不删除可以下次获取.
*
(e.g. function ($message) { return true; }
*
*/
public function receiveMsg($messageType, $queueName, callable $callback)
{
$i = 0;
// 取回执消息失败3次则停止循环拉取
while ( $i < 3) {
try
{
// 取临时token
$tokenForAlicom = $this->tokenGetter->getTokenByMessageType($messageType, $queueName);
// 使用MNSClient得到Queue
$queue = $tokenForAlicom->getClient()->getQueueRef($queueName);
// 接收消息,并根据实际情况设置超时时间
$res = $queue->receiveMessage(2);
// 计算消息体的摘要用作校验
$bodyMD5 = strtoupper(md5(base64_encode($res->getMessageBody())));
// 比对摘要,防止消息被截断或发生错误
if ($bodyMD5 == $res->getMessageBodyMD5())
{
// 执行回调
if(call_user_func($callback, json_decode($res->getMessageBody())))
{
// 当回调返回真值时,删除已接收的信息
$receiptHandle = $res->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');
$demo = new MsgDemo(
"1943695596114318", // 此处不需要替换修改!
"yourAccessKeyId", // 请替换成您自己的AccessKeyId
"yourAccessKeySecret" // 请替换成您自己的AccessKeySecret
);
echo "MsgDemo::receiveMsg SmsReport\n";
$demo->receiveMsg(
// string $messageType 消息类型: SmsReport | SmsUp
"SmsReport",
// string $queueName 在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName
"Alicom-Queue-xxxxxxx-SmsReport",
/**
* 回调
* @param stdClass $message 消息数据
* @return bool 返回true,则工具类自动删除已拉取的消息。返回false,消息不删除可以下次获取
*/
function ($message) {
print_r($message);
return false;
}
);
echo "MsgDemo::receiveMsg SmsUp\n";
$demo->receiveMsg(
// string $messageType 消息类型: SmsReport | SmsUp
"SmsUp",
// string $queueName 在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName
"Alicom-Queue-xxxxxxx-SmsUp",
/**
* 回调
* @param stdClass $message 消息数据
* @return bool 返回true,则工具类自动删除已拉取的消息。返回false,消息不删除可以下次获取
*/
function ($message) {
print_r($message);
return false;
}
);