feat: paygw_moneta 1.0.0, MONETA.Assistant payment gateway for Moodle
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace paygw_moneta\local\protocol;
|
||||
|
||||
use core_date;
|
||||
use DateTimeImmutable;
|
||||
|
||||
/**
|
||||
* `MNT_TRANSACTION_ID` — идентификатор заказа, который модуль отдаёт в платёжной
|
||||
* форме и получает обратно в Check URL, Pay URL и на странице возврата: UUID заказа
|
||||
* плюс метка времени, `0192b4c1-…_20260924143005MSK`. Метка — только для людей
|
||||
* (в личном кабинете Moneta и в переписке с поддержкой по ней видно, когда открыта форма),
|
||||
* поэтому она в часовом поясе сайта, а не в UTC; обратно она не читается, parse()
|
||||
* берёт только UUID.
|
||||
*
|
||||
* @package paygw_moneta
|
||||
* @copyright 2026 Moneta Labs {@link https://moneta.ru/}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
final class AssistantTransactionId
|
||||
{
|
||||
/**
|
||||
* Номер заказа — UUID в нижнем регистре ({@see \paygw_moneta\local\order\TransactionRepository::create()}).
|
||||
* Фрагмент шаблона без якорей: его же проверяет
|
||||
* {@see \paygw_moneta\local\order\TransactionRepository::isMerchantOrderId()}.
|
||||
*/
|
||||
public const ORDER_ID = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}';
|
||||
|
||||
public const SEPARATOR = '_';
|
||||
|
||||
private const PATTERN = '/\A
|
||||
(?<id>' . self::ORDER_ID . ') # UUID заказа
|
||||
' . self::SEPARATOR . ' # разделитель
|
||||
[0-9]{14} # метка времени YmdHis
|
||||
(?:[A-Z0-9+\-]{1,6})? # пояс: MSK, +03 — не обязателен
|
||||
\z/x';
|
||||
|
||||
private function __construct() {}
|
||||
|
||||
public static function build(string $orderId, ?DateTimeImmutable $now = null): string
|
||||
{
|
||||
$now ??= new DateTimeImmutable('now', core_date::get_server_timezone_object());
|
||||
|
||||
return $orderId . self::SEPARATOR . $now->format('YmdHisT');
|
||||
}
|
||||
|
||||
public static function parse(string $raw): ?string
|
||||
{
|
||||
return preg_match(self::PATTERN, $raw, $matches) === 1 ? $matches['id'] : null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user