Files
HRM-System/app/Http/Controllers/IyzipayPaymentController.php
2026-04-13 08:16:56 +08:00

230 lines
9.4 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Plan;
use App\Models\User;
use App\Models\Setting;
use App\Models\PlanOrder;
use App\Models\PaymentSetting;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Iyzipay\Options;
use Iyzipay\Model\CheckoutForm;
use Iyzipay\Model\CheckoutFormInitialize;
use Iyzipay\Request\CreateCheckoutFormInitializeRequest;
use Iyzipay\Model\Locale;
use Iyzipay\Model\Currency;
use Iyzipay\Model\PaymentGroup;
use Iyzipay\Model\BasketItemType;
use Iyzipay\Model\BasketItem;
use Iyzipay\Model\Buyer;
use Iyzipay\Model\Address;
use Iyzipay\Request\RetrieveCheckoutFormRequest;
class IyzipayPaymentController extends Controller
{
private function getIyzipayOptions($settings)
{
$options = new Options();
$options->setApiKey($settings['iyzipay_public_key']);
$options->setSecretKey($settings['iyzipay_secret_key']);
$options->setBaseUrl($settings['iyzipay_mode'] === 'live'
? 'https://api.iyzipay.com'
: 'https://sandbox-api.iyzipay.com');
return $options;
}
public function processPayment(Request $request)
{
$validated = validatePaymentRequest($request, [
'token' => 'required|string',
]);
try {
$plan = Plan::findOrFail($validated['plan_id']);
$pricing = calculatePlanPricing($plan, $validated['coupon_code'] ?? null);
$settings = getPaymentGatewaySettings();
if (!isset($settings['payment_settings']['iyzipay_secret_key']) || !isset($settings['payment_settings']['iyzipay_public_key'])) {
return back()->withErrors(['error' => __('Iyzipay not configured')]);
}
// Retrieve payment result from Iyzipay
$paymentResult = $this->retrieveIyzipayPayment($validated['token'], $settings['payment_settings']);
if ($paymentResult && $paymentResult->getPaymentStatus() === 'SUCCESS') {
processPaymentSuccess([
'user_id' => auth()->id(),
'plan_id' => $plan->id,
'billing_cycle' => $validated['billing_cycle'],
'payment_method' => 'iyzipay',
'coupon_code' => $validated['coupon_code'] ?? null,
'payment_id' => $paymentResult->getPaymentId(),
]);
return back()->with('success', __('Payment successful and plan activated'));
}
return back()->withErrors(['error' => __('Payment failed or cancelled')]);
} catch (\Exception $e) {
return handlePaymentError($e, 'iyzipay');
}
}
public function createPaymentForm(Request $request)
{
$validated = validatePaymentRequest($request);
try {
$plan = Plan::findOrFail($validated['plan_id']);
$pricing = calculatePlanPricing($plan, $validated['coupon_code'] ?? null);
$settings = getPaymentGatewaySettings();
if (!isset($settings['payment_settings']['iyzipay_secret_key']) || !isset($settings['payment_settings']['iyzipay_public_key'])) {
return response()->json(['error' => __('Iyzipay not configured')], 400);
}
$user = auth()->user();
$conversationId = 'plan_' . $plan->id . '_' . $user->id . '_' . time();
$options = $this->getIyzipayOptions($settings['payment_settings']);
// Create checkout form initialize request
$checkoutRequest = new CreateCheckoutFormInitializeRequest();
$checkoutRequest->setLocale(Locale::EN);
$checkoutRequest->setConversationId($conversationId);
$checkoutRequest->setPrice(number_format($pricing['final_price'], 2, '.', ''));
$checkoutRequest->setPaidPrice(number_format($pricing['final_price'], 2, '.', ''));
$checkoutRequest->setCurrency(Currency::USD);
$checkoutRequest->setBasketId('plan_' . $plan->id);
$checkoutRequest->setPaymentGroup(PaymentGroup::SUBSCRIPTION);
$checkoutRequest->setCallbackUrl(route('iyzipay.callback'));
$checkoutRequest->setEnabledInstallments([1]);
// Set buyer information
$buyer = new Buyer();
$buyer->setId($user->id);
$buyer->setName($user->name ?? 'Customer');
$buyer->setSurname('User');
$buyer->setGsmNumber('+1234567890');
$buyer->setEmail($user->email);
$buyer->setIdentityNumber('11111111111');
$buyer->setLastLoginDate(now()->format('Y-m-d H:i:s'));
$buyer->setRegistrationDate($user->created_at->format('Y-m-d H:i:s'));
$buyer->setRegistrationAddress('123 Main Street');
$buyer->setIp($request->ip());
$buyer->setCity('New York');
$buyer->setCountry('United States');
$buyer->setZipCode('10001');
$checkoutRequest->setBuyer($buyer);
// Set shipping address
$shippingAddress = new Address();
$shippingAddress->setContactName($user->name ?? 'Customer User');
$shippingAddress->setCity('New York');
$shippingAddress->setCountry('United States');
$shippingAddress->setAddress('123 Main Street');
$shippingAddress->setZipCode('10001');
$checkoutRequest->setShippingAddress($shippingAddress);
// Set billing address
$billingAddress = new Address();
$billingAddress->setContactName($user->name ?? 'Customer User');
$billingAddress->setCity('New York');
$billingAddress->setCountry('United States');
$billingAddress->setAddress('123 Main Street');
$billingAddress->setZipCode('10001');
$checkoutRequest->setBillingAddress($billingAddress);
// Set basket items
$basketItem = new BasketItem();
$basketItem->setId($plan->id);
$basketItem->setName($plan->name);
$basketItem->setCategory1('Subscription');
$basketItem->setItemType(BasketItemType::VIRTUAL);
$basketItem->setPrice(number_format($pricing['final_price'], 2, '.', ''));
$basketItems = [$basketItem];
$checkoutRequest->setBasketItems($basketItems);
// Initialize checkout form
$checkoutFormInitialize = CheckoutFormInitialize::create($checkoutRequest, $options);
if ($checkoutFormInitialize->getStatus() === 'success') {
return response()->json([
'success' => true,
'redirect_url' => $checkoutFormInitialize->getPaymentPageUrl(),
'token' => $checkoutFormInitialize->getToken()
]);
} else {
return response()->json(['error' => $checkoutFormInitialize->getErrorMessage()], 400);
}
} catch (\Exception $e) {
return response()->json(['error' => __('Payment form creation failed')], 500);
}
}
public function callback(Request $request)
{
try {
$token = $request->input('token');
$settings = getPaymentGatewaySettings();
if (!$token) {
return redirect()->route('plans.index')->withErrors(['error' => __('Invalid payment response')]);
}
// Retrieve payment result from Iyzipay
$paymentResult = $this->retrieveIyzipayPayment($token, $settings['payment_settings']);
if ($paymentResult && $paymentResult->getPaymentStatus() === 'SUCCESS') {
// Extract conversation ID to find the plan and user
$conversationId = $paymentResult->getConversationId();
$parts = explode('_', $conversationId);
if (count($parts) >= 3) {
$planId = $parts[1];
$userId = $parts[2];
$plan = Plan::find($planId);
$user = User::find($userId);
if ($plan && $user) {
processPaymentSuccess([
'user_id' => $user->id,
'plan_id' => $plan->id,
'billing_cycle' => 'monthly', // Default, should be stored in session or passed
'payment_method' => 'iyzipay',
'payment_id' => $paymentResult->getPaymentId(),
]);
return redirect()->route('plans.index')->with('success', __('Payment successful! Your plan has been activated.'));
}
}
}
return redirect()->route('plans.index')->withErrors(['error' => __('Payment failed or cancelled')]);
} catch (\Exception $e) {
return redirect()->route('plans.index')->withErrors(['error' => __('Payment processing failed')]);
}
}
private function retrieveIyzipayPayment($token, $settings)
{
try {
$options = $this->getIyzipayOptions($settings);
$request = new RetrieveCheckoutFormRequest();
$request->setToken($token);
$checkoutForm = CheckoutForm::retrieve($request, $options);
return $checkoutForm;
} catch (\Exception $e) {
return null;
}
}
}