public function checkoutWithIyzico(?array $data = null, Request $request) { // 0) Giriş guard $data = $data ?? []; try { // iyzico değilse, zinciri BOZMADAN aynen geri dön if ($request->input('payment_method') !== IYZICO_PAYMENT_METHOD_NAME) { return $data; } // 1) Para birimi desteği $supportedCurrencies = (new IyzicoPaymentService)->supportedCurrencyCodes(); if (empty($data['currency']) || !in_array($data['currency'], $supportedCurrencies, true)) { $data['error'] = true; $data['message'] = __( ":name, :currency para birimini desteklemiyor. Desteklenenler: :currencies.", [ 'name' => 'Iyzico', 'currency' => $data['currency'] ?? 'N/A', 'currencies' => implode(', ', $supportedCurrencies), ] ); return $data; } // 2) API anahtarları $apiKey = get_payment_setting('key', IYZICO_PAYMENT_METHOD_NAME); $apiSecret = get_payment_setting('secret', IYZICO_PAYMENT_METHOD_NAME); $apiInstallment= (int) get_payment_setting('installment', IYZICO_PAYMENT_METHOD_NAME); if (!$apiKey || !$apiSecret) { $data['error'] = true; $data['message'] = 'Iyzico API anahtarları bulunamadı.'; return $data; } // 3) Sipariş ve adres bilgileri $orderIds = (array) $request->input('order_id', []); $orderId = \Illuminate\Support\Arr::first($orderIds); if (!$orderId || empty($data['amount'])) { $data['error'] = true; $data['message'] = 'Sipariş veya tutar bilgisi eksik.'; return $data; } /** @var \Botble\Ecommerce\Repositories\Interfaces\OrderAddressInterface $orderAddressRepo */ $orderAddressRepo = $this->app->make(\Botble\Ecommerce\Repositories\Interfaces\OrderAddressInterface::class); $orderAddress = $orderAddressRepo->getFirstBy(['order_id' => $orderId]); // 4) Iyzipay bootstrap & options include_once __DIR__ . '/../IyzipayBootstrap.php'; \IyzipayBootstrap::init(null); $options = new \Iyzipay\Options(); $options->setApiKey($apiKey); $options->setSecretKey($apiSecret); // İsterseniz .env üzerinden kontrol edin: IYZICO_BASE_URL $options->setBaseUrl(env('IYZICO_BASE_URL', 'https://api.iyzipay.com')); // 5) Taksit seçenekleri $enabledInstallments = [1]; // tek çekim her zaman var if ($apiInstallment > 1) { $enabledInstallments = range(1, min($apiInstallment, 12)); } // 6) Para birimi eşleme $iyziCurrency = \Iyzipay\Model\Currency::TL; // varsayılan if (strtoupper($data['currency']) === 'TRY') { $iyziCurrency = \Iyzipay\Model\Currency::TL; } // NOT: Başka para birimleri kullanıyorsanız burada eşleyin. // 7) Iyzipay CheckoutForm initialize request $conversationId = time() . '-' . $orderId; $amount = (string) $data['amount']; // iyzico string bekler $iyziReq = new \Iyzipay\Request\CreateCheckoutFormInitializeRequest(); $iyziReq->setLocale(\Iyzipay\Model\Locale::TR); $iyziReq->setConversationId($conversationId); $iyziReq->setPrice($amount); $iyziReq->setPaidPrice($amount); $iyziReq->setCurrency($iyziCurrency); $iyziReq->setBasketId($orderId); $iyziReq->setPaymentGroup(\Iyzipay\Model\PaymentGroup::PRODUCT); $iyziReq->setCallbackUrl(route('iyzico.payment.callback')); // Route tanımlı olmalı $iyziReq->setEnabledInstallments($enabledInstallments); // Buyer $buyer = new \Iyzipay\Model\Buyer(); $buyer->setId((string) ($orderAddress->id ?? $orderId)); $buyer->setName($orderAddress->name ?? 'Müşteri'); $buyer->setSurname($orderAddress->name ?? 'Müşteri'); $buyer->setGsmNumber($orderAddress->phone ?? '0000000000'); $buyer->setEmail($orderAddress->email ?? 'no-email@domain.com'); $buyer->setIdentityNumber('11111111111'); // gerçek TCKN var ise koyabilirsiniz $buyer->setLastLoginDate(date('Y-m-d H:i:s')); $buyer->setRegistrationDate(date('Y-m-d H:i:s')); $buyer->setRegistrationAddress(($orderAddress->city ?? '') . ' ' . ($orderAddress->address ?? 'Adres')); $buyer->setCity($orderAddress->state ?? 'Istanbul'); $buyer->setCountry($orderAddress->country ?? 'Turkey'); $iyziReq->setBuyer($buyer); // Address (fatura/kargo) $billingAddress = new \Iyzipay\Model\Address(); $billingAddress->setContactName($orderAddress->name ?? 'Müşteri'); $billingAddress->setCity($orderAddress->state ?? 'Istanbul'); $billingAddress->setCountry($orderAddress->country ?? 'Turkey'); $billingAddress->setAddress(($orderAddress->city ?? '') . ' ' . ($orderAddress->address ?? 'Adres')); $billingAddress->setZipCode('34742'); $iyziReq->setBillingAddress($billingAddress); $iyziReq->setShippingAddress($billingAddress); // Basket (özet) $basketItem = new \Iyzipay\Model\BasketItem(); $basketItem->setId((string) $orderId); $basketItem->setName('Sipariş #' . $orderId); $basketItem->setCategory1('Sipariş'); $basketItem->setItemType(\Iyzipay\Model\BasketItemType::PHYSICAL); $basketItem->setPrice($amount); $iyziReq->setBasketItems([$basketItem]); // 8) İstek $init = \Iyzipay\Model\CheckoutFormInitialize::create($iyziReq, $options); if ($init->getStatus() === 'success' && $init->getPaymentPageUrl()) { // DOĞRU YÖNTEM: header/exit yerine redirect_url döndür $data['redirect_url'] = $init->getPaymentPageUrl(); $data['error'] = false; return $data; } // Başarısız ise anlamlı mesaj $data['error'] = true; $data['message'] = $init->getErrorMessage() ?: 'Ödeme başlatılırken beklenmeyen bir hata oluştu.'; return $data; } catch (\Throwable $e) { \Log::error('IYZICO initialize exception', ['ex' => $e]); $data['error'] = true; $data['message'] = 'Ödeme başlatılırken bir hata oluştu.'; return $data; } }
Bir şey kırılmış. Lütfen bu hata oluştuğunda ne yaptığınızı bize bildirin. En kısa sürede düzeltiriz. Rahatsızlıktan dolayı özür dilerim.