Kontrolcü Felaketi
Stripe veya Razorpay’i bir Laravel backend’ine entegre ederken, çoğu geliştirici en az direnç yolunu seçer. Tüm mantığı tek bir kontrolcüye doğrudan yerleştirirler. Kullanıcının ödeme yapıp yapmadığını kontrol eder, kartı tahsil eder, veritabanını günceller ve hepsini tek bir devasa 150 satırlık PHP metodunda e-posta gönderirler.
Bu sadece bir kez işler: mutlu senaryoda. Ancak ya kullanıcının bankası 3D Secure kimlik doğrulaması gerektiriyorsa? Ya kart yetersiz bakiye nedeniyle reddedilirse? Ya webhook, frontend işlemesine başlamadan önce gelirse?
Devasa kontrolcünüz, yönetilemez bir if/else ifadeleri karmaşasına dönüşüyor ve daha da kötüsü, kullanıcılardan ürün erişimi sağlanmadan ücret tahsil ediliyor.
State Machine Mimarisi
Para işlemleri tam bir hassasiyet gerektirir. Başarısız ödemeler ve asenkron webhook’ların karmaşıklığını çözmek için, ödeme mantığımızı HTTP kontrolcülerimizden tamamen ayrıştırıyoruz. Bir Faturalama State Machine mimarisi kuruyoruz.
Bir “Abonelik” durumunu basit bir boolean sütun olarak (is_premium = true) ele almak yerine, bunu katı durumlardan geçiş yapan bir yapı olarak değerlendiriyoruz: pending, active, past_due ve canceled.
Uygulama Stratejisi
Laravel’de, bu geçişleri özel Action sınıfları ve Webhook işleyicileri kullanarak yönetiyoruz ve Flutter frontend’ine ödeme durumunu belirlemede asla güvenmiyoruz.
- Niyet: Flutter uygulaması bir abonelik satın alma talebinde bulunur. Laravel kontrolcüsü bir Stripe SetupIntent oluşturur, veritabanında
pendingbir abonelik kaydı oluşturur ve istemci secret’ını telefona döner. Kontrolcünün görevi tamamlanır. - İşleme: Flutter uygulaması, PCI uyumlu kalmak için gerçek kredi kartı girişini doğrudan Stripe’ın sunucuları ile işler.
- Durum Geçişi: Tamamen asenkron webhook’lara güveniyoruz. Stripe, kartı başarıyla tahsil ettiğinde, güvenli Laravel webhook uç noktamızı tetikler. İzole bir background job, bunu yakalar,
pendingaboneliği bulur ve durumunu resmi olarakactiveolarak değiştirir.
Sonuç
Sıkı bir state machine uygulayarak, bir kullanıcının hesabının yalnızca para bankadan geçtikten sonra yükseltilmesini garanti ediyoruz. Yarış koşullarını ortadan kaldırıyoruz, 3D Secure hatalarını zarif bir şekilde yönetiyoruz ve finansal mantığımızın temiz, test edilebilir ve tamamen UI’dan ayrılmış kalmasını sağlıyoruz.
Kaynak: Orijinal Makale


