lms/app/Http/Controllers/Payout/PaypalController.php
2025-12-15 12:26:23 +01:00

112 lines
3.9 KiB
PHP

<?php
namespace App\Http\Controllers\Payout;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Services\Payout\PayoutService;
use Srmklive\PayPal\Services\PayPal as PayPalClient;
class PaypalController extends Controller
{
public function __construct(
private PayoutService $payoutService
) {}
// Paypal payment
public function payment(Request $request)
{
$payout = $this->payoutService->getPayoutRequest($request->request_id);
$paypal = $this->payoutService->getPayoutGateway($payout->user->instructor_id, 'paypal');
$paypalMode = $paypal['fields']['test_mode'] ? 'sandbox' : 'live';
$config = setPaypalConfig($paypal['fields'], $paypalMode);
$provider = new PayPalClient;
$provider->setApiCredentials($config);
$accessToken = $provider->getAccessToken();
$response = $provider->createOrder([
"intent" => "CAPTURE",
"application_context" => [
"return_url" => route('payouts.paypal.success'),
"cancel_url" => route('payouts.request.index'),
],
"purchase_units" => [
[
"amount" => [
"currency_code" => strtolower($paypal['fields']['currency']),
"value" => number_format($payout->amount, 2, '.', '')
]
]
]
]);
if (isset($response['id']) && $response['id'] != null) {
session()->put('slug', $request->slug);
session()->put('request_id', $request->request_id);
foreach ($response['links'] as $link) {
if ($link['rel'] == 'approve') {
return redirect()->away($link['href']);
}
}
} else {
return redirect()
->route('payouts.request.index')
->with('error', 'Your payment have failed, please try again later.');
}
}
// Paypal payment success
public function success(Request $request)
{
$slug = session()->get('slug');
$request_id = session()->get('request_id');
$payout = $this->payoutService->getPayoutRequest($request_id);
$paypal = $this->payoutService->getPayoutGateway($payout->user->instructor_id, 'paypal');
$paypalMode = $paypal['fields']['test_mode'] ? 'sandbox' : 'live';
try {
$config = setPaypalConfig($paypal['fields'], $paypalMode);
$provider = new PayPalClient;
$provider->setApiCredentials($config);
$accessToken = $provider->getAccessToken();
$response = $provider->capturePaymentOrder($request->token);
if (isset($response['status']) && $response['status'] == 'COMPLETED') {
$this->payoutService->completePayoutRequest($request_id, $response['id'], 'paypal');
session()->forget('request_id');
if ($slug == 'api') {
return redirect()->to(env('FRONTEND_URL') . '/student');
} else {
return redirect()
->route('payouts.request.index')
->with('success', 'Congratulation! payout have completed');
}
} else {
return redirect()
->route('payouts.request.index')
->with('error', 'Your payment have failed, please try again later.');
}
} catch (\Throwable $th) {
return redirect()
->route('payouts.request.index')
->with('error', $th->getMessage());
}
}
// Paypal payment cancel
public function cancel()
{
return redirect()
->route('payouts.request.index')
->with('error', 'Your payment have failed, please try again later.');
}
}