/
itp_practice
/
itp_backend
Обзор
Документация
Войти
/
itp_practice
/
itp_backend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
app/Services/PaymentGatewayManagerService.php
119 строк
4 KB
vivanenko
purchase demo
28 май 2025, 15:54
28 май 2025, 15:54
b6d38b6
Код
Авторство
О чём код?
<?php namespace App\Services; use App\Contracts\PaymentGatewayInterface; use App\Services\PaymentGateways\FreekassaGateway; use App\Services\PaymentGateways\FreekassaMockGateway; use Illuminate\Support\Facades\Config; /** * Сервис для управления платежными шлюзами * Реализует паттерн Factory для создания экземпляров шлюзов */ class PaymentGatewayManagerService { private array $gateways = []; public function __construct() { $this->registerGateways(); } /** * Получить экземпляр платежного шлюза */ public function getGateway(string $gatewayName): PaymentGatewayInterface { if (!isset($this->gateways[$gatewayName])) { throw new \InvalidArgumentException("Платежный шлюз '{$gatewayName}' не найден"); } $gatewayClass = $this->gateways[$gatewayName]; $config = $this->getGatewayConfig($gatewayName); return new $gatewayClass($config); } /** * Получить список доступных шлюзов */ public function getAvailableGateways(): array { return array_keys($this->gateways); } /** * Проверить, поддерживается ли шлюз */ public function isGatewaySupported(string $gatewayName): bool { return isset($this->gateways[$gatewayName]); } /** * Получить информацию о шлюзе */ public function getGatewayInfo(string $gatewayName): array { if (!$this->isGatewaySupported($gatewayName)) { throw new \InvalidArgumentException("Платежный шлюз '{$gatewayName}' не найден"); } $gateway = $this->getGateway($gatewayName); return [ 'name' => $gateway->getGatewayName(), 'supported_currencies' => $gateway->getSupportedCurrencies(), 'class' => $this->gateways[$gatewayName], ]; } /** * Получить все шлюзы с информацией */ public function getAllGatewaysInfo(): array { $result = []; foreach ($this->getAvailableGateways() as $gatewayName) { $result[$gatewayName] = $this->getGatewayInfo($gatewayName); } return $result; } /** * Зарегистрировать платежные шлюзы */ private function registerGateways(): void { $this->gateways = [ 'freekassa' => FreekassaGateway::class, 'freekassa_mock' => FreekassaMockGateway::class, 'demo' => FreekassaMockGateway::class, ]; } /** * Получить конфигурацию для шлюза */ private function getGatewayConfig(string $gatewayName): array { return match ($gatewayName) { 'freekassa' => [ 'shop_id' => Config::get('payments.freekassa.shop_id'), 'secret_key' => Config::get('payments.freekassa.secret_key'), 'secret_key_second' => Config::get('payments.freekassa.secret_key_second'), 'api_key' => Config::get('payments.freekassa.api_key'), 'test_mode' => Config::get('payments.freekassa.test_mode', false), ], 'freekassa_mock' => [ 'mock_mode' => true, 'auto_success' => Config::get('payments.freekassa_mock.auto_success', true), 'delay_seconds' => Config::get('payments.freekassa_mock.delay_seconds', 2), ], default => [], }; } }