Files
Moodle/classes/local/protocol/PaymentRequest.php
T

91 lines
3.8 KiB
PHP

<?php
declare(strict_types=1);
namespace paygw_moneta\local\protocol;
use InvalidArgumentException;
use paygw_moneta\local\Money;
/**
* @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 PaymentRequest
{
public const DESCRIPTION_MAX_LENGTH = 500;
/**
* @param string $accountId номер расширенного счёта (`MNT_ID`)
* @param string $transactionId идентификатор заказа в модуле (`MNT_TRANSACTION_ID`)
* @param Money $amount сумма к оплате
* @param string $subscriberId идентификатор покупателя (`MNT_SUBSCRIBER_ID`)
* @param bool $testMode тестовый режим счёта
* @param Signature $signature подпись с кодом проверки целостности счёта
* @param string $description описание заказа для покупателя
* @param string $successUrl возврат покупателя после успешной оплаты
* @param string $failUrl возврат после отказа
* @param string $returnUrl возврат при отмене покупателем
* @param PaymentServer $server боевой сервер или демо-площадка
* @param string $locale язык платёжной формы (`moneta.locale`)
* @param string $cms идентификатор CMS и модуля (`MNT_CMS`)
*/
public function __construct(
private readonly string $accountId,
private readonly string $transactionId,
private readonly Money $amount,
private readonly string $subscriberId,
private readonly bool $testMode,
private readonly Signature $signature,
private readonly string $description,
private readonly string $successUrl,
private readonly string $failUrl,
private readonly string $returnUrl,
private readonly PaymentServer $server,
private readonly string $locale,
private readonly string $cms,
) {
if ($accountId === '' || $transactionId === '') {
throw new InvalidArgumentException('Номер счёта и идентификатор заказа обязательны.');
}
if (!$amount->isPositive()) {
throw new InvalidArgumentException('Сумма платежа должна быть больше нуля.');
}
}
public function getActionUrl(): string
{
return $this->server->url();
}
/**
* @return array<string, string>
*/
public function getFields(): array
{
return [
'MNT_ID' => $this->accountId,
'MNT_TRANSACTION_ID' => $this->transactionId,
'MNT_AMOUNT' => $this->amount->toDecimal(),
'MNT_CURRENCY_CODE' => AssistantProtocol::CURRENCY,
'MNT_SUBSCRIBER_ID' => $this->subscriberId,
'MNT_TEST_MODE' => AssistantProtocol::testModeFlag($this->testMode),
'MNT_DESCRIPTION' => mb_substr($this->description, 0, self::DESCRIPTION_MAX_LENGTH),
'MNT_SUCCESS_URL' => $this->successUrl,
'MNT_FAIL_URL' => $this->failUrl,
'MNT_RETURN_URL' => $this->returnUrl,
'moneta.locale' => $this->locale,
'MNT_CMS' => $this->cms,
'MNT_SIGNATURE' => $this->signature->forPaymentForm(
accountId: $this->accountId,
transactionId: $this->transactionId,
amount: $this->amount,
currency: AssistantProtocol::CURRENCY,
subscriberId: $this->subscriberId,
testMode: $this->testMode,
),
];
}
}