File "PaymentController.php"
Full Path: /home/trinadezambia/public_html/admin_panel/app/Http/Controllers/PaymentController.php
File size: 7.18 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Models\PaymentConfiguration;
use Illuminate\Support\Facades\Auth;
use App\Models\PaymentTransaction;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Config;
use App\Models\School;
use Illuminate\Support\Facades\Http;
class PaymentController extends Controller
{
/**
* Handle the payment status callback
*/
public function status(Request $request)
{
Log::info('Payment Status Callback:', $request->all());
// Get school code from request
$schoolId = $request->query('school_id');
if (!$schoolId) {
return response()->json(['error' => 'School Id is required'], 400);
}
// Get school details from main database
$school = School::on('mysql')->where('id', $schoolId)->first();
if (!$school) {
return response()->json(['error' => 'School not found'], 404);
}
// Set up school database connection
Config::set('database.connections.school.database', $school->database_name);
DB::purge('school');
DB::connection('school')->reconnect();
DB::setDefaultConnection('school');
// Get payment gateway configuration from school database
$paymentGateway = PaymentConfiguration::where('school_id', $school->id)->where('status', 1)->first();
if (!$paymentGateway) {
return response()->json(['error' => 'Payment Gateway not found'], 404);
}
if ($paymentGateway->payment_method == 'Paystack') {
// Get payment reference from request
$reference = $request->query('reference');
if (!$reference) {
return response()->json(['error' => 'Transaction reference is required'], 400);
}
// Get payment status from request
$status = $request->query('status');
// Handle cancelled payment
if ($status === 'cancelled') {
Log::info('Payment was cancelled:', [
'reference' => $reference,
'school_id' => $schoolId
]);
// Update payment transaction status to failed
$paymentTransaction = PaymentTransaction::where('order_id', $reference)->first();
if ($paymentTransaction) {
$paymentTransaction->update(['payment_status' => 'failed']);
}
return redirect()->route('payment.status', ['status' => 'cancelled', 'school_id' => $schoolId, 'trxref' => $reference, 'reference' => $reference])->with('error', 'Payment was cancelled.');
}
// For successful payments, verify with Paystack API
$response = Http::withHeaders([
'Authorization' => 'Bearer ' . $paymentGateway->secret_key,
'Content-Type' => 'application/json',
])->get("https://api.paystack.co/transaction/verify/{$reference}");
$data = $response->json();
Log::info('Paystack verification response:', $data);
if ($response->successful() && isset($data['data']['status']) && $data['data']['status'] === 'success') {
// Update payment transaction
// $paymentTransaction = PaymentTransaction::where('order_id', $reference)->first();
// if ($paymentTransaction) {
// $paymentTransaction->update([
// 'payment_status' => 'succeed',
// 'payment_id' => $reference
// ]);
// }
return response()->json([
'success' => true,
'message' => 'Payment verified successfully',
'transaction' => $data['data']
]);
} else {
Log::error('Paystack payment verification failed:', [
'reference' => $reference,
'response' => $data
]);
// Update payment transaction status to failed
$paymentTransaction = PaymentTransaction::where('order_id', $reference)->first();
if ($paymentTransaction) {
$paymentTransaction->update(['payment_status' => 'failed']);
}
return response()->json([
'success' => false,
'message' => 'Payment verification failed',
'error' => $data['message'] ?? 'Unknown error'
]);
}
} else if ($paymentGateway->payment_method == 'Flutterwave') {
// Flutterwave implementation
$paymentTransactionId = $request->query('tx_ref');
$transactionId = $request->query('transaction_id'); // only present if success
$status = $request->query('status');
if ($status === 'cancelled') {
// Mark transaction as failed/cancelled
$paymentTransaction = PaymentTransaction::where('order_id', $paymentTransactionId)->first();
if ($paymentTransaction) {
$paymentTransaction->update(['payment_status' => 'failed']);
}
return redirect()->route('payment.cancel')
->with('error', 'Payment was cancelled.');
}
if (!$paymentTransactionId) {
return response()->json(['error' => 'Transaction ID is required'], 400);
}
$paymentTransaction = PaymentTransaction::where('order_id', $paymentTransactionId)->first();
if (!$paymentTransaction) {
return response()->json(['error' => 'Transaction not found'], 404);
}
if ($paymentTransaction->payment_status === "succeed") {
return response()->json(['status' => 'success', 'message' => 'Transaction already processed']);
}
$response = Http::withHeaders([
'Authorization' => 'Bearer ' . $paymentGateway->secret_key,
'Content-Type' => 'application/json',
])->get("https://api.flutterwave.com/v3/transactions/{$transactionId}/verify");
$data = $response->json();
if ($response->successful() && $data['status'] === 'success') {
return response()->json([
'success' => true,
'message' => 'Payment verified successfully',
'transaction' => $data['data']
]);
} else {
return response()->json([
'success' => false,
'message' => 'Payment verification failed',
'error' => $data['message'] ?? 'Unknown error'
]);
}
} else {
return response()->json(['error' => 'Payment Gateway not found'], 404);
}
}
/**
* Handle payment cancellation
*/
public function cancel()
{
return view('payment.cancel')->with('error', 'Payment was cancelled or failed.');
}
public function success()
{
return view('payment.success')->with('success', 'Payment completed successfully.');
}
}