172 lines
5.7 KiB
PHP
172 lines
5.7 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace MonetaPhpShop\host;
|
|
|
|
use DateTimeImmutable;
|
|
use MonetaPhpShop\CmsInfo;
|
|
use MonetaPhpShop\form\ReturnAccess;
|
|
use MonetaPhpShop\ModuleInfo;
|
|
|
|
/**
|
|
* Îêðóæåíèå ìàãàçèíà: àäðåñà, âàëþòà, ÿçûê, âåðñèè. API äëÿ ýòîãî ó PHPShop íåò — äàííûå ëåæàò
|
|
* â ãëîáàëüíûõ ïåðåìåííûõ, êîòîðûå ÿäðî çàïîëíÿåò ïðè çàïóñêå, è øòàòíûå ìîäóëè ÷èòàþò èõ òàê æå:
|
|
* - `$GLOBALS['SysValue']` — ðàçîáðàííûé `phpshop/inc/config.ini` (êàòàëîã óñòàíîâêè, âåðñèÿ ÿäðà);
|
|
* - `$GLOBALS['PHPShopSystem']` — íàñòðîéêè âèòðèíû (âàëþòà, çíàêè ïîñëå òî÷êè, çíàê âàëþòû);
|
|
* - `$_SERVER` — õîñò è HTTPS òåêóùåãî çàïðîñà, `$_SESSION` — ÿçûê âèòðèíû è çàêàçû ïîêóïàòåëÿ.
|
|
* Âñå îáðàùåíèÿ ê íèì ñîáðàíû çäåñü, ÷òîáû îñòàëüíûå êëàññû ìîäóëÿ ïîëó÷àëè çíà÷åíèÿ
|
|
* ïàðàìåòðàìè è ïðîâåðÿëèñü òåñòàìè áåç ÿäðà. Åñëè îáúåêòà ÿäðà íåò, ìåòîäû âîçâðàùàþò
|
|
* ïóñòîå çíà÷åíèå, à íå ïàäàþò.
|
|
*/
|
|
final class ShopContext
|
|
{
|
|
/** Ïóòü ñòðàíèöû âîçâðàòà ïîêóïàòåëÿ (`[core] moneta` â `inc/config.ini`). */
|
|
private const RETURN_PAGE = '/moneta/';
|
|
|
|
/** Åäèíàÿ òî÷êà Check URL è Pay URL. */
|
|
private const CALLBACK_PATH = '/phpshop/modules/' . ModuleInfo::PATH . '/payment/callback.php';
|
|
|
|
/**
|
|
* Àäðåñ ìàãàçèíà: ñõåìà + õîñò (ÿäðî ñòðîèò ññûëêè èç `SERVER_NAME`) + êàòàëîã óñòàíîâêè.
|
|
*/
|
|
public function baseUrl(): string
|
|
{
|
|
$host = (string) ($_SERVER['SERVER_NAME'] ?? '');
|
|
|
|
return ($this->isHttps() ? 'https://' : 'http://') . $host . $this->basePath();
|
|
}
|
|
|
|
public function returnPageUrl(): string
|
|
{
|
|
return $this->baseUrl() . self::RETURN_PAGE;
|
|
}
|
|
|
|
/**
|
|
* Ïóòü ñòðàíèöû âîçâðàòà îò êîðíÿ ñàéòà, áåç ñõåìû è õîñòà — äëÿ `Location` õóêîâ `/success`
|
|
* è `/fail`. `SERVER_NAME` íà Apache ïî óìîë÷àíèþ áåð¸òñÿ èç çàãîëîâêà `Host` çàïðîñà, è
|
|
* êýøèðóþùèé ïðîêñè ïåðåä ìàãàçèíîì ìîã áû ðàçäàòü ðåäèðåêò íà ÷óæîé õîñò.
|
|
*/
|
|
public function returnPagePath(): string
|
|
{
|
|
return $this->basePath() . self::RETURN_PAGE;
|
|
}
|
|
|
|
public function callbackUrl(): string
|
|
{
|
|
return $this->baseUrl() . self::CALLBACK_PATH;
|
|
}
|
|
|
|
/**
|
|
* ISO-êîä âàëþòû çàêàçà ñ ó÷¸òîì âèòðèíû (ìóëüòèñàéò).
|
|
*/
|
|
public function orderCurrency(): string
|
|
{
|
|
$system = $GLOBALS['PHPShopSystem'] ?? null;
|
|
if (!is_object($system) || !method_exists($system, 'getDefaultValutaIso')) {
|
|
return '';
|
|
}
|
|
|
|
return (string) $system->getDefaultValutaIso(true);
|
|
}
|
|
|
|
/**
|
|
* ßçûê âèòðèíû òåêóùåãî ïîêóïàòåëÿ: ÿäðî êëàä¸ò åãî â ñåññèþ (`PHPShopElements`).
|
|
*/
|
|
public function shopLocale(): string
|
|
{
|
|
$locale = $_SESSION['lang'] ?? '';
|
|
|
|
return is_string($locale) ? $locale : '';
|
|
}
|
|
|
|
/**
|
|
* Çàïîìíèòü â ñåññèè ïîêóïàòåëÿ çàêàç, ôîðìó îïëàòû êîòîðîãî åìó ïîêàçàëè: ïî íåìó ñòðàíèöà
|
|
* âîçâðàòà ïîêàæåò ñòàòóñ è ãîñòþ, îôîðìèâøåìó çàêàç áåç âõîäà ({@see ReturnAccess}).
|
|
*/
|
|
public function rememberPayableOrder(int $orderId): void
|
|
{
|
|
if (session_status() !== PHP_SESSION_ACTIVE) {
|
|
return;
|
|
}
|
|
$_SESSION[ReturnAccess::SESSION_KEY] = ReturnAccess::remember(
|
|
$_SESSION[ReturnAccess::SESSION_KEY] ?? null,
|
|
$orderId,
|
|
);
|
|
}
|
|
|
|
/**
|
|
* ID âîøåäøåãî ïîêóïàòåëÿ (`$_SESSION['UsersId']`); 0 — íå âîø¸ë.
|
|
*/
|
|
public function sessionUserId(): int
|
|
{
|
|
return (int) ($_SESSION['UsersId'] ?? 0);
|
|
}
|
|
|
|
/**
|
|
* Çíàêîâ ïîñëå òî÷êè â öåíàõ âèòðèíû (`admoption.price_znak`).
|
|
*/
|
|
public function priceDecimals(): int
|
|
{
|
|
$system = $GLOBALS['PHPShopSystem'] ?? null;
|
|
if (!is_object($system) || !method_exists($system, 'getSerilizeParam')) {
|
|
return 0;
|
|
}
|
|
|
|
return (int) $system->getSerilizeParam('admoption.price_znak');
|
|
}
|
|
|
|
/**
|
|
* Çíàê âàëþòû çàêàçà òàê, êàê åãî âûâîäèò âèòðèíà: äëÿ ðóáëÿ ÿäðî îòäà¸ò
|
|
* `<span class=rubznak>p</span>` — øðèôò òåìû ðèñóåò «p» çíàêîì ðóáëÿ; äëÿ äðóãîé âàëþòû —
|
|
* îáîçíà÷åíèå èç ñïðàâî÷íèêà. HTML ÿäðà, â cp1251.
|
|
*/
|
|
public function currencyIcon(): string
|
|
{
|
|
$system = $GLOBALS['PHPShopSystem'] ?? null;
|
|
if (!is_object($system) || !method_exists($system, 'getValutaIcon')) {
|
|
return '';
|
|
}
|
|
|
|
return HostCharset::fromDatabase(trim((string) $system->getValutaIcon(true)));
|
|
}
|
|
|
|
/**
|
|
* `MNT_CMS`: âåðñèÿ PHPShop — èç `[upload] version` êîíôèãà ÿäðà (`670`).
|
|
*/
|
|
public function cms(): string
|
|
{
|
|
$uploadVersion = (string) ($GLOBALS['SysValue']['upload']['version'] ?? '');
|
|
|
|
return CmsInfo::format(CmsInfo::hostVersion($uploadVersion), PHP_VERSION, ModuleInfo::VERSION);
|
|
}
|
|
|
|
/**
|
|
* Òåêóùåå âðåìÿ. Ïîÿñ âûñòàâëÿåò ÿäðî èç íàñòðîåê ìàãàçèíà (`PHPShopSystem::setTimeZone()`),
|
|
* à åñëè íàñòðîéêà ïóñòà èëè íåâåðíà — äåéñòâóåò ïîÿñ PHP ñåðâåðà; ìåòêå
|
|
* `MNT_TRANSACTION_ID` ýòî íåâàæíî, îíà ïèøåòñÿ â UTC.
|
|
*/
|
|
public function now(): DateTimeImmutable
|
|
{
|
|
return new DateTimeImmutable('now');
|
|
}
|
|
|
|
/**
|
|
* Êàòàëîã óñòàíîâêè PHPShop áåç ñëýøà íà êîíöå (`[dir] dir` â `inc/config.ini`), ïóñòî — â êîðíå ñàéòà.
|
|
*/
|
|
private function basePath(): string
|
|
{
|
|
return rtrim((string) ($GLOBALS['SysValue']['dir']['dir'] ?? ''), '/');
|
|
}
|
|
|
|
private function isHttps(): bool
|
|
{
|
|
$https = strtolower((string) ($_SERVER['HTTPS'] ?? ''));
|
|
if (($https !== '') && ($https !== 'off')) {
|
|
return true;
|
|
}
|
|
|
|
return strtolower((string) ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '')) === 'https';
|
|
}
|
|
}
|