🔴 Kritik Sorun 📊 Analiz

PayTR Callback Sorunu

Aboneliklerin Aktif Olmamasının Kök Nedeni

📅 9 Ocak 2026 🎯 Muzibu - Payment System 🔧 v1

📝 Basit Anlatım (Herkes İçin)

Sorun: Kullanıcı ödeme yapıyor, ödeme başarılı sayfasına geliyor ama abonelik sisteme yansımıyor.

Neden Oluyor: PayTR (ödeme sistemi) ödeme tamamlandığında bizim sitemize bildirim göndermesi gerekiyor. Fakat bu bildirim gelmiyor çünkü:

  • Koddaki yönlendirme adresleri yanlış (olmayan sayfalara gidiyor)
  • PayTR panel ayarlarında callback URL'i güncel değil (eski sunucu adresi yazıyor olabilir)

🔍 Benzetme ile Açıklama:

Bu durum tıpkı kargo göndermek gibi. Müşteri ödemeyi yapıyor (kargo gönderiyor), kargo firması "teslim edildi" diyor (ödeme başarılı sayfası) ama paket bize gelmiyor. Çünkü kargo firmasının kayıtlarında eski adresimiz yazıyor ve paket eski eve gidiyor!

Sonuç: Kullanıcı ödemeyi görüyor, biz göremiyoruz. Abonelik manuel olarak aktif edilmediği sürece başlamıyor.

🔧 Teknik Detaylar (Geliştiriciler İçin)

📊 PayTR Ödeme Akışı

1.
Token Request: Uygulama PayTR'ye ödeme bilgilerini gönderir, iframe token alır
2.
Payment Window: Kullanıcı PayTR iframe'inde kartla ödeme yapar
3.
Browser Redirect (merchant_ok_url): Ödeme sonrası kullanıcının tarayıcısı yönlendirilir
4.
Server Callback (IPN): PayTR sunucusu backend'e POST isteği gönderir ❌ ÇALIŞMIYOR!

❌ Sorunlu Kod

// Dosya: Modules/Payment/app/Services/PayTRDirectService.php (67-68)

$merchantOkUrl = route('payment.callback.success', ['payment' => $payment->payment_id]);
$merchantFailUrl = route('payment.callback.fail', ['payment' => $payment->payment_id]);

⚠️ Problem: Bu route'lar mevcut değil!

$ php artisan route:list | grep "payment.*callback"

POST   payment/callback/paytr   ✅ MEVCUT
GET    payment.callback.success  ❌ YOK!
GET    payment.callback.fail     ❌ YOK!

✅ Mevcut Callback Endpoint

Sistem'de zaten doğru callback endpoint mevcut:

POST /payment/callback/paytr

Controller: PayTRCallbackController@handle

Route: Modules/Payment/routes/web.php (18)

📁 İlgili Dosyalar

