muzibu.com · subscription · paytr · cart

Muzibu üyelik & kredi kartı akışı · Analiz Raporu

v2 · 22 Aralık 2025 PayTR Callback Subscription

📝 Basit Anlatım (Herkes İçin)

Kartla ödeme PayTR üzerinden alınıyor ve PayTR başarı bildirir bildirmez sipariş otomatik tamamlanıyor; üyelik süresi anında uzuyor, onay beklemiyor. Ama ödeme yapılmadan açılan bekleyen abonelik kayıtları deneme hakkını yanlış kilitleyebiliyor; ayrıca bazı premium kontrolleri yanlış veritabanına baktığı için ödeyen kullanıcı bile engellenebiliyor.

🔧 Teknik Detaylar (Geliştiriciler İçin)

  • PayTR callback → PayTRCallbackService::handleSuccessPaymentOrder::onPaymentCompletedactivateSubscriptionItems mevcut current_period_end üzerine gün ekliyor veya yeni subscription açıyor.
  • CSRF istisnası açık (payment/callback/*); değişiklikler SubscriptionObserver ile premium cache (5 dk) temizleniyor.
  • Checkout, ödeme öncesi status=pending_payment subscription kaydı açıyor; ödeme sonrası aynı kayıt aktive edilmediği için ikincil aktif kayıt oluşabiliyor.
  • Premium middleware central DB’de ends_at alanını okuyor; gerçek veri tenant DB’de current_period_end üzerinde.
  • PayTR Direct merchant_oid için modelde olmayan transaction_id alanını kullanıyor; callback eşleşmesi boşa düşüyor.

Kredi kartı sonrası üyelik uzaması

PayTR dönüşü gelir gelmez abonelik süresi otomatik uzuyor, manuel onay yok.

Akış

PayTR callback → payment completedOrder::onPaymentCompletedactivateSubscriptionItems mevcut tarihe gün ekler veya yeni abonelik açar.

Hız

Callback yanıtıyla eşzamanlı çalışır; tek koşul PayTR’in merchant_oid ile dönmesi ve payment/callback/paytr erişilebilir olması.

🛰️

Premium veri yolu

Premium kontrollerinin doğru DB ve alanı okuması kritik.

Doğru kaynak: Tenant DB · subscriptions.current_period_end · status in (active, trial).

Yanlış kaynak: Central DB · ends_at alanı → Premium kullanıcı bile 403 görebilir.

⚠️

Pending abonelikler trial'ı kilitliyor

Ödeme öncesi yazılan kayıtlar başarısız ödemede bile trial'i tüketmiş gösteriyor.

  • Sebep: CheckoutPage::createSubscriptionsFromOrder() ödeme öncesi has_trial=true kayıt ekliyor.
  • Sonuç: Subscription::userHasUsedTrial() status filtresiz olduğu için başarısız/iptal siparişler de trial'i yakıyor; aynı plan için ikinci aktif kayıt açılabiliyor.
  • Öneri: Pending kaydı oluşturma veya ödeme sonrası aynı kaydı active'e çevir; trial kontrolüne status IN (active, trial) filtresi ekle.
🚫

Premium middleware yanlış DB'yi okuyor

Central DB’deki ends_at sorgusu premium kullanıcıyı bile 403’e düşürebilir.

  • Sebep: Modules/Muzibu/app/Http/Middleware/CheckPremiumSubscription.phpDB::connection('central') + ends_at.
  • Öneri: Tenant DB + User::isPremiumOrTrial() + current_period_end > now() ile yeniden yaz.
🧾

PayTR Direct merchant_oid boş

Direct akışı transaction_id alanını kullanıyor; modelde yok.

  • Sebep: PayTRDirectService / PayTRPaymentService ->transaction_id okuyor.
  • Sonuç: Direct ödeme başlarsa PayTR'e hatalı merchant_oid gider, callback eşleşmez, abonelik uzamaz.
  • Öneri: Direct modunu kapat veya payment_number/gateway_transaction_id ile tutarlı merchant_oid üretip callback aramasını buna göre yap.

Öncelikli aksiyonlar

  1. Checkout'ta ödeme öncesi oluşturulan pending_payment kayıtlarını kaldır veya ödeme sonrası aynı kaydı aktive et; trial kontrolüne status IN (active, trial) filtresi ekle.
  2. Premium middleware'i tenant DB + User::isPremiumOrTrial() + current_period_end ile yeniden yaz; AI/stream endpoint'lerinde 403 testi ekle.
  3. PayTR Direct için merchant_oid üretimini payment_number/gateway_transaction_id bazlı yap veya Direct modu kapatıp iframe akışını tek kaynak olarak tut.
  4. Callback loglarını izle; payment/callback/paytr için uptime/health kontrolü ekle.