/
itp_practice
/
itp_backend
Обзор
Документация
Войти
/
itp_practice
/
itp_backend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
app/Http/Controllers/PaymentController.php
252 строки
10 KB
vivanenko
fix payment process
29 май 2025, 12:01
29 май 2025, 12:01
f799efc
Код
Авторство
О чём код?
<?php namespace App\Http\Controllers; use App\Services\PaymentGatewayManagerService; use App\DTOs\CallbackData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; /** * Контроллер для обработки платежей */ class PaymentController extends Controller { public function __construct( private PaymentGatewayManagerService $paymentGatewayManager ) { } /** * Обработка callback от FreeKassa */ public function freekassaCallback(Request $request): JsonResponse { try { Log::info('FreeKassa callback received', $request->all()); $callbackData = CallbackData::fromArray([ 'transaction_id' => $request->get('intid'), 'order_id' => $request->get('MERCHANT_ORDER_ID'), 'amount' => (float)$request->get('AMOUNT'), 'status' => 'paid', // FreeKassa отправляет callback только при успешной оплате 'signature' => $request->get('SIGN'), 'merchant_id' => $request->get('MERCHANT_ID'), 'email' => $request->get('P_EMAIL'), 'phone' => $request->get('P_PHONE'), 'currency_id' => $request->get('CUR_ID'), 'description' => $request->get('us_description'), ]); $gateway = $this->paymentGatewayManager->getGateway('freekassa'); $result = $gateway->handleCallback($callbackData); if ($result) { Log::info('FreeKassa callback processed successfully', [ 'transaction_id' => $callbackData->transactionId, ]); return response()->json(['status' => 'OK']); } else { Log::warning('FreeKassa callback processing failed', [ 'transaction_id' => $callbackData->transactionId, ]); return response()->json(['status' => 'ERROR'], 400); } } catch (\Exception $e) { Log::error('FreeKassa callback error', [ 'error' => $e->getMessage(), 'request' => $request->all(), ]); return response()->json(['status' => 'ERROR'], 500); } } /** * Обработка callback от FreeKassa Mock */ public function freekassaMockCallback(Request $request) { try { Log::info('FreeKassa Mock callback received', $request->all()); $callbackData = CallbackData::fromArray([ 'transaction_id' => $request->get('intid'), 'order_id' => $request->get('MERCHANT_ORDER_ID'), 'amount' => (float)$request->get('AMOUNT'), 'status' => 'paid', 'signature' => $request->get('SIGN'), 'merchant_id' => $request->get('MERCHANT_ID'), 'email' => $request->get('P_EMAIL'), 'phone' => $request->get('P_PHONE'), 'currency_id' => $request->get('CUR_ID'), 'description' => $request->get('us_description'), ]); $gateway = $this->paymentGatewayManager->getGateway('freekassa_mock'); $result = $gateway->handleCallback($callbackData); if ($result) { Log::info('FreeKassa Mock callback processed successfully', [ 'transaction_id' => $callbackData->transactionId, ]); return view('test_payment_result', [ 'data' => [ 'transaction_id' => $request->get('intid'), 'order_id' => $request->get('MERCHANT_ORDER_ID'), 'amount' => (float)$request->get('AMOUNT'), 'status' => 'paid', 'signature' => $request->get('SIGN'), 'merchant_id' => $request->get('MERCHANT_ID'), 'email' => $request->get('P_EMAIL'), 'phone' => $request->get('P_PHONE'), 'currency_id' => $request->get('CUR_ID'), 'description' => $request->get('us_description'), 'shop_link' => 'http://localhost:3500/dashboard', ], ]); } else { Log::warning('FreeKassa Mock callback processing failed', [ 'transaction_id' => $callbackData->transactionId, ]); return response()->json(['status' => 'ERROR'], 400); } } catch (\Exception $e) { Log::error('FreeKassa Mock callback error', [ 'error' => $e->getMessage(), 'request' => $request->all(), ]); return response()->json(['status' => 'ERROR'], 500); } } /** * Mock страница оплаты для тестирования */ public function freekassaMockPay(Request $request) { try { $orderId = $request->get('order_id'); $transactionId = $request->get('transaction_id'); $amount = $request->get('amount'); $currency = $request->get('currency', 'RUB'); $description = $request->get('description', ''); Log::info('FreeKassa Mock payment page accessed', [ 'order_id' => $orderId, 'transaction_id' => $transactionId, 'amount' => $amount, ]); // Формируем URL для ручного вызова callback $callbackUrl = config('app.url') . '/api/v1/payments/freekassa-mock/callback?' . http_build_query([ 'MERCHANT_ID' => '12345', 'AMOUNT' => $amount, 'intid' => $transactionId, 'MERCHANT_ORDER_ID' => $transactionId, 'P_EMAIL' => 'test@example.com', 'P_PHONE' => '', 'CUR_ID' => $currency === 'RUB' ? '1' : '2', 'SIGN' => 'mock_signature', 'us_description' => $description, ]); // В реальном приложении здесь была бы HTML страница с формой оплаты // Для API возвращаем JSON с информацией о платеже return view('test_payment_form', [ 'message' => 'Mock payment page', 'data' => [ 'order_id' => $orderId, 'transaction_id' => $transactionId, 'amount' => $amount, 'currency' => $currency, 'description' => $description, 'mock' => true, 'auto_success' => true, 'callback_will_be_sent_in_seconds' => 2, 'manual_callback_url' => $callbackUrl, ], 'instructions' => 'Это mock страница оплаты. Callback будет отправлен автоматически через 2 секунды.', 'manual_test' => 'Для ручного тестирования перейдите по ссылке: ' . $callbackUrl, ]); return response()->json([ 'message' => 'Mock payment page', 'data' => [ 'order_id' => $orderId, 'transaction_id' => $transactionId, 'amount' => $amount, 'currency' => $currency, 'description' => $description, 'mock' => true, 'auto_success' => true, 'callback_will_be_sent_in_seconds' => 2, 'manual_callback_url' => $callbackUrl, ], 'instructions' => 'Это mock страница оплаты. Callback будет отправлен автоматически через 2 секунды.', 'manual_test' => 'Для ручного тестирования перейдите по ссылке: ' . $callbackUrl, ]); } catch (\Exception $e) { Log::error('FreeKassa Mock payment page error', [ 'error' => $e->getMessage(), 'request' => $request->all(), ]); return response()->json(['error' => 'Payment page error'], 500); } } /** * Получить информацию о доступных платежных шлюзах */ public function getAvailableGateways(): JsonResponse { try { $gateways = $this->paymentGatewayManager->getAllGatewaysInfo(); return response()->json([ 'message' => 'Доступные платежные шлюзы', 'data' => $gateways, ]); } catch (\Exception $e) { return response()->json([ 'message' => 'Ошибка получения платежных шлюзов', 'error' => $e->getMessage(), ], 500); } } /** * Страница успешной оплаты */ public function paymentSuccess(Request $request): JsonResponse { return response()->json([ 'message' => 'Платеж успешно завершен', 'data' => [ 'status' => 'success', 'redirect_to' => '/orders', ], ]); } /** * Страница неуспешной оплаты */ public function paymentFail(Request $request): JsonResponse { return response()->json([ 'message' => 'Ошибка при оплате', 'data' => [ 'status' => 'failed', 'redirect_to' => '/cart', ], ]); } }