feat: paygw_moneta 1.0.0, MONETA.Assistant payment gateway for Moodle
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace paygw_moneta;
|
||||
|
||||
use core_payment\form\account_gateway;
|
||||
use paygw_moneta\local\protocol\AssistantProtocol;
|
||||
use paygw_moneta\local\protocol\PaymentServer;
|
||||
use paygw_moneta\local\receipt\Client;
|
||||
use paygw_moneta\local\receipt\Vat;
|
||||
use stdClass;
|
||||
|
||||
/**
|
||||
* Платёжный шлюз Moneta для Payment API Moodle: валюта и форма настроек
|
||||
* платёжного аккаунта. Имя класса и методов задаёт ядро (`\paygw_<name>\gateway`).
|
||||
*
|
||||
* @package paygw_moneta
|
||||
* @copyright 2026 Moneta Labs {@link https://moneta.ru/}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class gateway extends \core_payment\gateway
|
||||
{
|
||||
public static function get_supported_currencies(): array
|
||||
{
|
||||
return [AssistantProtocol::CURRENCY];
|
||||
}
|
||||
|
||||
public static function add_configuration_to_gateway_form(account_gateway $form): void
|
||||
{
|
||||
$mform = $form->get_mform();
|
||||
|
||||
$mform->addElement('text', 'accountnumber', get_string('accountnumber', 'paygw_moneta'));
|
||||
$mform->setType('accountnumber', PARAM_ALPHANUMEXT);
|
||||
$mform->addRule('accountnumber', null, 'required', null, 'client');
|
||||
$mform->addHelpButton('accountnumber', 'accountnumber', 'paygw_moneta');
|
||||
|
||||
$mform->addElement('passwordunmask', 'integritycode', get_string('integritycode', 'paygw_moneta'));
|
||||
$mform->setType('integritycode', PARAM_RAW_TRIMMED);
|
||||
$mform->addRule('integritycode', null, 'required', null, 'client');
|
||||
$mform->addHelpButton('integritycode', 'integritycode', 'paygw_moneta');
|
||||
|
||||
$servers = [];
|
||||
foreach (PaymentServer::cases() as $server) {
|
||||
$servers[$server->value] = get_string($server->label(), 'paygw_moneta');
|
||||
}
|
||||
$mform->addElement('select', 'paymentserver', get_string('paymentserver', 'paygw_moneta'), $servers);
|
||||
$mform->setDefault('paymentserver', PaymentServer::Prod->value);
|
||||
$mform->addHelpButton('paymentserver', 'paymentserver', 'paygw_moneta');
|
||||
|
||||
$mform->addElement('advcheckbox', 'testmode', get_string('testmode', 'paygw_moneta'));
|
||||
$mform->addHelpButton('testmode', 'testmode', 'paygw_moneta');
|
||||
|
||||
$mform->addElement('text', 'receiptemail', get_string('receiptemail', 'paygw_moneta'));
|
||||
$mform->setType('receiptemail', PARAM_RAW_TRIMMED);
|
||||
$mform->addRule('receiptemail', null, 'required', null, 'client');
|
||||
$mform->addHelpButton('receiptemail', 'receiptemail', 'paygw_moneta');
|
||||
|
||||
$mform->addElement('advcheckbox', 'fiscalization', get_string('fiscalization', 'paygw_moneta'));
|
||||
$mform->addHelpButton('fiscalization', 'fiscalization', 'paygw_moneta');
|
||||
|
||||
$vatOptions = [];
|
||||
foreach (Vat::cases() as $vat) {
|
||||
$vatOptions[$vat->value] = get_string($vat->langKey(), 'paygw_moneta');
|
||||
}
|
||||
$mform->addElement('select', 'vat', get_string('vat', 'paygw_moneta'), $vatOptions);
|
||||
$mform->addHelpButton('vat', 'vat', 'paygw_moneta');
|
||||
$mform->setDefault('vat', Vat::None->value);
|
||||
|
||||
$mform->addElement('advcheckbox', 'sendpaymentlink', get_string('sendpaymentlink', 'paygw_moneta'));
|
||||
$mform->addHelpButton('sendpaymentlink', 'sendpaymentlink', 'paygw_moneta');
|
||||
$mform->setDefault('sendpaymentlink', 1);
|
||||
|
||||
$mform->addElement('static', 'callbackurl', get_string('callbackurl', 'paygw_moneta'), self::callbackUrlHtml());
|
||||
$mform->addHelpButton('callbackurl', 'callbackurl', 'paygw_moneta');
|
||||
}
|
||||
|
||||
public static function validate_gateway_form(
|
||||
account_gateway $form,
|
||||
stdClass $data,
|
||||
array $files,
|
||||
array &$errors,
|
||||
): void {
|
||||
$accountNumber = trim((string) ($data->accountnumber ?? ''));
|
||||
if ($accountNumber === '') {
|
||||
$errors['accountnumber'] = get_string('required');
|
||||
} elseif (preg_match('/\A[0-9]{1,20}\z/', $accountNumber) !== 1) {
|
||||
$errors['accountnumber'] = get_string('error:accountnumber', 'paygw_moneta');
|
||||
}
|
||||
|
||||
$receiptEmail = trim((string) ($data->receiptemail ?? ''));
|
||||
if (Client::normalizeEmail($receiptEmail) === null) {
|
||||
$errors['receiptemail'] = get_string('error:receiptemail', 'paygw_moneta');
|
||||
}
|
||||
|
||||
if (trim((string) ($data->integritycode ?? '')) === '') {
|
||||
$errors['integritycode'] = get_string('required');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Адрес Check URL / Pay URL только для чтения и кнопка «Скопировать»
|
||||
* (`core/copy_to_clipboard`: сам вешает обработчик на `data-action`).
|
||||
*/
|
||||
private static function callbackUrlHtml(): string
|
||||
{
|
||||
global $PAGE;
|
||||
|
||||
$PAGE->requires->js_amd_inline("require(['core/copy_to_clipboard']);");
|
||||
$id = \html_writer::random_id('paygw-moneta-callbackurl');
|
||||
|
||||
return \html_writer::div(
|
||||
\html_writer::empty_tag('input', [
|
||||
'type' => 'text',
|
||||
'id' => $id,
|
||||
'class' => 'form-control',
|
||||
'value' => (new \moodle_url('/payment/gateway/moneta/callback.php'))->out(false),
|
||||
'readonly' => 'readonly',
|
||||
'size' => 60,
|
||||
])
|
||||
. \html_writer::tag('button', get_string('copytoclipboard'), [
|
||||
'type' => 'button',
|
||||
'class' => 'btn btn-secondary',
|
||||
'data-action' => 'copytoclipboard',
|
||||
'data-clipboard-target' => '#' . $id,
|
||||
'data-clipboard-success-message' => get_string('callbackurl:copied', 'paygw_moneta'),
|
||||
]),
|
||||
'input-group',
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user