fix(odeme): action redirect fırlatmaz, hedef döndürür + çift paket çekimine sunucu koruması
All checks were successful
Deploy / deploy (push) Successful in 8m46s

- baslatOdeme { error } | { yonlendir } döndürür; SatinAlForm client'ta
  router.push yapar (cacheComponents altında geri dönüşte buton tıklamaya
  sağır kalıyordu); tıklamada ok → dönen halka
- paketi olan yeniden 'paket', paketi olmayan 'topup' başlatamaz
- /odeme, paket alınmışken eski bekleyen paket siparişinin formunu göstermez

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-21 16:13:30 +03:00
parent d7c29ac4a6
commit 8f4669e31d
4 changed files with 93 additions and 32 deletions

View File

@@ -1,7 +1,8 @@
# iyzico ödeme entegrasyonu
Ödeme akışı iyzico **Checkout Form (CF)** üzerinden yürür: kart bilgisi hiçbir
zaman bize ulaşmaz, kullanıcı iyzico'nun barındırdığı ödeme sayfasına gider.
zaman bize ulaşmaz; kart formu iyzico iframe'i olarak kendi `/odeme` sayfamıza
gömülür.
## Ortam değişkenleri
@@ -29,8 +30,13 @@ Ayrıntı: `src/lib/app-url.ts`.
1. `baslatOdeme` (`src/features/odeme/odeme-actions.ts`) — `orders` satırını
`pending` olarak yazar, `checkoutFormInitialize` çağırır, dönen `token`'ı
siparişe iliştirir ve kullanıcıyı `paymentPageUrl`'e yönlendirir.
siparişe iliştirir ve `/odeme?siparis=<id>` adresini **döndürür** (`redirect()`
fırlatmaz); yönlendirmeyi `SatinAlForm` client'ta `router.push` ile yapar.
`conversationId` = `basketId` = sipariş id'miz.
Oturum yoksa `/giris?callback=/paket` döner. Sunucu koruması: paketi olan
yeniden `paket`, paketi olmayan `topup` başlatamaz; `/odeme` sayfası da
paket alınmışken eski bekleyen paket siparişinin formunu göstermez
(bayat sekme / ikinci cihazdan çift çekim önlemi).
2. Kullanıcı ödemeyi bitirince iyzico `/api/odeme/callback` adresine
**cross-site POST** atar; gövdede yalnızca `token` vardır. SameSite=Lax
nedeniyle session çerezi gelmez, bu yüzden kullanıcı token'dan çözülür.