Telr ödemeleri ASP.NET Core'da: dokümanların atladığı kısımlar
Bir ekip, Telr'in hosted ödeme sayfasını ASP.NET Core'a bağlarken zor kısmın yönlendirme değil sonrası olduğunu anlatıyor: hiçbir şeyi kanıtlamayan return URL, iki kez veya geç gelebilen imzalı callback ve tek doğru kaynak olması gereken sunucu taraflı order/check. Sipariş başına tek session, invariant culture ile tutar formatlama, callback imza kontrolü ve siparişi tek seferde sahiplenme ele alınıyor.
Kilit noktalar
- Sipariş state'ini yalnızca order/check değiştirmeli; return URL kullanıcıya yönelik, callback ise imza doğrulandıktan sonra kanıt sayılıyor.
- Sipariş satırını kilitleyin; çift tıklama, retry veya ikinci sekme aynı sipariş için iki Telr session'ı açmasın.
- Tutarlar string olarak gidiyor: CultureInfo.InvariantCulture ile formatlayın, vergiyi satır bazında MidpointRounding.AwayFromZero ile yuvarlayın, toplamı decimal tutun.
- Store id, test flag, para birimi ve SHA1 advice hash'ini sabit zamanlı doğrulayın, sonucu tek bir koşullu update ile kaydedin.
- ExecuteUpdateAsync'i Pending/OnHold filtresiyle kullanın ki tek handler fulfil etsin; satış adetlerini atomik SQL increment ile artırın.
- Otuz dakikalık rezervasyonların süresi dolduğunda siparişi iptal etmek yerine beş dakikada bir order/check ile mutabakat yapın.
Telr'in hosted ödeme sayfası kart verisini API'den uzak tutuyor: session oluşturup müşteriyi yönlendiriyorsunuz ve sonucu bekliyorsunuz. Anas Amin'in yazısı, dokümanların atladığı kısmı anlatıyor. Sonucu üç ayrı sinyal bildiriyor ama yalnızca biri güvenilir: tarayıcının döndüğü return URL kullanıcı için, imzalı callback doğrulandığında kanıt, order/check ise — yani referansla sunucu tarafında sorgulama — state'i değiştirmesi gereken tek şey.
Belirleyici olan detaylar: sipariş satırı kilitli ve tek bir hosted session, sonucu bilinmeyen gateway çağrısı asla retry edilmiyor, tutarlar yuvarlanmış decimal satırlardan invariant culture ile üretiliyor, sabit zamanlı SHA1 imza kontrolü yapılıyor ve EF Core'daki koşullu update sayesinde callback ile tarayıcının verify çağrısı siparişi yalnızca bir kez kapatıyor. Süresi geçen rezervasyonlar, koltuklar bırakılmadan önce order/check ile mutabakat ediliyor.
Gerçek dünyada kullanımı
- Koltukları 30 dakika rezerve eden ve rezervasyon süresi dolduktan sonra ödeme gelebilen bir bilet satış platformu.
- Angular site ve Flutter WebView'in kullandığı, mobil uygulamanın yönlendirildiği URL'den asla başarı okumaması gereken bir ödeme akışı.
- Çift 'ödendi' bildirimi veya iki kez satılan koltuk sonrası mevcut ödeme entegrasyonunu denetleyen bir ekip.
- Production'da hâlâ test modu gateway ayarları varken deploy'u durdurması gereken bir CI/CD script'i.
Neden önemli
Idempotency ve sunucu taraflı doğrulama, tek koltuk için bir kez ödeme yapan müşteri ile çift çekim, fazla satılan etkinlik ve manuel iade kuyruğu arasındaki farkı belirliyor.