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 formu | Direkt API (2D) | |
|---|---|---|
| Kart verisi | Lunixi'nin formunda toplanır — sunucunuza hiç değmez | Server-to-server gönderilir (PCI DSS kapsamına girersiniz) |
| Çağıracağınız | POST /payments/marketplace/intents → form akışı | POST /payments/marketplace/2d |
| Split bildirimi | Intent oluşturulurken | Tahsilat 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
| Alan | Tip | Not |
|---|---|---|
subDealerId | string | Satıcının dealer id'si — ACTIVE ve payout'u yapılandırılmış olmalı |
amountMinor | string | Bu satıcının payı, minor birim, string |
scenario | object, opsiyonel | Bu 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
| Politika | Davranış |
|---|---|
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_ALLOWED | Uygun 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
| Durum | Anlamı | Ne yapmalı |
|---|---|---|
422 | Bir veya daha fazla satıcı uygun değil (ALL_OR_NOTHING altında) | details.ineligible[] alanını inceleyin — aşağıya bakın |
400 | Doğ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 / 403 | Step-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" }
]
}
}reasonCode | Anlamı | Çözüm |
|---|---|---|
SELLER_SUSPENDED | Satıcı askıda, hold'da veya kapalı | Uygunsa PUT /marketplace/dealers/{id}/status ile yeniden etkinleştirin |
SELLER_KYC_REQUIRED | Onboarding/KYC tamamlanmamış | Satıcının onboarding'i bitirmesini sağlayın |
SELLER_PAYOUT_NOT_CONFIGURED | Satıcının payout yapılandırması henüz yok | Onboarding 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
- Split 3D Secure Ödeme — aynı isteğin 3DS challenge'ından geçmesi
- İade & İptal — split ödemeyi geri alma
- İşlemler & Payout — satıcı bacaklarını okuma ve payout kapatma