EMZETT.
Giriş yap

Stripe

Kısaca: Çevrimiçi ödemeler için bir ödeme hizmeti sağlayıcısı (ödeme sayfası, abonelikler, webhook’lar) — test kipi ile canlı kip arasındaki net ayrımıyla tanınır.

Biraz daha ayrıntılı: Test kipinde tüm ödeme akışı, canlı işletmeyle teknik olarak aynı biçimde (test kredi kartı numaralarıyla) oynanabilir; tam bir işletme doğrulaması gerekmez. Yalnızca canlı kipe (gerçek para) geçmek, bir işletme kaydı/ticaret sicili kaydı gibi kanıtlar gerektirir.

Bizim bağlamımız: Emzett’te şimdilik test kipinde çalışmaya devam eder, çünkü henüz bir işletme kaydedilmedi — ödeme mantığı kodda kalır, böylece sonradan yalnızca anahtarların değiştirilmesi gerekir.

Ayrıntılı

Stripe, 2010’da Collison kardeşlerin çevrimiçi ödemelerin geliştiriciler için orantısız karmaşık olduğu gözleminden kuruldu — PCI uyumluluğu, banka bağlantıları ve dolandırıcılık kontrolleri neredeyse her şirket tarafından kendi başına yeniden çözülmek zorundaydı. Temel fikir, birkaç satır kodla eklenebilen bir ödeme entegrasyonuydu; tüm düzenleyici ve güvenlik karmaşıklığını Stripe altta gizler. Bu, sektör standardı hâline geldi: birçok SaaS ürünü, pazar yeri ve abonelik hizmeti bugün kendi ödeme işlemesini geliştirmek yerine doğrudan Stripe üzerine kurulur.

Stripe tüm ödeme akışını iki yapı taşıyla modeller: Checkout (Stripe tarafından barındırılan, PCI uyumlu bir ödeme sayfası; kart verilerini kendin almak yerine müşteriyi oraya yönlendirirsin) ve webhook’lar (Stripe’ın kendi sunucuna bir ödemenin gerçekten tamamlandığını bildirdiği eşzamansız bildirimler). Bu, bilinçli bir güvenlik ve güvenilirlik kalıbıdır: ödemeden sonra kendi başarı sayfana geri yönlendirme, örneğin bir siparişi ödenmiş olarak işaretlemen gereken güvenilir an DEĞİLDİR — müşteri yönlendirme gerçekleşmeden sekmeyi kapatabilir, başarı sayfasını elle yeniden açabilir ya da bir tarayıcı çökmesi yönlendirmeyi tamamen engelleyebilir. Yalnızca imzalı webhook olayı (checkout.session.completed) gerçeğin kaynağıdır, çünkü doğrudan Stripe’ın sunucularından gelir ve müşterinin tarayıcısından bağımsız olarak teslim edilir.

Webhook güvenliği

Sık yapılan bir acemi hatası: webhook uç noktalarına kontrol etmeden güvenmek. Webhook URL’si herkese açık erişilebilir olmalı (Stripe onu dışarıdan çağırabilmeli) olduğundan, herkes kuramsal olarak sahte bir checkout.session.completed mesajı gönderip böylece “ödenmiş” bir sipariş elde edebilir. Bu yüzden Stripe her webhook isteğini bir HMAC imza başlığıyla (Stripe-Signature) imzalar; içeriğe güvenmeden önce bunu sunucuda kendi webhook sırrınla doğrulamalısın:

const sig = request.headers.get("stripe-signature")!
const event = stripe.webhooks.constructEvent(
  rawBody, // ÖNEMLİ: ayrıştırılmış JSON değil, değiştirilmemiş istek gövdesi
  sig,
  process.env.STRIPE_WEBHOOK_SECRET!,
)

“Değiştirilmemiş gövde” vurgusu bir ayrıntı değildir: birçok çerçeve, kendi kodun görmeden önce istek gövdesini varsayılan olarak otomatik olarak JSON’a ayrıştırır — oysa imza kontrolü tam olarak Stripe’ın imzaladığı ham baytları gerektirir, aksi hâlde doğrulama başarısız olur (Stripe entegrasyonlarında klasik bir tuzak).

Idempotency anahtarları ve abonelikler

Bir diğer önemli yapı taşı idempotency anahtarlarıdır: ağ hataları bir isteğin iki kez ulaşmasına yol açabileceğinden (istemci yanıt gelmediği için yeniden gönderir), “ödemeyi tahsil et” gibi her kritik isteğe benzersiz bir anahtar verilebilir — Stripe kopyaları bundan tanır ve aynı istek kaç kez gelirse gelsin eylemin yalnızca bir kez gerçekleştirilmesini garanti eder.

const session = await stripe.checkout.sessions.create(
  { line_items, mode: "payment", success_url, cancel_url },
  { idempotencyKey: orderId },
)

Yinelenen ödemeler için Stripe, faturalama döngülerini, oransal değişiklikleri (bir döngünün ortasında plan değiştirirken proration) ve başarısız ödeme denemelerini (dunning — kartın süresi dolduğunda otomatik yeniden denemeler) otomatik yöneten kendi mode: "subscription" kipini sunar; bu mantığı kendin yeniden kurmak zorunda kalmazsın.

Alternatiflerle karşılaştırma

PayPal ile karşılaştırıldığında Stripe çok daha ayrıntılı API’ler ve daha iyi geliştirici belgeleri sunar, ancak PayPal’ın devasa kurulu kullanıcı tabanından yoksundur (birçok müşteri tanıdık bir PayPal düğmesine tanımadık bir kredi kartı formundan daha çok güvenir). Adyen daha çok çok bireysel gereksinimleri ve daha karmaşık sözleşme koşulları olan büyük müşterilere yöneliktir; Stripe ise bilinçli olarak sözleşme pazarlığı olmadan self servise dayanır. Mollie ve Klarna, yerel ödeme yöntemleriyle (SEPA otomatik ödeme, anında banka havalesi, faturayla ödeme) Avrupa’da güçlüdür — Stripe artık bu yöntemlerin çoğunu da destekler, ancak aslen daha çok kredi kartlarına odaklıydı.

Testten canlı kipe geçiş için: iki kipin de tamamen ayrı API anahtarları, müşterileri, ürünleri ve webhook uç noktaları vardır — test verilerini “terfi ettirmenin” bir yolu yoktur; geçiş pratikte canlı anahtarlarla temiz bir yeniden başlangıç demektir.

Ayrıca bak: Ortam değişkenleri, JSON