• Модуль: messageservice
  • Путь к файлу: ~/bitrix/modules/messageservice/lib/Providers/Edna/SMS/ExternalSender.php
  • Класс: Bitrix\MessageService\Providers\Edna\SMS\ExternalSender
  • Вызов: ExternalSender::callExternalMethod
public function callExternalMethod(string $method, ?array $requestParams = null, string $httpMethod = ''): HttpRequestResult
{
	if ($this->apiKey === '')
	{
		$result = new HttpRequestResult();
		$result->addError(new Error('Missing API key when requesting a service.'));

		return $result;
	}
	$url = $this->apiEndpoint . $method;
	$queryMethod = HttpClient::HTTP_GET;

	$httpClient = new HttpClient([
		'socketTimeout' => $this->socketTimeout,
		'streamTimeout' => $this->streamTimeout,
		'waitResponse' => true,
		'version' => HttpClient::HTTP_1_1,
	]);
	$httpClient->setHeader('User-Agent', static::USER_AGENT);
	$httpClient->setHeader('Content-type', static::CONTENT_TYPE);
	$httpClient->setHeader('X-API-KEY', $this->apiKey);
	$httpClient->setCharset(static::CHARSET);

	if (is_array($requestParams))
	{
		$queryMethod = HttpClient::HTTP_POST;
		$requestParams = Json::encode($requestParams);
	}

	$result = new HttpRequestResult();
	$result->setHttpRequest(new DTO\Request([
		'method' => $queryMethod,
		'uri' => $url,
		'headers' => method_exists($httpClient, 'getRequestHeaders') ? $httpClient->getRequestHeaders()->toArray() : [],
		'body' => $requestParams
	]));

	$answer = [];
	$errorInfo = [];
	if ($httpClient->query($queryMethod, $url, $requestParams))
	{
		$answer = $this->parseExternalAnswer($httpClient->getResult());

		if ($httpClient->getStatus() !== 200)
		{
			$errorInfo = [
				'code' => $httpClient->getStatus(),
				'error' => $this->getMessageByErrorCode('error-' . $httpClient->getStatus()),
			];
		}
	}
	else
	{
		$error = $httpClient->getError();
		$errorInfo = [
			'code' => key($error),
			'error' => current($error),
		];
	}
	$result->setHttpResponse(new DTO\Response([
		'statusCode' => $httpClient->getStatus(),
		'headers' => $httpClient->getHeaders()->toArray(),
		'body' => $httpClient->getResult(),
		'error' => Util::getHttpClientErrorString($httpClient)
	]));

	$result->setData($answer);

	if (array_key_exists('code', $errorInfo) && $errorInfo['code'] !== 'ok')
	{
		$result->addError(new Error($errorInfo['error'], $errorInfo['code'], $errorInfo));
	}

	return $result;
}