91 lines
3.8 KiB
PHP
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,
|
|
),
|
|
];
|
|
}
|
|
}
|