• Модуль: messageservice
  • Путь к файлу: ~/bitrix/modules/messageservice/lib/sender/sms/ednaruimhpx.php
  • Класс: BitrixMessageServiceSenderSmsEdnaruImHpx
  • Вызов: EdnaruImHpx::parseIncomingRequest
public function parseIncomingRequest(string $incomingRequestBody): Result
{
	$result = new Result();
	$parseResult = $this->parseXml($incomingRequestBody);
	if (!$parseResult->isSuccess())
	{
		return $result->addErrors($parseResult->getErrors());
	}

	/** @var SimpleXMLElement $incomingRequest */
	$incomingRequest = $parseResult->getData()['root'];

	// incoming messages are not supported yet
	if ($incomingRequest->getName() != 'provideInstantMessageDlvStatusResponse')
	{
		return $result;
	}

	// hack to convert SimpleXMLElement to array
	$incomingRequest = Json::decode(Json::encode($incomingRequest));
	if (
		!isset($incomingRequest['payload'])
		|| (!isset($incomingRequest['payload']['code'])
			&& !isset($incomingRequest['payload']['instantMessageList'])
		)
	)
	{
		return $result->addError(new Error('Wrong XML structure'));
	}

	$statusUpdateList = [];

	// If response contains only one message delivery report -  element will contain the report
	// If response contains more than on message delivery report -  element will contain array of reports
	$instantMessageList = $incomingRequest['payload']['instantMessageList']['instantMessage'];
	if (!is_array($instantMessageList))
	{
		//empty list
		return $result->setData($statusUpdateList);
	}

	if (Collection::isAssociative($instantMessageList))
	{
		$instantMessageList = [$instantMessageList];
	}

	foreach ($instantMessageList as $instantMessage)
	{
		$statusUpdateList[] = new DTOStatusUpdate([
			'externalId' => (int)$instantMessage['@attributes']['providerId'],
			'providerStatus' => $instantMessage['instantMessageDlvStatus']['dlvStatus'],
			'deliveryStatus' => static::resolveStatus($instantMessage['instantMessageDlvStatus']['dlvStatus']),
			'deliveryError' => $instantMessage['instantMessageDlvStatus']['dlvError']
		]);
	}

	return $result->setData($statusUpdateList);
}