Payment Orchestrator
Pazaryeri
2D Ödeme

Split 2D Ödeme

Split ödeme, normal bir ödeme artı sellers[] demektir — tahsilatın ne kadarının hangi alt bayiye gideceğini siz bildirirsiniz; Lunixi satıcı uygunluğunu denetler, satıcı bacağı başına komisyon, hold ve net tutarı hesaplar ve kırılımın tamamını işlem kaydına yazar. İşlem 3DS challenge'ından geçmeyecekse 2D rotasını kullanın; challenge akışı için bkz. Split 3D Secure Ödeme.

⚠️

Tüm tutarlar minor birimdir (kuruş): "amount": 25000 = ₺250,00. Asimetriye dikkat: üst seviye amount bir integer, her satıcı bacağının amountMinor alanı ise bir string'dir ("15000").

Nasıl çalışır

Uygunluk denetimi

Para hareket etmeden önce sellers[] içindeki her satıcı denetlenir: satıcı ACTIVE mi, KYC'si tamam mı, payout'u yapılandırılmış mı? Uygun olmayan satıcılar multiSellerPolicy değerinize göre reddedilir.

Split & komisyon

Brüt tutar satıcı bacaklarına bölünür; tanımladığınız komisyon kuralları her bacağın komisyon, hold ve net tutarını çözer.

Tahsilat

Kart, çekirdek ödeme hattı üzerinden çekilir — normal bir ödemeyle aynı yönlendirme, failover ve idempotency.

Kayıt

Satıcı başına komisyon, hold ve net, işlem kaydına yazılır — dilediğiniz an GET /marketplace/transactions ile inceleyin.

Split ödeme almanın iki yolu

Hosted checkout formuDirekt API (2D)
Kart verisiLunixi'nin formunda toplanır — sunucunuza hiç değmezServer-to-server gönderilir (PCI DSS kapsamına girersiniz)
ÇağıracağınızPOST /payments/marketplace/intents → form akışıPOST /payments/marketplace/2d
Split bildirimiIntent oluşturulurkenTahsilat isteğinde

Hosted form rotası

POST /payments/marketplace/intents, çekirdek checkout form intent'inin kabul ettiği her şeyi kabul eder; artı sellers[] ve multiSellerPolicy. Satıcı bacaklarının toplamı intent'in amount'una eşit olmalıdır (aşağıya bakın). Uygunluk denetimi ve split hesabı intent oluşturma anında yapılır; alıcı standart hosted form akışını tamamlar ve tahsilat split'i uygular. Intent oluşturmadan sonraki her şey — tokenize, BIN/taksit, 2D/3D gönderimi — çekirdek akışla birebir aynıdır; 2. adımdan itibaren Checkout Form rehberini izleyin.

Direkt API rotası

POST /payments/marketplace/2d bir Step-Up endpoint'idir: Bearer token artı Ed25519 istek imzası — tüm para hareketi çağrılarında olduğu gibi.

⚠️

Direkt rota ham PAN taşır. Yalnızca entegrasyonunuz PCI DSS sertifikalıysa kullanın — aksi halde yukarıdaki hosted form rotasını tercih edin.

İstek

curl -X POST https://api-gateway.lunixi.com/api/v1/payments/marketplace/2d \
  -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: 5c1e6a3e-90bd-4b2f-a1c7-1f0d1c9e2ab4" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 25000,
    "currency": "TRY",
    "orderId": "ORD-2026-1042",
    "card": {
      "cardNumber": "5400000000000005",
      "expireMonth": "12",
      "expireYear": "27",
      "cvcNumber": "123"
    },
    "sellers": [
      { "subDealerId": "d_8f2a...", "amountMinor": "15000" },
      { "subDealerId": "d_c41b...", "amountMinor": "10000" }
    ],
    "multiSellerPolicy": "ALL_OR_NOTHING"
  }'

sellers[] dizisi

AlanTipNot
subDealerIdstringSatıcının dealer id'si — ACTIVE ve payout'u yapılandırılmış olmalı
amountMinorstringBu satıcının payı, minor birim, string
scenarioobject, opsiyonelBu bacak için isteğe-özel komisyon senaryosu override'ı

Aynı subDealerId için birden çok girdi (örn. tek satıcıdan birden çok sepet kalemi) tek bacakta toplanır.

Bacakların amountMinor toplamı isteğin amount alanına eşit olmalıdır. Eksik ya da fazla toplam kart çekilmeden 400 VALIDATION_ERROR ile reddedilir. amountMinor yalnız rakamdan oluşur ("15000").

multiSellerPolicy

PolitikaDavranış
ALL_OR_NOTHING (varsayılan)Herhangi bir satıcı uygun değilse, ödeme kart çekilmeden önce 422 ile tamamen reddedilir — kısmi fulfillment riski yok
PARTIAL_ALLOWEDUygun olmayan bacaklar REJECTED işaretlenir; ödeme uygun satıcılarla devam eder

Yanıt

Başarılı tahsilat standart ödeme sonucunu döner:

{
  "success": true,
  "intentId": "pay_01HV3K9X7QWE...",
  "status": "CAPTURED",
  "attemptCount": 1,
  "createdAt": 1782115200000
}

Satıcı bazlı kırılım — her bacağın brütü, komisyonu, hold'u ve neti — buraya gömülmez; işlem kaydına yazılır. GET /marketplace/transactions ile okuyun; her split ödeme, satıcı bacaklarını listeler.

Hatalar

DurumAnlamıNe yapmalı
422Bir veya daha fazla satıcı uygun değil (ALL_OR_NOTHING altında)details.ineligible[] alanını inceleyin — aşağıya bakın
400Doğrulama hatası (bacak tutarları, bacak toplamı amount'a eşit değil, eksik alanlar). Kaldırılan bir tutar alanı gönderildiyse payment.amount.field_removedİstek gövdesini düzeltin
401 / 403Step-Up auth başarısız (bozuk imza, bayat X-Date, tekrar kullanılan nonce)İsteği yeniden imzalayın — bkz. Authentication

422 uygunsuzluk yanıtı

{
  "code": "marketplace.payment.seller_not_eligible",
  "message": "One or more sellers are not eligible for marketplace payment.",
  "details": {
    "policy": "ALL_OR_NOTHING",
    "ineligible": [
      { "subDealerId": "d_c41b...", "reasonCode": "SELLER_KYC_REQUIRED" }
    ]
  }
}
reasonCodeAnlamıÇözüm
SELLER_SUSPENDEDSatıcı askıda, hold'da veya kapalıUygunsa PUT /marketplace/dealers/{id}/status ile yeniden etkinleştirin
SELLER_KYC_REQUIREDOnboarding/KYC tamamlanmamışSatıcının onboarding'i bitirmesini sağlayın
SELLER_PAYOUT_NOT_CONFIGUREDSatıcının payout yapılandırması henüz yokOnboarding sırasında payout şartlarını tamamlayın

Webhooks

Split ödemeler çekirdek ödemelerle aynı event'leri üretir — payment.captured, payment.failed, payment.refunded, payment.voided ve payment.* ailesinin kalanı. Pazaryerine özgü event tipi yoktur; orderId / ödeme id'si üzerinden eşleştirin ve satıcı kırılımını transactions endpoint'inden okuyun.

Sonraki adımlar