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; } } }