feat: moneta 2.0, MONETA.Assistant payment module for PHPShop 6.7+

This commit is contained in:
2026-10-27 11:45:22 +03:00
parent 78b7405637
commit f8c12ce44a
82 changed files with 7387 additions and 58 deletions
+115
View File
@@ -0,0 +1,115 @@
<?php
declare(strict_types=1);
namespace MonetaPhpShop\callback;
use MonetaPhpShop\order\PaymentEligibility;
use MonetaPhpShop\protocol\ResultCode;
/**
* ×òî ìîäóëü ñäåëàë ñ ïîäïèñàííûì óâåäîìëåíèåì — êîëîíêà `event` æóðíàëà îïåðàöèé.
* Çíà÷åíèÿ ïåðñèñòÿòñÿ è ïîêàçûâàþòñÿ â æóðíàëå àäìèíêè — íå ïåðåèìåíîâûâàòü.
* Ïðè÷èíû îòêàçà ïî çàêàçó áåðóòñÿ èç {@see \MonetaPhpShop\order\PaymentEligibility}.
*/
final class CallbackEvent
{
/** Ïðîâåðî÷íûé çàïðîñ, çàêàç ìîæíî îïëàòèòü (402 èëè 100). */
public const CHECKED = 'checked';
/** Îïëàòà çà÷òåíà: çàêàç ïåðåâåä¸í â ñòàòóñ «ïîñëå îïëàòû». */
public const PAID = 'paid';
/** Îïëàòà çà÷òåíà, íî çàêàç óæå áûë îïëà÷åí â ìàãàçèíå — ñòàòóñ íå òðîãàëè. */
public const ALREADY_PAID_IN_SHOP = 'already_paid_in_shop';
/** Ïîâòîð óâåäîìëåíèÿ ïî óæå çà÷ò¸ííîé îïåðàöèè: îòâåò 200 áåç ïîáî÷íûõ ýôôåêòîâ. */
public const REPEAT = 'repeat';
/** Âòîðàÿ îïåðàöèÿ MONETA.RU ïî îïëà÷åííîìó çàêàçó: äåíüãè ñïèñàíû äâàæäû, íóæåí ÷åëîâåê. */
public const DUPLICATE_OPERATION = 'duplicate_operation';
/** Íîìåð çàêàçà èç `MNT_TRANSACTION_ID` íå íàéäåí. */
public const UNKNOWN_ORDER = 'unknown_order';
/** Ñóììà çàêàçà èçìåíèëàñü ïîñëå ïîêàçà ôîðìû: îïëàòà ïî ñòàðîé ôîðìå íå ïðèíèìàåòñÿ. */
public const ORDER_AMOUNT_CHANGED = 'order_amount_changed';
public const AMOUNT_MISMATCH = 'amount_mismatch';
public const CURRENCY_MISMATCH = 'currency_mismatch';
/** `MNT_TEST_MODE` óâåäîìëåíèÿ íå ñîâïàë ñ òåñòîâûì ðåæèìîì ìîäóëÿ. */
public const TEST_MODE_MISMATCH = 'test_mode_mismatch';
/** Çàêàç íå ïåðåâ¸ëñÿ â îïëà÷åííûå (îøèáêà ÿäðà PHPShop) — ïîâòîð óâåäîìëåíèÿ ïîïðîáóåò ñíîâà. */
public const ORDER_UPDATE_FAILED = 'order_update_failed';
/** Ôèñêàëèçàöèÿ âêëþ÷åíà, à ÷åê äëÿ JSON-îòâåòà íå ñîáðàí. */
public const RECEIPT_UNAVAILABLE = 'receipt_unavailable';
/** Íå äîæäàëèñü áëîêèðîâêè çàêàçà: ïàðàëëåëüíî îáðàáàòûâàåòñÿ äðóãîå óâåäîìëåíèå. */
public const LOCK_TIMEOUT = 'lock_timeout';
/** Ïîäïèñè äëÿ æóðíàëà îïåðàöèé â àäìèíêå. */
private const LABELS = [
self::CHECKED => 'Ïðîâåðêà çàêàçà',
self::PAID => 'Îïëàòà çà÷òåíà',
self::ALREADY_PAID_IN_SHOP => 'Îïëàòà çà÷òåíà, çàêàç óæå áûë îïëà÷åí â ìàãàçèíå',
self::REPEAT => 'Ïîâòîð óâåäîìëåíèÿ',
self::DUPLICATE_OPERATION => 'Âòîðàÿ îïëàòà îïëà÷åííîãî çàêàçà: ñäåëàéòå âîçâðàò â ëè÷íîì êàáèíåòå MONETA.RU',
self::UNKNOWN_ORDER => 'Çàêàç íå íàéäåí',
self::ORDER_AMOUNT_CHANGED => 'Ñóììà çàêàçà èçìåíèëàñü ïîñëå ïîêàçà ôîðìû îïëàòû',
self::AMOUNT_MISMATCH => 'Ñóììà íå ñîâïàäàåò ñ çàêàçîì',
self::CURRENCY_MISMATCH => 'Âàëþòà íå ñîâïàäàåò',
self::TEST_MODE_MISMATCH => 'Òåñòîâûé ðåæèì íå ñîâïàäàåò ñ íàñòðîéêîé ìîäóëÿ',
self::ORDER_UPDATE_FAILED => 'Íå óäàëîñü ïåðåâåñòè çàêàç â îïëà÷åííûå',
self::RECEIPT_UNAVAILABLE => '×åê íå ñîáðàí',
self::LOCK_TIMEOUT => 'Çàêàç çàíÿò ïàðàëëåëüíûì óâåäîìëåíèåì',
PaymentEligibility::NOT_CONFIGURED => 'Ìîäóëü íå íàñòðîåí',
PaymentEligibility::OTHER_PAYMENT_METHOD => 'Ó çàêàçà äðóãîé ñïîñîá îïëàòû',
PaymentEligibility::ALREADY_PAID => 'Çàêàç óæå îïëà÷åí',
PaymentEligibility::CANCELLED => 'Çàêàç îòìåí¸í',
PaymentEligibility::AWAITING_STATUS => 'Çàêàç åù¸ íå ïîäòâåðæä¸í ìåíåäæåðîì',
PaymentEligibility::UNSUPPORTED_CURRENCY => 'Âàëþòà ìàãàçèíà íå ðóáëè',
PaymentEligibility::ZERO_AMOUNT => 'Íóëåâàÿ ñóììà çàêàçà',
];
private function __construct() {}
/**
* Çíà÷îê ñòðîêè æóðíàëà îïåðàöèé â àäìèíêå — glyphicon Bootstrap 3, êîòîðûé àäìèíêà PHPShop
* ïîñòàâëÿåò ñî ñâîèìè òåìàìè (`admpanel/fonts/`, êëàññû `glyphicon-*` — â 6.7 â êàæäîé òåìå,
* â 7.0 â `bootstrap.min.css`); öâåòà — êëàññû òåìû. Îïëàòà çà÷òåíà — çåë¸íàÿ ãàëî÷êà
* â êðóæêå, îòêàç ìîäóëÿ (`FAIL` èëè êîä 500) — êðàñíûé êðåñòèê, ïðîâåðêà çàêàçà — ñåðûé
* âîïðîñ; îñòàëüíîå (ïîâòîð óâåäîìëåíèÿ) — áåç çíà÷êà.
*
* @param int|null $resultCode `MNT_RESULT_CODE` îòâåòà ìîäóëÿ; null — îòâåò `FAIL`
*/
public static function iconHtml(string $event, ?int $resultCode): string
{
if ($event === self::PAID || $event === self::ALREADY_PAID_IN_SHOP) {
return self::glyphicon('ok-sign', 'text-success');
}
if ($resultCode === null || $resultCode === ResultCode::REJECTED) {
return self::glyphicon('remove-sign', 'text-danger');
}
if ($event === self::CHECKED) {
return self::glyphicon('question-sign', 'text-muted');
}
return '';
}
private static function glyphicon(string $name, string $color): string
{
return '<span class="glyphicon glyphicon-' . $name . ' ' . $color . '" aria-hidden="true"></span>';
}
/**
* Ïîäïèñü ñîáûòèÿ; íåèçâåñòíûé êîä (èç áóäóùåé âåðñèè) ïîêàçûâàåòñÿ êàê åñòü.
*/
public static function label(string $event): string
{
return self::LABELS[$event] ?? $event;
}
}