Payment Flows
İlk Ödeme Akışı
Direct API ile kart verisi sunucunuzdan geçmeden PayTR'ye ulaşır
Kart verisi tarayıcıdan doğrudan PayTR'ye gönderilir — hiçbir zaman sunucunuzdan geçmez. Bu yaklaşım PCI kapsamını önemli ölçüde daraltır.
Akış
1. Kullanıcı plan seçer, email girer → /billing/checkout'a yönlenir
│
▼
2. POST /api/billing/checkout { planId, email }
handlePrepareCheckoutRequest() çalışır:
├─ adapter'dan plan çekilir
├─ PendingCheckout kaydı oluşturulur
└─ { paytrUrl, fields: { paytr_token, merchant_id, ... } } döner
│
▼
3. Frontend dönen alanlarla gizli bir form render eder
Kullanıcı kart bilgilerini forma yazar
Tarayıcı form + kart alanlarını doğrudan PayTR'ye POST eder
(kart verisi sunucunuzdan geçmez)
│
▼
4. PayTR webhook gönderir → POST /api/billing/webhookWebhook İşleme (İlk Ödeme)
POST /api/billing/webhook
handleWebhookRequest() çalışır:
├─ HMAC-SHA256 hash doğrulanır
├─ İlk ödeme olarak tanımlanır (merchant_oid prefix: DC...)
├─ email: PendingCheckout kaydından alınır (merchantOid ile lookup)
├─ utoken: payload'dan alınır, yoksa "" (test modu)
├─ manager.activate(email, planId, utoken) → Subscriber oluşturulur
├─ Payment kaydı oluşturulur (status: success / failed)
├─ onPaymentSuccess / onPaymentFailure callback tetiklenir
├─ PendingCheckout kaydı silinir
└─ "OK" döner (PayTR bunu zorunlu tutar)PayTR test modu webhook payload'ına email veya utoken dahil etmez. Email, PendingCheckout kaydından; utoken ise boş string olarak saklanır.
merchantOid Formatı (İlk Ödeme)
DC{8-karakter-base36-timestamp}{4-karakter-rastgele}
Örnek: DC0M3X7KQA3F2
Maks. 64 karakter (PayTR limiti)