Merhaba Laravel geliştiricileri! Bu yazıda, projelerimizde farklı ödeme sağlayıcılarını kullanarak kesintisiz bir ödeme akışı oluşturmak için nasıl failover (yedekleme) yapısı kurabileceğimizi anlatacağım. Failover yapısı, bir sağlayıcı arızalandığında veya çalışmadığında sıradaki sağlayıcıyı devreye sokarak ödeme işlemlerinin kesintisiz ilerlemesini sağlar.
Neden Failover Yapısına İhtiyaç Var?
Tek bir ödeme sağlayıcısına bağımlı kalmak, o sağlayıcıda yaşanabilecek bir kesinti durumunda kullanıcıların işlem yapamamasıyla sonuçlanabilir. Failover yapısı, farklı ödeme sağlayıcıları arasında otomatik geçiş sağlayarak bu riski azaltır. Böylece ödemelerde kesinti olmadan hizmet sunmaya devam edebilirsiniz.
Laravel ile Failover Yapısı Nasıl Kurulur?
Bu yapıyı kurmak için aşağıdaki adımları izleyebiliriz:
1. PaymentGatewayInterface Arayüzünü Tanımlama
Öncelikle, tüm ödeme sağlayıcıları için ortak olacak bir arayüz (PaymentGatewayInterface
) oluşturalım. Bu arayüz, sağlayıcıların charge
(ödeme yap) ve getName
(sağlayıcı ismini getir) gibi metodları içermesini sağlayacak:
namespace App\Services;
interface PaymentGatewayInterface
{
public function charge($amount);
public function getName(): string;
}
2. Ödeme Sağlayıcı Sınıflarını Oluşturma
Ardından, her ödeme sağlayıcıyı temsil eden sınıflarımızı PaymentGatewayInterface
arayüzünü implement edecek şekilde tanımlayalım. Örneğin XPaymentGateway
ve YPaymentGateway
sınıflarını şu şekilde oluşturabiliriz:
namespace App\Services;
class XPaymentGateway implements PaymentGatewayInterface
{
public function charge($amount)
{
// XPaymentGateway üzerinden ödeme işlemi
return "X ödeme sağlayıcısı ile ödeme başarılı.";
}
public function getName(): string
{
return 'XPaymentGateway';
}
}
class YPaymentGateway implements PaymentGatewayInterface
{
public function charge($amount)
{
// YPaymentGateway üzerinden ödeme işlemi
return "Y ödeme sağlayıcısı ile ödeme başarılı.";
}
public function getName(): string
{
return 'YPaymentGateway';
}
}
3. PaymentManager Sınıfı: Failover Yapısının Merkezi
PaymentManager
sınıfı, ödeme sağlayıcıları arasında failover işlevini yönetecek. Bu sınıf, arayüzü implement eden ödeme sağlayıcıları arasında sırayla işlem yaparak ilk başarılı olanı kullanır:
namespace App\Services;
class PaymentManager
{
protected $providers;
public function __construct(array $providers)
{
$this->providers = $providers;
}
public function charge($amount)
{
foreach ($this->providers as $provider) {
try {
return $provider->charge($amount);
} catch (\Exception $e) {
// Hata kaydediliyor, sıradaki sağlayıcıya geçiliyor
logger()->error("Provider failed: {$provider->getName()} - " . $e->getMessage());
}
}
// Tüm sağlayıcılar başarısız olduysa istisna fırlat
throw new \Exception("Tüm ödeme sağlayıcıları başarısız oldu.");
}
}
4. Sağlayıcıları Service Container’a Kayıt Etme
Laravel’in Service Container’ında PaymentManager
sınıfına sağlayıcıları tanımlayarak ödeme işlemlerinin failover yapısını kurabiliriz. Böylece PaymentManager
çağrıldığında sağlayıcılar sırayla denenir:
// AppServiceProvider.php
use App\Services\XPaymentGateway;
use App\Services\YPaymentGateway;
use App\Services\PaymentManager;
use App\Services\PaymentGatewayInterface;
public function register()
{
$this->app->bind(PaymentManager::class, function ($app) {
return new PaymentManager([
$app->make(XPaymentGateway::class),
$app->make(YPaymentGateway::class),
]);
});
}
5. PaymentManager Kullanımı
Controller içinde PaymentManager
sınıfını çağırarak ödemeleri failover yapısı ile başlatabiliriz. İlk sağlayıcı başarısız olursa sıradaki sağlayıcıya geçecektir.
namespace App\Http\Controllers;
use App\Services\PaymentManager;
class OrderController extends Controller
{
protected $paymentManager;
public function __construct(PaymentManager $paymentManager)
{
$this->paymentManager = $paymentManager;
}
public function store()
{
try {
$result = $this->paymentManager->charge(100);
return response()->json(['message' => $result]);
} catch (\Exception $e) {
return response()->json(['error' => 'Ödeme işlemi başarısız.'], 500);
}
}
}
Failover yapısı sayesinde ödeme sağlayıcıları arasında kesintisiz bir geçiş yaparak, herhangi bir sağlayıcı arızalandığında sıradaki sağlayıcıyla ödemeyi tamamlayabiliriz. PaymentGatewayInterface
ile sağlayıcıları standart bir yapıya kavuşturarak kolayca yeni sağlayıcı ekleyebilir veya mevcut sağlayıcıları değiştirebiliriz. Bu, projelerinizde ödemelerin kesintisiz devam etmesini sağlayarak kullanıcı deneyimini önemli ölçüde iyileştirir.
Bu yapıyı kullanarak, Laravel ile çok daha esnek ve sağlam bir ödeme akışı kurabilirsiniz.
Laravel Service Container ve Dependency Injection konularını daha derinlemesine öğrenmek istiyorsanız, Laravel Service Container ve Dependency Injection (DI) Kullanımı adlı makalemi incelemenizi öneririm.