Next.js mağazasında 3D Secure ödeme akışı nasıl kurulur
Yayın
Kısa cevap
Ödemeyi sunucudan başlat, müşteriyi ödeme sağlayıcısının verdiği adresle banka doğrulama sayfasına gönder, müşteri dönünce ödemenin gerçekten tamamlandığını sunucuda sağlayıcıdan sorgulayarak doğrula. Tarayıcıya dönen sonuca asla güven. Harmoni Yazılım'da QNBPay ile ödeme almayı entegre ettim ve 3D Secure doğrulama akışını ön yüze ilettim.
3D Secure nedir ve akış nasıl işler
3D Secure, kartı çıkaran bankanın kart sahibini ayrıca doğruladığı bir adımdır. Müşteri çoğunlukla SMS kodu ya da banka uygulaması onayıyla doğrulama yapar. Birçok ödeme sağlayıcı ve banka çevrimiçi kart ödemelerinde bu adımı zorunlu tutar, bu yüzden bir e-ticaret sitesinde ödeme akışı bu adımı hesaba katarak tasarlanmalıdır.
Akışın özelliği, müşterinin bir noktada senin sitenden çıkıp bankanın sayfasına gitmesi ve oradan geri dönmesidir. Bu yüzden ödeme sonucunu tarayıcıdan değil, sunucudan öğrenmen gerekir.
Adım adım akış
- Müşteri ödeme formunu gönderir. Kart bilgisi sunucuna uğramadan sağlayıcının kendi alanına ya da API'sine gider.
- Sunucun ödemeyi sağlayıcıda başlatır ve sipariş numarasını kendi veritabanında bekliyor olarak kaydeder.
- Sağlayıcı bir yönlendirme adresi ya da otomatik gönderilen bir HTML formu döndürür.
- Ön yüz müşteriyi bu adrese tam sayfa yönlendirir ve banka doğrulama sayfası açılır.
- Müşteri doğrulamayı tamamlar, banka sağlayıcıya, sağlayıcı da senin geri dönüş adresine döner.
- Geri dönüş adresin, ödemenin durumunu sağlayıcıdan sunucu tarafında sorgular ve siparişi günceller.
- Müşteri sipariş sonuç sayfasına yönlendirilir.
Next.js tarafında yapılacaklar
Başlatma ve geri dönüş adımlarını Route Handler olarak yaz. Geri dönüş adresi bankadan POST ile çağrılabilir; bu durumda sonucu 303 ile bir sonuç sayfasına yönlendir ki tarayıcı sayfayı yenilediğinde ödeme tekrar işlenmesin. Aşağıdaki örnek sağlayıcıdan bağımsız bir iskelet gösterir.
// app/api/payments/callback/route.ts
export async function POST(request: Request) {
const form = await request.formData();
const orderId = String(form.get("orderId") ?? "");
// Gelen sonuca güvenme. Gerçek durumu sağlayıcıdan sor.
const payment = await provider.getPayment(orderId);
if (payment.status === "paid") {
await markOrderPaid(orderId, payment.id);
}
return Response.redirect(new URL(`/orders/${orderId}`, request.url), 303);
}Sık yapılan hatalar
- Adres çubuğundaki ya da form gövdesindeki sonuca güvenip siparişi ödenmiş saymak.
- Müşterinin doğrulamayı yarıda bırakmasını düşünmemek. Bekleyen siparişler için bir zaman aşımı ve yeniden deneme yolu olmalı.
- Doğrulama sayfasını iframe içinde açmak. Birçok banka sayfası buna izin vermez, tam sayfa yönlendirme daha uyumludur.
- Aynı ödeme için geri dönüş adresinin iki kez çalışması. Siparişi durumuna göre güncelle ve işlemi tekrarlanabilir yaz.
- Kart numarasını ya da CVV'yi kendi sunucunda ya da loglarında tutmak.
Sık sorulanlar
- 3D Secure için iframe mı yönlendirme mi kullanılmalı?
- Tam sayfa yönlendirme. Birçok banka doğrulama sayfası iframe içinde açılmaya izin vermez.
- Ödemenin başarılı olduğunu ön yüz mü onaylamalı?
- Hayır. Sonucu sunucuda, ödeme sağlayıcısından sorgulayarak doğrula ve ön yüze sadece sonucu göster.
- Kart bilgisini kendi sunucumda saklamalı mıyım?
- Hayır. Kart bilgisi ödeme sağlayıcıya gider; sen sadece sağlayıcının verdiği ödeme ve sipariş kimliklerini saklarsın.
Bu konuda çalışıyorum
Yazan: Mert Yılmaz, freelance fullstack geliştirici.