`. */ class PHPShopMoneta extends PHPShopCore { public function __construct() { parent::__construct(); } public function index() { $result = self::query('result'); $transactionId = self::query('MNT_TRANSACTION_ID'); $attempt = max(0, min(ReturnMessage::MAX_ATTEMPTS, (int) self::query('attempt'))); $message = $this->returnMessage($result, $transactionId, $attempt); if ($message === null) { $this->setError404(); return; } $orderUid = $message->getOrderUid(); $refreshUrl = $message->isWaiting() ? '?' . http_build_query([ 'result' => $result, 'MNT_TRANSACTION_ID' => $transactionId, 'attempt' => $attempt + 1, ]) : ''; $this->title = HostCharset::toPage($message->getTitle()); $this->set('monetaReturnIcon', $message->getIcon()); $this->set('monetaReturnTitle', self::escape($message->getTitle())); $this->set('monetaReturnText', self::escape($message->getText())); $this->set('monetaReturnOrderUrl', self::escape('/users/order.html?order_info=' . rawurlencode($orderUid) . '#Order')); $this->set('monetaReturnOrderHide', $orderUid === '' ? 'moneta-hide' : ''); $this->set('monetaReturnRefreshUrl', self::escape($refreshUrl)); $this->set('monetaReturnRefreshDelay', (string) ReturnMessage::REFRESH_DELAY_MS); // Ядро читает шаблон модуля как есть (cp1251) и не перекодирует его: на UTF-8-магазине // переменные и текст шаблона перекодируются вместе, один раз, уже после разбора. $this->parseTemplate($GLOBALS['SysValue']['templates']['moneta']['moneta_return_forma'], true); $this->Disp = HostCharset::toPage((string) $this->Disp); } /** * Заказ ищется по номеру из `MNT_TRANSACTION_ID` и показывается только владельцу * ({@see ReturnAccess::findOrder()}). Сбой БД страницу не роняет: покупатель увидит текст по `result`. */ private function returnMessage(string $result, string $transactionId, int $attempt): ?ReturnMessage { $order = null; $paidByJournal = false; $settings = null; $transactionGiven = $transactionId !== ''; try { $settings = (new SettingsRepository())->load(); if ($transactionGiven) { $order = ReturnAccess::findOrder( $transactionId, new OrderRepository(), (int) ($_SESSION['UsersId'] ?? 0), $_SESSION[ReturnAccess::SESSION_KEY] ?? null, ); if ($order !== null) { $paidByJournal = (new OperationRepository(Database::fromHost()))->findPaidOperation($order->getId()) !== null; } } } catch (\Throwable $exception) { (new ErrorLogLogger())->error( 'Страница возврата без статуса заказа: ' . get_class($exception) . ': ' . $exception->getMessage(), ); $order = null; $transactionGiven = false; } return ReturnMessage::resolve( $result, $transactionGiven, $order, $paidByJournal, $settings ?? Settings::fromRow([]), $attempt, ); } private static function query(string $name): string { return isset($_GET[$name]) && is_string($_GET[$name]) ? $_GET[$name] : ''; } private static function escape(string $value): string { return htmlspecialchars($value, ENT_QUOTES, 'Windows-1251'); } }