Mesajlaşma

ASP.NET Core'da Stripe webhook'larını idempotent yapmak

Yazar, Stripe webhook olaylarının iki kez gelmesi ve aynı anda işlenmesi durumunda ödemenin iki kez uygulanmasını önleyen bir inbox deseni anlatıyor. Örnek proje, veritabanına unique index ile yazılan bir insert, koşullu güncelleme ve yeniden deneme mantığını 38 testle doğruluyor. Ödeme akışı kuran .NET geliştiricileri için somut bir referans.

DEV Community: #csharp Martin Pisacreta
Yayın tarihi
Okuma süresi
5 dk okuma
agent çalıştırması #14
agent çalıştırması #14
Orijinale git dev.to

Bu haberi bildir

Özette bir hata mı var, ya da bu içeriğin sahibi misin? Mesajın doğrudan bana e-posta olarak gelir.

Mesaj türü

Kilit noktalar

  • Tekilleştirme anahtarı olarak Stripe event ID kullanılıyor; iki teslimat aynı satır için yarışıyor.
  • İmza doğrulaması, deserialize edilip yeniden serialize edilmemiş ham gövde üzerinde yapılıyor.
  • Insert, benzersiz EventId indeksiyle yapılıyor; ön bir varlık sorgusu kullanılmıyor.
  • Olay, yanıt vermeden önce Pending olarak kalıcı saklanıyor; kuyruk kaybolsa da sweeper bekleyen satırları yeniden kuyruğa alıyor.
  • Claim güncellemesi ve ödeme değişikliği aynı transaction içinde commit ediliyor.
  • Dış e-posta, kargo ve API çağrıları için ayrı bir outbox ve idempotency gerekiyor.

Stripe, bir webhook isteğinin yanıtı kaybolursa aynı olayı yeniden gönderebilir ve iki teslimat birbirine çok yakın zamanda da çakışabilir. Yazar, olayın Stripe event ID'sini tekilleştirme anahtarı olarak kullanıyor. İmza doğrulamasını ham gövde üzerinde yapıp, olayı ProcessedEvents tablosuna benzersiz indeksli bir insert ile yazıyor; ikinci teslimat satır etkilemiyor ve duplicate yanıtı alıyor. Kuyruk yalnızca bir zamanlama aracı; kalıcı kayıt veritabanında.

İşleyici, olayı Pending'den Processed'e koşullu güncellemeyle alıyor ve ödeme değişikliğini aynı transaction içinde kaydediyor. Hata olursa rollback hem talebi hem yerel ödeme değişikliğini geri alıyor; deneme sınırı aşılan olaylar Failed olarak işaretleniyor ve operasyon ekibinin müdahalesini bekliyor. Yazarın da belirttiği sınırlar önemli: bu garanti yalnızca yerel veritabanı etkileri için geçerli, e-posta ya da dış API çağrıları için outbox ve karşı taraf idempotency gerekiyor.

Gerçek dünyada kullanımı

  • Abonelik ve tek seferlik ödemeleri işleyen bir ASP.NET Core API'si, Stripe webhook'larını güvenli şekilde kabul etmek istediğinde.
  • Ödeme durumunu yerel veritabanında tutan bir arka plan işçisi, aynı olayı birden fazla kez alabildiğinde.
  • Birden fazla uygulama örneği çalışan bir servis, yeniden denemelerde çift kayıt oluşmasını önlemek istediğinde.

Neden önemli

Webhook tekrarları ve eşzamanlı teslimatlar normal davranıştır; yalnızca uygulama içi bir koleksiyonla tekilleştirme yapmak çoklu örnekte ve yeniden başlatmada yetmez. Veritabanı kısıtı ve transaction ile kurulan bu desen, ödeme kayıtlarının tutarlı kalmasını sağlar.

Bu özet, DEV Community: #csharp üzerindeki orijinal yazıdan agent tarafından üretildi. Yazının tamamı ve tüm hakları ilgili yazara/yayıncıya aittir. Orijinal yazıya git

Benzer haberler

Geri bildirim

Bir hata mı buldun, bir fikrin mi var? Yazdığın mesaj doğrudan bana e-posta olarak gelir.

Mesaj türü