Ödeme Entegrasyonlarında Ağ Kopukluğu ve Çifte Tahsilat Problemi
İnternet ortamında yapılan istemci ve sunucu arasındaki veri iletimi her zaman kesintisiz bir hatta gerçekleşmez. Bir e-ticaret uygulamasında veya web servisinde kullanıcı ödeme butonuna bastığında istemci sunucuya bir HTTP POST isteği gönderir. Bu istek ödeme sağlayıcısına ya da kendi arka plan servisinize iletilirken ağ seviyesinde bir kopma yaşanabilir. Ağ kopuklukları sistem mühendisliğinde belirsiz durumlar yaratır.
Ağ hatası meydana geldiğinde istemci tarafında yanıt alınamaz. Bu noktada üç farklı senaryo gerçekleşmiş olabilir:
- İstek sunucuya hiç ulaşmamıştır ve hiçbir işlem yapılmamıştır.
- İstek sunucuya ulaşmış, ancak işlem aşamasında hata almıştır.
- İstek sunucuya ulaşmış, karttan para tahsil edilmiş fakat dönen HTTP yanıtı ağ kopukluğu nedeniyle istemciye ulaşmamıştır.
İstemci uygulamasının bu üç ihtimal arasından hangisinin yaşandığını bilmesi standart bir HTTP yanıtı olmadan imkansızdır. Eğer istemci güvenli olmayan bir şekilde isteği doğrudan tekrar gönderirse (retry), kullanıcının kartından ikinci kez ödeme çekilmesi riski doğar. Diğer yandan, ağ hatası nedeniyle işlemden tamamen vazgeçilirse kullanıcı ödemeyi tamamladığı halde siparişi oluşturulmayabilir ve satış kaybı yaşanır.
Bu belirsizlik sorununu çözmek için ödeme API entegrasyonlarında Idempotent (etkisiz/özdeş) işlem mimarisi kullanılır.
Idempotency Key Nedir ve Nasıl Çalışır?
Matematikte ve bilgisayar bilimlerinde bir işlemin birden fazla kez uygulanması durumunda bile sonucun değişmemesi özelliğine idempotency denir. HTTP standartlarında GET ve PUT metodları doğası gereği idempotent kabul edilirken, POST metodları idempotent değildir. Her POST isteği sunucu tarafında yeni bir kaynak veya veri kaydı oluşturabilir.
Ödeme işlemlerinde POST isteklerini güvenli hale getirmek için Idempotency Key (benzersiz işlem anahtarı) yöntemi uygulanır. Mantıksal her bir ödeme adımı için istemci tarafında benzersiz bir değer üretilir. Bu değer genellikle HTTP başlığında (header) Idempotency-Key ismiyle ödeme servisine iletilir.
Idempotency Key mimarisinin çalışma mantığı şu aşamalardan oluşur:
- Benzersiz Anahtar Üretimi: İstemci, kullanıcının başlattığı mantıksal işlem için bir anahtar üretir.
- Anahtarın Gönderilmesi: İstek sunucuya veya ödeme API servisine HTTP header içinde iletilir.
- Sunucu Kontrolü: Sunucu gelen isteğin header bilgisindeki anahtarı veri tabanında veya önbellek katmanında arar.
- İlk İşlem: Eğer bu anahtar daha önce hiç işlenmemişse, ödeme işlemi çalıştırılır. İşlem tamamlandıktan sonra dönen yanıt ve HTTP durumu bu anahtar ile eşleştirilerek saklanır.
- Tekrarlanan İşlem: Eğer aynı anahtar ile tekrar bir istek gelirse, sunucu ödeme işlemini ikinci kez tetiklemez. Veri tabanında veya önbellekte saklanan ilk yanıtı doğrudan istemciye geri döner.
Bu sayede istemci ağ hatası alsa bile aynı anahtar ile isteği güvenle tekrar deneyebilir. Sunucu kartı yeniden borçlandırmaz ve ilk başarılı yanıtı iletir.
Idempotency Mimarisi Kurarken Dikkat Edilmesi Gereken Adımlar
Güvenli ve hatasız bir ödeme mimarisi oluşturmak için backend geliştirmede belirli adımların izlenmesi gerekir. Bu adımlar verinin tutarlılığını korumak için hayati önem taşır.
1. Anahtarın İstemci Tarafında Üretilmesi
Idempotency anahtarı mutlaka işlemi başlatan istemci tarafında üretilmelidir. Sunucu tarafında üretilen anahtarlar, istek sunucuya ulaşmadığı durumlarda ağ belirsizliği problemini çözemez. Anahtar formatı olarak UUID v4 gibi benzersizlik oranı yüksek dizilimler tercih edilir.
2. Önbellek ve Kilit Mekanizması (Concurrent Requests)
İstemci tarafındaki bir yazılım hatası nedeniyle aynı anahtarla milisaniyeler içerisinde birden fazla istek eşzamanlı olarak gönderilebilir. İlk istek henüz ödeme sağlayıcısından yanıt almamışken ikinci isteğin gelmesi durumunda her iki istek de anahtarın henüz işlenmediğini görebilir.
Bu durumun önüne geçmek için kilit (lock) mekanizması kurulmalıdır:
- Anahtar sunucuya ulaştığı anda önbelleğe işleniyor statüsüyle yazılır veya bir kilit konulur.
- Aynı anahtar ile gelen ikinci istek, kilit kaldırılana veya işlem tamamlanana kadar bekletilir ya da geçici bir çakışma hatası döner.
- Ödeme sağlayıcısından yanıt geldiğinde kilit kaldırılır ve nihai yanıt kaydedilir.
3. Anahtar Yaşam Süresi (TTL) ve Saklama
Idempotency anahtarları sonsuza kadar saklanmak zorunda değildir. Genellikle 24 saat ile 72 saat arasında bir yaşam süresi (TTL) belirlenir. Bu süre e-ticaret ve ödeme sistemlerinde ağ hatalarının telafi edilmesi için yeterlidir. Bellek içi anahtar-değer veri depoları bu saklama süreci için sıkça tercih edilir.
4. İstek Gövdesi ve Bağlam Doğrulaması
Farklı bir mantıksal işlemin aynı idempotency anahtarıyla gönderilmesini engellemek için sunucu tarafında doğrulama yapılmalıdır. Anahtar ile birlikte gelen kullanıcı kimliği, tutar veya sepet içeriği eşleşmiyorsa sunucu işlemi reddetmeli ve istemciye hatalı istek bildirimi yapmalıdır.
Sık Yapılan Hatalar ve Kontrol Listesi
Ödeme entegrasyonlarında idempotency uygularken yapılan bazı yaygın hatalar sistemin çökmesine veya hatalı tahsilatlara yol açabilir.
- Her Denemede Yeni Anahtar Üretmek: Ağ hatası alındığında yeniden deneme yaparken yeni bir anahtar üretilmesi idempotency mantığını tamamen bozar. Yeniden denemeler aynı mantıksal anahtarla yapılmalıdır.
- Kilit Zamanaşımı Belirlememek: Sunucu tarafındaki kilit mekanizmasında zamanaşımı tanımlanmazsa, yanıt alınamayan bir işlem sonrasında o anahtar süresiz olarak kilitli kalabilir.
- Yanıtı Saklamayı Unutmak: Yalnızca işlemin yapılıp yapılmadığını tutmak yeterli değildir. İstemcinin ilk istekte alacağı HTTP yanıt kodunun ve yanıt gövdesinin aynen saklanıp döndürülmesi gerekir.
Geliştirici Kontrol Listesi
- İstemci mantıksal işlem başına benzersiz
Idempotency-Keyüretiyor mu? - Ağ hatalarında yapılan otomatik yeniden denemeler aynı anahtarı kullanıyor mu?
- Arka plan servisi eşzamanlı gelen aynı anahtarlı istekleri kilitleyerek engelliyor mu?
- Saklanan anahtarlar için uygun bir TTL süresi tanımlandı mı?
- Anahtarın kapsama alanı ve kullanıcı doğrulaması yapılıyor mu?
E-Ticaret ve Backend Sistemlerinde Idempotency Kullanımı
Modern e-ticaret siteleri ve finansal yazılımlar API servislerinde idempotency standartlarına uymak zorundadır. Özellikle yüksek hacimli işlemlerde veya mobil internet bağlantısının dalgalandığı durumlarda ağ kopması sıkça karşılaşılan bir durumdur.
Güçlü bir backend ve API geliştirme altyapısı, ağ hatalarından kaynaklanan çifte ödeme riskini tamamen ortadan kaldırır. Ödeme sağlayıcılarının API dokümantasyonları incelendiğinde idempotency başlıklarının güvenli işlem için önerildiği görülür. Türkiye merkezli bir yazılım stüdyosu olan F-Development, 2019'dan bu yana 12 ülkede 500'den fazla projede edindiği deneyimle karmaşık sistem mimarileri sunmaktadır.
Güvenli ödeme altyapıları ve finansal yazılımlar kurgulamak için finans ve ödeme sistemleri çözümlerimizi inceleyebilir veya doğrudan iletişime geçebilirsiniz.