recurr.
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/webhook

Webhook İş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)

On this page