- Модуль: 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;
}