muzibu.com · subscription / payment / cart

Muzibu üyelik ve kredi kartı akış analizi

22 Aralık 2025

📝 Basit Anlatım (Herkes İçin)

Kartla ödeme PayTR üzerinden alınıyor; PayTR başarı dönüşü geldiği anda sipariş otomatik tamamlanıyor ve üyeliğin süresi uzuyor, ekstra onaya gerek kalmıyor. Ancak ödeme alınmadan oluşturulan bekleyen abonelik kayıtları deneme hakkını yanlış kilitleyebiliyor ve bazı premium kontrolleri veriyi yanlış yerden okuduğu için üyeyi yine de kısıtlayabiliyor.

🔧 Teknik Detaylar (Geliştiriciler İçin)

  • PayTR callback: Modules/Payment/App/Services/PayTRCallbackService::handleSuccessPayment()Order::onPaymentCompleted()Order::activateSubscriptionItems() mevcut aboneliği uzatıyor veya yeni abonelik oluşturuyor.
  • CSRF istisnası aktif (payment/callback/*), callback çalıştığında SubscriptionObserver cache temizliyor; premium cache 5 dakikalık TTL ile güncelleniyor.
  • Checkout akışında CheckoutPage::createSubscriptionsFromOrder() ödeme öncesi status=pending_payment abonelik kaydı açıyor; ödeme sonrası aynı sipariş için activateSubscriptionItems() yeni aktif kayıt oluşturuyor, mevcut bekleyen kayıt güncellenmiyor.
  • Premium middleware (Modules/Muzibu/app/Http/Middleware/CheckPremiumSubscription.php) central DB ve ends_at kolonunu kullanıyor; gerçek veriler tenant DB ve current_period_end alanında tutuluyor.
  • PayTR Direct servisinde (PayTRDirectService::prepareDirectPayment()) merchant_oid için olmayan transaction_id alanı kullanılıyor; callback eşlemesi yapılamıyor.

Kredi kartı sonrası üyelik uzaması

PayTR başarı callback'i otomatik olarak siparişi tamamlıyor ve abonelik süresini anında güncelliyor.

⚠️

Bekleyen abonelikler trial'ı kilitliyor

Ödeme alınmadan açılan pending kayıtlar, ödeme başarısız olsa bile "trial kullandı" izini bırakıyor.

  • Sebep: CheckoutPage::createSubscriptionsFromOrder() ödeme öncesi has_trial=true abonelik kaydediyor.
  • Sonuç: Subscription::userHasUsedTrial() status filtresi olmadan çalıştığı için başarısız/iptal siparişlerde bile trial hakkı tüketilmiş görünüyor; aynı plan için ikinci aktif kayıt da açılabiliyor.
  • Öneri: Pending kaydı hiç oluşturma ya da ödeme sonrası bu kaydı active'e çevir; trial kullanım kontrolünde status IN (active,trial) filtresi ekle.
🚫

Premium middleware yanlış DB'yi okuyor

API'deki premium kontrolü central DB'deki subscriptions.ends_at alanını sorguluyor.

  • Sebep: Modules/Muzibu/app/Http/Middleware/CheckPremiumSubscription.phpDB::connection('central') ve ends_at sütunu kullanıyor.
  • Sonuç: Muzibu tenant DB'deki (current_period_end) gerçek abonelikler görülmüyor; AI/play endpoint'leri premium kullanıcıyı dahi 403 ile çevirebilir.
  • Öneri: Tenant bağlantısını ve User::isPremiumOrTrial() / current_period_end > now() kontrolünü kullanacak şekilde middleware'i güncelle.
🧾

PayTR Direct merchant_oid boş kalıyor

Direct (kart formu) entegrasyonu transaction_id alanını kullanıyor, tablo ve modelde bu alan yok.

  • Sebep: PayTRDirectService::prepareDirectPayment() ve PayTRPaymentService merchant_oid için olmayan ->transaction_id'yi alıyor.
  • Sonuç: Direct ödeme başlatılırsa PayTR'e boş/yanlış merchant_oid gider; callback gateway_transaction_id ile eşleşmez, abonelik uzamaz.
  • Öneri: Direct akışını devre dışı bırak ya da payment_number / gateway_transaction_id ile tutarlı merchant_oid üretip callback aramasını buna göre yap.

Öncelikli aksiyonlar

  1. Checkout'taki önceden oluşturulan pending_payment abonelikleri kaldır veya ödeme sonrası aktif hale getir; trial kullanım kontrolünü status filtresiyle düzelt.
  2. Premium middleware'i tenant DB ve current_period_end alanına geçir; API 403 hataları için bir health test ekle.
  3. PayTR Direct için merchant_oid üretimini payment_number/gateway_transaction_id bazlı yap ya da bu modu kapatıp iframe akışını tek kaynak olarak tut.
  4. Callback loglarını (success/fail) gözlemleyip eksik dönüş var mı kontrol et; gerekirse payment/callback/paytr için uptime monitörü ekle.