Checkout, Poyra’nın müşterinize gösterdiği barındırılan ödeme sayfasıdır: https://odeme.ornek.com/l/{slug}. Kimlik doğrulaması yoktur — kiracı, adresin sonundaki tahmin edilemez slug’dan (96 bit rastgelelik) çözülür.
Checkout kart verisi toplamaz. Kart numarası, son kullanma ve CVV bankanın kendi güvenli sayfasında girilir; Poyra sayfasında yalnızca kartın ilk 6 hanesi (BIN) sorulur — o da sadece taksit seçeneklerini göstermek için. Bu tasarım PCI kapsamını en dar seviyede tutar.

Sayfanın akışı

1. Bağlantı çözümü

Sayfa açıldığında slug iki adımda çözülür: önce kiracıdan bağımsız bir arama tablosundan slug → kiracı eşlemesi bulunur, sonra kiracı bağlamı kurulup linkin kendisi izole veriden okunur. Link kapatılmışsa, süresi dolmuşsa veya kullanım sınırına ulaşmışsa müşteri nedenini açıkça görür; form hiç gösterilmez. İşyeri markası (logo, renk, destek iletişimi) sayfaya uygulanır. Logo da slug üzerinden sunulur — adres satırındaki başka bir parametreyle başka işyerinin logosu istenemez. Tutarı siz belirlemediyseniz (açık tutarlı bağlantı) müşteri tutarı lira olarak girer; kuruşa çevirmeyi sunucu yapar.

2. Taksit seçenekleri

Müşteri kartının ilk 6 hanesini girer — sayfa “kart numaranızın tamamını girmeyin” diye açıkça uyarır. BIN, kataloğa göre banka / kart programı / kart tipine çevrilir ve taksit şemalarına göre seçenekler listelenir:
  • Her seçenekte toplam tutar, aylık taksit ve varsa “+X ₺ vade farkı” görünür.
  • Aynı taksit sayısını birden çok POS sunuyorsa en düşük toplamı veren gösterilir.
  • Debit / ön ödemeli kartlara ve katalogda tanınmayan BIN’lere taksit önerilmez; müşteri tek çekimle devam edebilir.
Sayfa betiksiz tarayıcıda da çalışır: taksit sorgusu form POST + yönlendirme ile yapılır, noscript yedekleri vardır.

3. Ödeme ve bankaya gidiş

“Öde” düğmesi sunucu tarafında şunları yapar:
  1. Link yeniden çözülür ve kullanılabilirliği yeniden denetlenir.
  2. Sabit tutarlı linkte müşterinin gönderdiği tutar yok sayılır — tutar her zaman sunucudaki kayıttan gelir; adres satırı veya form kurcalamaya kapalıdır.
  3. Taksit, linkin izin verdiği aralığa kıstırılır.
  4. Ödeme oluşturulur ve link ile ödeme arasındaki bağ bankaya gitmeden önce sunucuda yazılır.
  5. Confirm çalışır: risk kapısırota kararı → banka formu.
Banka formu iki biçimde döner: bazı sağlayıcılar (Stripe, Adyen) tek bir adrese GET yönlendirmesi ister — müşteri doğrudan 302 ile gider. Türk bankalarının sanal POS’ları ise imzalı alanlarla POST bekler — checkout, gizli alanları içeren ve kendini otomatik gönderen bir ara sayfa üretir (“Bankanızın güvenli ödeme sayfasına yönlendiriliyorsunuz…”, betiksiz tarayıcı için düğme yedeği ile). Banka dönüşünün nasıl doğrulandığı ayrı bir sayfada: Banka dönüşü ve 3DS.

4. Sonuç sayfası

Banka dönüşü işlendikten sonra müşteri /l/{slug}/sonuc adresine yönlendirilir. Kritik ilke: sonuç, adres satırından değil defterden okunur. Query string’deki status yalnızca yönlendirme kolaylığıdır; sayfa ödemeyi kimliğiyle yükler ve gerçek durumu gösterir — adres satırını elle değiştirmek sahte dekont üretmez.
  • Başarıda dekont: karttan çekilen toplam (vade farkı dahil), tarih (TR saatiyle), taksit, işyeri adı ve işlem numarası. Bağlantının kullanım sayacı burada artar; müşteri sayfayı hiç açmasa bile iki dakikada bir çalışan güvence işi sayacı yine kapatır — ayrıntı Ödeme bağlantıları sayfasında.
  • Hatada teknik ayrıntı sızdırılmaz; birleşik hata kodu müşteri diline çevrilir: “Kartınızın limiti yetersiz”, “Bankanız işlemi onaylamadı” gibi. Açık tutarlı bağlantıda “Tekrar dene” bağlantısı girilen tutarı korur. İşyeri markasında destek telefonu/e-postası tanımlıysa burada gösterilir.

Üç sır, üç ayrı iş

Checkout akışında üç ayrı gizli değer dolaşır; hiçbiri diğerinin yerine geçmez: