• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/paysystem/service.php
  • Класс: BitrixSalePaySystemService
  • Вызов: Service::processRequest
public function processRequest(Request $request)
{
	$processResult = new Result();

	if (!($this->handler instanceof ServiceHandler))
	{
		return $processResult;
	}

	$debugInfo = http_build_query($request->toArray(), "", "n");
	if (empty($debugInfo))
	{
		$debugInfo = file_get_contents("php://input");
	}
	Logger::addDebugInfo(
		get_class($this->handler)." ProcessRequest. paySystemId=".$this->getField("ID").", request=".($debugInfo ? $debugInfo : "empty")
	);

	$paymentId = $this->handler->getPaymentIdFromRequest($request);

	if (empty($paymentId))
	{
		$processResult->addError(new Error(Loc::getMessage('SALE_PS_SERVICE_PAYMENT_ERROR_EMPTY')));

		Logger::addError(
			get_class($this->handler).'. ProcessRequest: '.Loc::getMessage('SALE_PS_SERVICE_PAYMENT_ERROR_EMPTY')
		);

		return $processResult;
	}

	[$orderId, $paymentId] = Manager::getIdsByPayment($paymentId, $this->getField('ENTITY_REGISTRY_TYPE'));

	if (!$orderId)
	{
		$errorMessage = str_replace('#ORDER_ID#', $orderId, Loc::getMessage('SALE_PS_SERVICE_ORDER_ERROR'));
		$processResult->addError(new Error($errorMessage));

		Logger::addError(get_class($this->handler).'. ProcessRequest: '.$errorMessage);

		return $processResult;
	}

	$registry = Registry::getInstance($this->getField('ENTITY_REGISTRY_TYPE'));
	/** @var Order $orderClassName */
	$orderClassName = $registry->getOrderClassName();

	$order = $orderClassName::load($orderId);
	if (!$order)
	{
		$errorMessage = str_replace('#ORDER_ID#', $orderId, Loc::getMessage('SALE_PS_SERVICE_ORDER_ERROR'));
		$processResult->addError(new Error($errorMessage));

		Logger::addError(get_class($this->handler).'. ProcessRequest: '.$errorMessage);

		return $processResult;
	}

	if ($order->isCanceled())
	{
		$errorMessage = str_replace('#ORDER_ID#', $orderId, Loc::getMessage('SALE_PS_SERVICE_ORDER_CANCELED'));
		$processResult->addError(new Error($errorMessage));

		Logger::addError(get_class($this->handler).'. ProcessRequest: '.$errorMessage);

		return $processResult;
	}

	/** @var BitrixSalePaymentCollection $collection */
	$collection = $order->getPaymentCollection();

	/** @var BitrixSalePayment $payment */
	$payment = $collection->getItemById($paymentId);

	if (!$payment)
	{
		$errorMessage = str_replace('#PAYMENT_ID#', $paymentId, Loc::getMessage('SALE_PS_SERVICE_PAYMENT_ERROR'));
		$processResult->addError(new Error($errorMessage));

		Logger::addError(get_class($this->handler).'. ProcessRequest: '.$errorMessage);

		return $processResult;
	}

	/** @var BitrixSalePaySystemServiceResult $serviceResult */
	$serviceResult = $this->handler->processRequest($payment, $request);
	if ($serviceResult->isSuccess())
	{
		$status = null;
		$operationType = $serviceResult->getOperationType();

		if ($operationType === ServiceResult::MONEY_COMING)
		{
			$status = 'Y';
		}
		else if ($operationType === ServiceResult::MONEY_LEAVING)
		{
			$status = 'N';
		}

		if ($status !== null)
		{
			$event = new Event('sale', self::EVENT_ON_BEFORE_PAYMENT_PAID,
				array(
					'payment' => $payment,
					'status' => $status,
					'pay_system_id' => $this->getField('ID')
				)
			);
			$event->send();

			if ($status === 'N')
			{
				$payment->setFieldsNoDemand([
					'IS_RETURN' => Payment::RETURN_PS,
					'PAY_RETURN_DATE' => new Date(),
				]);
			}

			$paidResult = $payment->setPaid($status);
			if (!$paidResult->isSuccess())
			{
				$error = 'PAYMENT SET PAID: '.join(' ', $paidResult->getErrorMessages());
				Logger::addError(get_class($this->handler).'. ProcessRequest: '.$error);

				$serviceResult->setResultApplied(false);
			}
		}

		$psData = $serviceResult->getPsData();
		if ($psData)
		{
			$res = $payment->setFields($psData);
			if (!$res->isSuccess())
			{
				$error = 'PAYMENT SET PAID: '.join(' ', $res->getErrorMessages());
				Logger::addError(get_class($this->handler).'. ProcessRequest: '.$error);

				$serviceResult->setResultApplied(false);
			}
		}

		$saveResult = $order->save();

		if (!$saveResult->isSuccess())
		{
			$error = 'ORDER SAVE: '.join(' ', $saveResult->getErrorMessages());
			Logger::addError(get_class($this->handler).'. ProcessRequest: '.$error);

			$serviceResult->setResultApplied(false);
		}

		PullManager::onSuccessfulPayment($payment);
	}
	else
	{
		$serviceResult->setResultApplied(false);
		$processResult->addErrors($serviceResult->getErrors());

		$error = implode("n", $serviceResult->getErrorMessages());
		Logger::addError(get_class($this->handler).'. ProcessRequest Error: '.$error);

		(new PaymentMarker($this, $payment))
			->mark($serviceResult)
			->save()
		;

		PullManager::onFailurePayment($payment);
	}

	$event = new Event(
		'sale',
		self::EVENT_ON_AFTER_PROCESS_REQUEST,
		[
			'payment' => $payment,
			'serviceResult' => $serviceResult,
			'request' => $request,
		]
	);
	$event->send();

	$this->handler->sendResponse($serviceResult, $request);

	return $processResult;
}