❌ Modules/Payment/app/Services/PayTRDirectService.php (67-68)
→ Yanlış route kullanıyor: payment.callback.success
✅ Modules/Payment/routes/web.php (18)
→ Doğru callback endpoint: POST payment/callback/paytr
✅ Modules/Payment/app/Http/Controllers/PayTRCallbackController.php
→ Callback handler (PayTR'den gelen POST isteklerini işler)
✅ Modules/Payment/app/Services/PayTRCallbackService.php
→ Callback işleme mantığı (Order::onPaymentCompleted() tetikler)
⚠️ Modules/Cart/app/Http/Livewire/Front/CheckoutPage.php (2078)
→ PayTRDirectService kullanıyor

💡 Neden Önemli?

👤 Kullanıcı Açısından:

  • ✅ Para ödendi
  • ✅ "Başarılı" sayfası göründü
  • ❌ Abonelik panelde yok
  • ❌ İçeriğe erişemiyor
  • 😡 Müşteri memnuniyetsiz

🔧 Teknik Açısından:

  • ❌ Order::onPaymentCompleted() çağrılmıyor
  • ❌ Subscriptions "pending_payment" durumunda
  • ❌ subscription_expires_at NULL
  • ❌ Order payment_status "pending"
  • ⚠️ Manuel aktivasyon gerekiyor

🔍 Kanıtlar & Bulgular

1️⃣ Order Kayıtları (Order #8 - ORD202601099BAE53)

✅ Order oluşturuldu

❌ payment_status: "pending" (paid olmalıydı)

❌ confirmed_at: NULL

✅ 16 subscription kaydı oluşturuldu

❌ Tüm subscriptions "pending_payment" durumunda

❌ Tüm subscriptions order_id: NULL

2️⃣ Server Access Logs

$ grep "POST /payment/callback/paytr" /var/www/vhosts/muzibu.com/logs/access_ssl_log

(Sonuç yok - Hiç callback gelmemiş)

3️⃣ Laravel Logs

❌ "PayTR callback received" logu yok

❌ PayTRCallbackController hiç çalışmamış

❌ PayTRCallbackService::handleCallback() hiç çağrılmamış

4️⃣ Route Test

$ curl -X POST https://muzibu.com/payment/callback/paytr

→ HTTP 400 (route çalışıyor, veri eksik)

✅ Endpoint erişilebilir, CSRF exception mevcut

5️⃣ Kullanıcı Gözlemi

✅ Kullanıcı ödeme penceresini açabiliyor (PayTR credentials doğru)

✅ Kullanıcı ödeme başarılı sayfasına geliyor (browser redirect çalışıyor)

❌ Abonelikler panelde görünmüyor (backend callback gelmiyor)

"önceki sunucuda bu ödemeleri alabiliyorduk"

✅ Çözüm Önerileri

🎯 Çözüm 1: Kod Düzeltmesi (Hızlı)

PayTRDirectService.php'deki yönlendirme URL'lerini düzelt:

// ❌ Eski (Yanlış):

$merchantOkUrl = route('payment.callback.success', ['payment' => $payment->payment_id]);
$merchantFailUrl = route('payment.callback.fail', ['payment' => $payment->payment_id]);

// ✅ Yeni (Doğru):

$orderNumber = $orderInfo['order_number'] ?? $payment->payment_number;
$merchantOkUrl = route('payment.success') . '?order=' . urlencode($orderNumber);
$merchantFailUrl = route('cart.checkout') . '?payment=failed&order=' . urlencode($orderNumber);

💡 Açıklama:

merchant_ok_url ve merchant_fail_url sadece kullanıcının tarayıcısını yönlendirmek için. Bunlar frontend sayfalara işaret etmeli.

🎯 Çözüm 2: PayTR Panel Ayarı (Kritik)

PayTR merchant panelinde callback URL'i güncelle:

https://muzibu.com/payment/callback/paytr

⚠️ Önemli:

  • Bu URL PayTR panel ayarlarında (IPN/Bildirim URL'i) kayıtlı olmalı
  • Eski sunucuda farklı URL yazıyorsa güncellenmeli
  • Test modunda da callback URL gerekli (bazı gateway'lerde)

🎯 Çözüm 3: Test & Validasyon

Düzeltme sonrası test adımları:

  1. 1.
    Kod güncellemesini yap

    PayTRDirectService.php'yi düzelt

  2. 2.
    PayTR panelini kontrol et

    Callback URL doğru mu?

  3. 3.
    Test ödemesi yap

    Yeni bir abonelik satın al

  4. 4.
    Logları kontrol et

    grep "PayTR callback received" storage/logs/laravel.log

  5. 5.
    Database kontrol

    Order payment_status "paid" olmalı, subscriptions "active"

📌 Özet

Sorun:

PayTRDirectService yanlış route kullanıyor ve PayTR callback'leri backend'e gelmiyor.

⚠️
Etki:

Kullanıcılar ödeme yapıyor ama abonelikler aktif olmuyor. Manuel müdahale gerekiyor.

Çözüm:

Kod düzeltmesi + PayTR panel callback URL ayarı + Test

📊
Sonraki Adım:

Kullanıcıdan onay alınca PayTRDirectService.php düzeltilecek ve PayTR panel ayarları kontrol edilecek.