Payment Orchestrator
Pazaryeri
3D Secure Ödeme

Split 3D Secure Ödeme

POST /payments/marketplace/3d, ortasında 3DS challenge olan split 2D ödemedir. 3DS orkestrasyonu — redirect, banka challenge'ı, imzalı callback, expiry süpürmesi — birebir çekirdek akıştır; bu sayfa yalnızca split'in eklediklerini anlatır. 3DS mekaniğinin tamamı için (redirect yönetimi, callback semantiği, durum geçişleri) Kart — 3D Secure sayfasını okuyun.

⚠️

Tüm tutarlar minor birimdir (kuruş): "amount": 25000 = ₺250,00. Satıcı bacakları minor birimli string kullanır ("amountMinor": "15000"); bacakların toplamı amount'a eşit olmalıdır.

Nasıl çalışır

Create — uygunluk & split baştan çözülür

POST /payments/marketplace/3d çağrısını sellers[] ile yaparsınız. Satıcı uygunluğu denetlenir ve split create anında hesaplanır — alıcı daha yönlendirilmeden.

Alıcı challenge'ı tamamlar

Yanıt bir redirect taşır (AWAITING_3D). Alıcıyı dönen URL'e gönderirsiniz; banka challenge'ı ve imzalı merchant callback'i çekirdek 3DS akışıyla birebir aynı çalışır.

Tahsilat split'i uygular

Challenge başarılı olursa tahsilat yürür ve önceden hesaplanmış satıcı bacakları — komisyon, hold, net — işlem kaydına yazılır.

İstek

Gövde, split 2D gövdesi artı callbackUrl alanınızdır. Step-Up auth ve Idempotency-Key, her para hareketi endpoint'inde olduğu gibi geçerlidir.

curl -X POST https://api-gateway.lunixi.com/api/v1/payments/marketplace/3d \
  -H "Authorization: Bearer <access-token>" \
  -H "X-Key-Id: <key-id>" \
  -H "X-Date: <iso-timestamp>" \
  -H "X-Nonce: <nonce>" \
  -H "X-Signature: <ed25519-signature>" \
  -H "Idempotency-Key: 0b7c9d4e-2f61-4c3a-9e5b-8a1d2c3e4f50" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 25000,
    "currency": "TRY",
    "orderId": "ORD-2026-1043",
    "callbackUrl": "https://platform.example.com/payments/return",
    "card": {
      "cardNumber": "5400000000000005",
      "expireMonth": "12",
      "expireYear": "27",
      "cvcNumber": "123"
    },
    "sellers": [
      { "subDealerId": "d_8f2a...", "amountMinor": "15000" },
      { "subDealerId": "d_c41b...", "amountMinor": "10000" }
    ],
    "multiSellerPolicy": "ALL_OR_NOTHING"
  }'

Yanıt

{
  "success": true,
  "inProgress": true,
  "intentId": "pay_01HV3K9X7QWE...",
  "status": "AWAITING_3D",
  "isRedirect": true,
  "redirectUrl": "/api/v1/payments/threed/pay_01HV3K9X7QWE..."
}

Alıcıyı redirectUrl adresine gönderin (Lunixi-hosted, tek kullanımlık bir redirect — sağlayıcının sayfası doğrudan asla açığa çıkmaz). Buradan sonrası bayt bayt çekirdek 3DS akışıdır: banka challenge'ı → ALL /payments/threed/callback/{token} → callbackUrl adresinize bilgilendirici form POST (_signature + _timestamp platform bütünlük alanlarıyla — teslimat kararı için ona güvenmeyin), artı otorite kaynak olan sonuç webhook'u.

Split'in 3DS akışında değiştirdikleri

  • Uygunluk capture'da değil, create'te denetlenir. ALL_OR_NOTHING altında uygun olmayan bir satıcı 422'yi anında üretir — alıcı, kapanamayacak bir ödeme için banka sayfasına hiç ulaşmaz. Bkz. sebep kodları.
  • ALL_OR_NOTHING = ya tüm bacaklar ya hiç tahsilat. Challenge'ın başarılı olup split'in yalnızca bir kısmının uygulandığı bir durum yoktur: ödeme ya tüm bacakları uygunken kabul edilmiştir ya da baştan reddedilmiştir. PARTIAL_ALLOWED'da reddedilen bacaklar zaten create anında işaretlenmiştir; yalnızca uygun bacaklar kapanır.
  • Başarısızlık ve terk çekirdekle aynı davranır. Başarısız challenge ödemeyi düşürür (hiçbir bacak kapanmaz); terk edilen oturumlar otomatik EXPIRED'a süpürülür. Pazaryerine özgü temizlenecek bir şey yoktur.

Hatalar

DurumAnlamıNe yapmalı
422Satıcı(lar) uygun değil — şekil ve sebep kodları split 2D ile aynıSatıcının durumunu düzeltin veya bacağı çıkarın
400Doğrulama hatasıİstek gövdesini düzeltin
401 / 403Step-Up auth başarısızYeniden imzalayın — bkz. Authentication

Challenge seviyesindeki başarısızlık (alıcının bankada 3DS'i geçememesi) bu çağrıda bir HTTP hatası değildir — çekirdek 3DS'te olduğu gibi callbackUrl adresinize ve payment.failed webhook'u olarak gelir.

Webhooks

Herhangi bir 3DS ödemesiyle aynı: başarıda payment.authorized / payment.captured, başarısız challenge'da payment.failed, terk edilen oturumlarda payment.expired — payment.* ailesinin tamamı.

Sonraki adımlar