Payment Orchestrator
Parçalı Ödeme (SplitPay)

Parçalı Ödeme (SplitPay)

Parçalı ödeme, tek bir siparişi birden fazla parçaya bölerek tahsil eder: birden fazla kart ya da kartlarla birlikte cüzdan, Faturana Yansıt ve Senetle Öde gibi kart dışı yöntemler. Örneğin ₺1.000'lik sipariş = Kart A ₺400 + Kart B ₺350 + Faturana Yansıt ₺250.

Sonuç ya hep ya hiçtir:

  • Bütün parçalar başarılı olursa sipariş ödenmiş sayılır.
  • Bir parça başarısız olursa kartlardaki provizyonlar bırakılır ve çekilmiş parçalar iade edilir. Alıcı net olarak hiçbir şey ödemez. Geri alınamayan parçanın kuralı: Başarısızlık ve telafi.

API'de her parça bir bacaktır (legs[]).

Tutarlar minor unit (kuruş) cinsinden tam sayıdır: "amount": 40000 = ₺400,00. Parça tutarlarının toplamı sipariş tutarına tam olarak eşit olmalıdır.

Bölme biçimleri

BiçimParçalarSayfa
Çoklu kartla ödemeYalnız kartlarÇoklu Kartla Ödeme — kart parçaları, parça başına taksit, 3D Secure gösterimi, devam sayfası, callbackUrl'inize gelen sonuç
Birden fazla yöntemle ödemeBir ya da birden fazla kart ve kart dışı yöntemlerBirden Fazla Yöntemle Ödeme — adım sırası, geri alınamayan parça, kredi parçası, sigorta, başarısızlık ve telafi, yöntem bloğu ve sağlayıcı seçimi

Bu sayfa iki biçimde ortak olan bölümleri anlatır: iki yol, açma, adımların sırası, kurallar, süre, durumlar, olaylar, iade, liste ve detay.

İki yol

YolKim başlatırBölüm
Checkout FormuAlıcı, formdaki Birden fazla yöntemle öde girişinden. Sizin ek kod yazmanız gerekmezCheckout Formu ile
Merchant APISiz, kendi ödeme sayfanızdan POST /payments/split ileAPI ile

İki yol aynı kuralları, aynı adım sırasını ve aynı olayları kullanır.

Açma

Panelde Ödeme → Form Ayarları → Parçalı Ödeme bölümünde iki bağımsız anahtar vardır. Yalnız birini ya da ikisini birden açabilirsiniz.

AnahtarNe açar
Çoklu Kartla ÖdemeAlıcı ödemeyi birden fazla kartına bölebilir. Kart sayısını 2 ile 5 arasında seçersiniz (varsayılan 3)
Kart Dışı Yöntemlerle Parçalı ÖdemeAlıcı kartlarının yanında seçtiğiniz kart dışı yöntemleri de parça olarak kullanabilir. Hangi yöntemlerin gireceğini listeden seçersiniz

Ortak ayarlar kart dışı yöntem içeren parçalı ödemelerde geçerlidir:

AyarDeğer
En fazla parça2–5, varsayılan 3. Kartlar ve kart dışı yöntemler birlikte sayılır
Parça başına en az tutarBoşsa alt sınır yoktur. Sağlayıcının kendi tutar sınırları her zaman geçerlidir
Toplam süre10–25 dakika, varsayılan 20. Bkz. Süre
  • Kart dışı yöntem içeren parçalı ödemede kart sayısı, Çoklu Kartla Ödeme açıksa onun sınırına tabidir; kapalıysa en fazla 1 kart kullanılabilir.
  • Parçalı ödemeye yalnız Form Ayarları'nda açık yöntemler girebilir.
  • Bir yöntemin ve sağlayıcının parçalı ödemede kullanılıp kullanılamayacağını GET /payments/methods satırındaki splitEligible söyler.
  • Yalnız kartlardan oluşan API parçalı ödemesi Çoklu Kartla Ödeme anahtarına bağlı değildir; bu anahtar Checkout Formu'ndaki çoklu kartı açar.

Adımların sırası

Sırayı platform belirler; siz ve alıcı değiştiremezsiniz. Platformun kurduğu sıra yanıtlarda steps[] listesidir.

  • Yalnız kartlardan oluşan parçalı ödemede kartlar gönderdiğiniz sırayla işlenir.
  • Kart dışı yöntem içeren parçalı ödemede parçalar, yöntemin parçalı ödeme davranışına (splitBehavior) göre dört faza dizilir: onay, kart provizyonu, geri alınabilir çekim ve geri alınamayan çekim. Fazlar ve faz içindeki sıra: Birden Fazla Yöntemle Ödeme › Adım sırası.

Bütün parçalar başarılı olunca kartlardaki provizyonlar (ve varsa kredi onayı) çekilir ve sipariş tamamlanır.

Kurallar

Parçalı ödeme başlamadan önce doğrulanır. Kurala uymayan istek reddedilir; hiçbir parçadan para çekilmez.

Kart parçasında taksit kuralları Çoklu Kartla Ödeme › Kart parçasında taksit bölümündedir.

Süre

Kart dışı yöntem içeren parçalı ödeme Toplam süre içinde tamamlanmalıdır (varsayılan 20 dakika).

  • Bitiş anı yanıtlarda expiresAt alanındadır. Checkout Formu kalan süreyi alıcıya gösterir.
  • Süre dolarsa kartlardaki provizyonlar bırakılır, çekilmiş geri alınabilir parçalar iade edilir ve parçalı ödeme iptal olur.
  • Geri alınamayan parça başlayınca süre durur ve expiresAt null olur. Kart provizyonları bu parçanın sonucu netleşene kadar tutulur.
  • Adımların kendi süreleri (ör. doğrulama kodunun geçerlilik süresi) ayrıca geçerlidir.
  • Yalnız kartlardan oluşan parçalı ödemede toplam süre yoktur; 3D Secure'ü tamamlanmayan kart parçası kendi süresiyle sonuçlanır.

Checkout Formu ile

Parçalı ödemeyi açın (bir kez)

Panelde Ödeme → Form Ayarları → Parçalı Ödeme bölümünde Çoklu Kartla Ödeme'yi, Kart Dışı Yöntemlerle Parçalı Ödeme'yi ya da ikisini açın. Bkz. Açma.

Intent oluşturun ve formu mount edin

Adımlar kartla ödemedeki gibidir → Checkout Formu. Sipariş tutarı intent'ten okunur.

Alıcı parçaları ekler

Alıcı yöntem listesinde Birden fazla yöntemle öde girişini seçer. Kartlarını ve açtığınız kart dışı yöntemleri parça olarak ekler, tutarı parçalara dağıtır. Kart parçası için bkz. Çoklu Kartla Ödeme › Checkout Formu ile; kart dışı parça için bkz. Birden Fazla Yöntemle Ödeme › Checkout Formu ile.

Form adımları sırayla yürütür

Ödeme başlayınca form adımları platformun sırasıyla bir kontrol listesi olarak gösterir. Alıcı her adımda isteneni yapar: kartta 3D Secure doğrulaması, kart dışı yöntemde doğrulama kodu ya da istenen bilgi. Kalan süre ekranda görünür.

Kartın 3D Secure doğrulaması seçtiğiniz 3D Secure gösterimine göre formun içinde bir pencerede ya da ayrı sayfada açılır. Ayrı sayfada ödeme devam sayfasında sürer ve sonunda alıcı sonuçla callbackUrl'inize döner.

Sonucu webhook ile alın

Sipariş tamamlanınca ana ödeme için tek payment.captured gelir. Siparişi bu olayla teslim edin → Olaylar.

Alıcının ödeme sırasında görebileceği durumlar Birden Fazla Yöntemle Ödeme › Alıcının görebileceği durumlar bölümündedir.

Sipariş kilidi

Parçalı ödeme başlayınca sipariş kilitlenir:

  • Parçalı ödeme sürerken aynı siparişte tek kartla, kart dışı yöntemle ya da cüzdanla ödeme başlatılamaz: istek 409 payment.checkout.order_locked alır.
  • Tersi de geçerlidir: siparişte tek yöntemli bir ödeme sürüyorsa ya da sipariş kapanmışsa parçalı ödeme başlatılamaz: 409 split_pay.checkout.order_not_open.
  • Parçalı ödeme başarısız olur, süresi dolar ya da alıcı vazgeçerse kilit kalkar ve sipariş açık kalır. Alıcı aynı siparişi başka bir yöntemle ödeyebilir.
  • Aynı siparişte aynı anda tek parçalı ödeme yürür. Sayfa yenilense ya da istek iki kez gönderilse de mevcut parçalı ödeme sürdürülür; yeni çekim yapılmaz.

Kredi ya da BNPL sağlayıcısı bağlı olduğunda kredi onayının kuralları Birden Fazla Yöntemle Ödeme › Kredi parçası bölümündedir.

Kart parçasının 3D Secure doğrulamasının formda nasıl açılacağı Çoklu Kartla Ödeme › 3D Secure gösterimi bölümündedir.

Ayrı sayfada 3D Secure'den sonra ödemenin sürdüğü sayfa Çoklu Kartla Ödeme › Devam sayfası bölümündedir.

Devam sayfasından callbackUrl'inize gönderilen alanlar Çoklu Kartla Ödeme › callbackUrl'inize gelen sonuç bölümündedir.

Uç başvurusu

Bu bölüm başvuru içindir; uçları Checkout Form SDK'sı çağırır. Kimlik, diğer form uçlarındaki gibi form token'ı (token) ve gerekirse checkoutSessionProof ile sağlanır.

UçNe yapar
POST /payments/form/split/initParçalı ödemeyi başlatır. legs[]: kart parçası { cardToken, amount, installment?, installmentQuoteToken? }, kart dışı parça { paymentMethod, providerCode, amount }
POST /payments/form/split/statusGüncel durumu, ana ödemenin paymentId'sini, adım listesini ve beklenen adımı döner
POST /payments/form/split/methodSırası gelen kart dışı parçayı başlatır. Gövde form/payment gövdesidir, ek olarak legId taşır
POST /payments/form/split/cardKredi onayından sonra kart parçasını alıcının kartıyla başlatır: { legId, cardToken }
POST /payments/form/split/replacement-cardEksik tutar için yeni kartı alır: { cardToken }. Tutar sunucudan gelir
POST /payments/form/split/continueDevam bağlantısının kodunu (code) siparişin yeni form token'ına çevirir
POST /payments/form/split/restart-3dsBanka pencereye izin vermediğinde aynı kart parçasının 3D Secure'ünü ayrı sayfada yeniden başlatır. Her kart parçası için bir kez; bkz. 3D Secure gösterimi
  • Yanıtlar API yanıtındaki status, steps, pendingStep ve expiresAt alanlarını taşır; splitPaymentId tarayıcıya verilmez.
  • Yanıtlar ayrıca ödemenin başladığı 3D Secure gösterimini threeDsDisplay (INLINE ya da REDIRECT) alanında taşır.
  • form/split/init ve form/split/status yanıtları üst düzeyde ana ödemenin paymentId'sini taşır. Bu, size intent oluştururken dönen ve callbackUrl'inize gelen kimliktir. Parçaların kimlikleri steps[].paymentId ve pendingStep.paymentId alanlarındadır.
  • Devam sayfası kendi uçlarını (/payments/split/resume/*) kendisi çağırır; bunları sizin çağırmanız gerekmez.
  • Kart dışı parçanın doğrulama kodu ve tekrar gönderimi Payment sayfasındaki aksiyon uçlarıyla, pendingStep.paymentId ile yapılır.

API ile

POST /api/v1/payments/split ile parçalı ödemeyi kendi sunucunuzdan başlatırsınız. Uç Step-Up kimlik doğrulaması (Bearer token ve Ed25519 imza başlıkları; bkz. Kimlik Doğrulama) ve payment:split-pay yetkisi ister. Idempotency-Key başlığı zorunludur.

Yöntemleri okuyun

GET /payments/methods ile yöntemleri ve sağlayıcıları alın. Kart dışı parçada yalnız splitEligible: true olan sağlayıcıları alıcıya sunun.

Parçalı ödemeyi başlatın

Kartları ve kart dışı yöntem bloklarını legs[] içinde gönderin. Platform kuralları doğrular ve sırayı kurar. Kart provizyonları alınır; sırası gelen kart dışı parça bu istekteki blokla başlatılır.

Beklenen adımı tamamlayın

Yanıttaki pendingStep alıcıdan ya da sizden bekleneni söyler: 3D Secure yönlendirmesi, doğrulama kodu ya da sıradaki kart dışı parçanın başlatılması. Bkz. Adımlar.

Sonucu webhook ile alın

Bütün parçalar tamamlanınca kartlar çekilir ve ana ödeme için tek payment.captured gelir → Olaylar.

İstek

Örnek istekler: yalnız kartlarla Çoklu Kartla Ödeme › API ile, kart dışı yöntemlerle Birden Fazla Yöntemle Ödeme › API ile.

AlanZorunluAçıklama
totalAmountEvetSipariş tutarı, minor unit. Parçaların toplamına tam olarak eşit olmalı
currencyEvetISO-4217 (TRY, USD, EUR)
ownerRefEvetKart sahibinin anahtarı (cardUserKey); bütün kart parçaları bu sahibin kartı olmalı. Kart parçası yoksa da gönderilir (müşteri referansınız)
legs[]Evet1–5 parça. Kart dışı parça içeren istekte 2 ile En fazla parça arasında
callbackUrlKoşullu3D Secure sonrası alıcının döneceği http(s) adresiniz. Bir kart parçasında force3D varsa zorunlu
orderIdHayırSipariş numaranız. Olaylarda orderId olarak döner
ownerScopeHayırSahip kapsamı; varsayılan MERCHANT_CUSTOMER

Kart parçasının alanları Çoklu Kartla Ödeme › Kart parçası alanları bölümündedir.

Kart dışı parçanın alanları ve yöntem bloğu Birden Fazla Yöntemle Ödeme › Kart dışı parça alanları bölümündedir.

Yanıt

{
  "success": false,
  "code": "AWAITING_ACTION",
  "message": "…",
  "data": {
    "splitPaymentId": "b1e4…",
    "status": "AWAITING_ACTION",
    "duplicate": false,
    "needsReconciliation": false,
    "steps": [
      { "legId": "leg-1", "sequence": 1, "kind": "CARD", "paymentMethod": "CARD", "providerCode": null, "splitBehavior": "HOLD_CAPTURE", "amount": 40000, "status": "AUTHORIZED", "paymentId": null, "replacesLegId": null, "current": false },
      { "legId": "leg-2", "sequence": 2, "kind": "CARD", "paymentMethod": "CARD", "providerCode": null, "splitBehavior": "HOLD_CAPTURE", "amount": 35000, "status": "AUTHORIZED", "paymentId": null, "replacesLegId": null, "current": false },
      { "legId": "leg-3", "sequence": 3, "kind": "METHOD", "paymentMethod": "MOBILE_BILLING", "providerCode": "<providerCode>", "splitBehavior": "CAPTURE_IRREVERSIBLE", "amount": 25000, "status": "AWAITING_ACTION", "paymentId": "7d3a…", "replacesLegId": null, "current": true }
    ],
    "pendingStep": {
      "legId": "leg-3",
      "sequence": 3,
      "step": "ACTION",
      "paymentMethod": "MOBILE_BILLING",
      "providerCode": "<providerCode>",
      "amount": 25000,
      "paymentId": "7d3a…",
      "actionId": "act_5c2e…",
      "redirectPath": null,
      "action": {
        "id": "act_5c2e…",
        "type": "OTP",
        "expiresAt": "2026-10-20T09:03:00.000Z",
        "otp": { "maskedTarget": "53****67" },
        "consent": { "required": true, "url": "https://…" }
      }
    },
    "expiresAt": null,
    "pendingLeg": { /* uyumluluk alanı */ },
    "legs": [ /* bacak durumları */ ]
  }
}
AlanAçıklama
successYalnız parçalı ödeme tamamlandığında (COMPLETED) true
code, data.statusParçalı ödemenin durumu; bkz. Durumlar
duplicateAynı Idempotency-Key ile gelen istek mevcut parçalı ödemeyi döndürdüyse true; yeni çekim yapılmaz
needsReconciliationParçalı ödeme operasyon takibinde
steps[]Platformun kurduğu adım listesi, yürütme sırasıyla
pendingStepBeklenen adım; bekleyen adım yoksa null
expiresAtToplam sürenin bitişi (ISO-8601). Süre yoksa ya da geri alınamayan parça başladıysa null
pendingLeg, legs[]Yalnız kartlardan oluşan parçalı ödemeyle uyumluluk için durur. Yeni entegrasyonda steps ve pendingStep'i kullanın

steps[] öğesi:

AlanAçıklama
legId, sequenceParçanın kimliği ve yürütme sırası (1'den başlar)
kindCARD ya da METHOD (kart dışı)
paymentMethod, providerCodeYöntem ve sağlayıcı. Kart parçasında providerCode null'dır
splitBehaviorParçanın fazı; bkz. Adım sırası
amountParçanın tutarı, minor unit
statusParçanın durumu; bkz. Durumlar
paymentIdKart dışı parçanın ödeme kaydı; aksiyon uçlarında kullanılır. Kart parçasında ve parça başlamadıysa null
replacesLegIdBu parça, eksik tutar için girilen yeni kartsa yerine girdiği parçanın kimliği
currentParçalı ödeme bu parçada bekliyorsa true

pendingStep aynı legId, sequence, paymentMethod, providerCode, amount ve paymentId alanlarına ek olarak step, actionId, redirectPath ve action taşır. action yalnız bu istekte başlatılan ve hâlâ beklenen aksiyonda doludur; biçimi Payment — Aksiyonlar ile aynıdır. Aksiyonun güncel hâlini GET /payments/{paymentId} ile okuyabilirsiniz.

Adımlar

stepAnlamıNe yapmalı
THREE_DSKart parçası 3D Secure bekliyorAlıcıyı gecikmeden redirectPath adresine yönlendirin (https://api-gateway.lunixi.com köküne göre). Alıcı callbackUrl'inize döner, parçalı ödeme kendiliğinden ilerler. Bkz. Çoklu Kartla Ödeme › 3D Secure adımı
START_METHODSıradaki kart dışı parça başlatılmayı bekliyorAynı isteği aynı Idempotency-Key ile yeniden gönderin. Yeni kayıt açılmaz; parça bu istekteki blokla başlatılır
ACTIONKart dışı parçada alıcı aksiyonu açık (ör. doğrulama kodu)Kodu POST /payments/{paymentId}/actions/{actionId}/confirm ile gönderin; kodu yeniden göndermek için resend → Payment — Confirm. paymentId = pendingStep.paymentId
RESULT_PENDINGKart dışı parçanın sonucu sağlayıcıdan bekleniyorBekleyin; sonuç netleşince parçalı ödeme kendiliğinden ilerler. Alıcıya "işleminiz kontrol ediliyor" gösterin
CREDIT_APPROVALKredi onayı bekleniyorYalnız kredi sağlayıcısı bağlı olduğunda. Bkz. Kredi parçası
CARD_INPUT, REPLACEMENT_CARDAlıcının kartı bekleniyorYalnız Checkout Formu'nda görülür
  • Aksiyon tamamlanınca platform parçalı ödemeyi kendiliğinden ilerletir. Sıradaki adım yine bir kart dışı parçaysa (START_METHOD) aynı isteği aynı Idempotency-Key ile yeniden gönderin. Kart dışı parçaların hepsi bittiyse kartlar çekilir ve sonuç webhook ile gelir.
  • Güncel adım listesini almak için de aynı isteği aynı Idempotency-Key ile gönderebilirsiniz; yanıt duplicate: true taşır ve para hareketi tekrarlanmaz.
  • Kart dışı parça başlatılamadığında ne yapacağınız: Birden Fazla Yöntemle Ödeme › Kart dışı parçayı tamamlama.
  • Sağlayıcı ödemeyi reddederse ya da aksiyon başarısız olursa parça başarısız olur ve parçalı ödeme telafiye geçer (bkz. Başarısızlık ve telafi).
  • Merchant API'de eksik tutar için yeni kart adımı yoktur: geri alınamayan parçadan sonra kart çekimi tutmazsa parçalı ödeme mutabakat gerekiyor durumuna geçer (bkz. Başarısızlık ve telafi).
  • Alıcının 3D Secure'ü tamamlamaması ve 3D Secure'lü provizyonun kurulumunuzda açık olmaması: Çoklu Kartla Ödeme › 3D Secure adımı.

Bir parça başarısız olduğunda ya da süre dolduğunda uygulanan telafi kuralları Birden Fazla Yöntemle Ödeme › Başarısızlık ve telafi bölümündedir.

Durumlar

Parçalı ödemenin durumları:

DurumAnlamı
COMPOSINGDoğrulandı ve kaydedildi; parçalar henüz başlamadı
AUTHORIZINGParçalar sırayla yürütülüyor
AWAITING_3DSBir kart parçası 3D Secure bekliyor
AWAITING_ACTIONBir kart dışı parça başlatılmayı, alıcı aksiyonunu ya da sonucunu bekliyor
AWAITING_CREDIT_APPROVALKredi onayı bekleniyor (yalnız kredi sağlayıcısı bağlı olduğunda)
AWAITING_REPLACEMENT_CARDEksik tutar için alıcının yeni kartı bekleniyor (yalnız Checkout Formu)
AUTHORIZED, CAPTURINGBütün parçalar hazır; kartlar çekiliyor
COMPLETEDBütün parçalar çekildi; sipariş ödendi
COMPENSATINGTelafi sürüyor: provizyonlar bırakılıyor, çekilmiş parçalar iade ediliyor
VOIDEDTelafi tamamlandı; alıcı net olarak ödeme yapmadı
FAILEDParçalı ödeme başarısız sonuçlandı
RECONCILIATION_REQUIREDGeri alınamayan parça çekildi ama siparişin kalanı tahsil edilemedi; teslimata siz karar verirsiniz

Parçanın durumları (legStatus, steps[].status): PENDING, AUTHORIZING, AWAITING_3DS, AWAITING_ACTION, AUTHORIZED, CAPTURED, VOIDED, REFUNDED, COMPENSATING, FAILED.

COMPENSATING'de kalan ve needsReconciliation: true dönen parçalı ödeme operasyon takibindedir; para riski sessizce bırakılmaz.

Olaylar

Ana ödemenin sonucu

Parçalı ödemenin sonucu her zaman tek olay olarak gelir: tek yöntemli ödemedeki gibi payment.captured ya da payment.failed. Siparişi payment.captured ile teslim edin.

AlanAçıklama
settlementModeSPLIT: tahsilat parçalardadır
splitPaymentIdParçalı ödemenin kimliği
orderIdSizin sipariş numaranız
intentIdYalnız Checkout Formu'nda: siparişin ödeme kaydı
statusCAPTURED ya da FAILED; parçalı ödemenin durumu ayrıca splitStatus'tadır
totalAmountMinorSipariş tutarı
capturedAmountMinor / amountMinorBaşarıda çekilen sipariş tutarı / başarısızlıkta sipariş tutarı
legs[]Parça başına legId, sequence, amountMinor, legStatus, paymentIntentId, paymentMethod, providerCode ve varsa refundState

Checkout Formu'nda parçalı ödeme iptal olursa (VOIDED) sipariş açık kalır ve payment.failed gönderilmez; alıcı aynı siparişi başka bir yöntemle ödeyebilir. Bu durumda payment.split.voided gelir.

Parçalı ödeme olayları

OlayNe zaman
payment.split.completedBütün parçalar çekildi (COMPLETED). Parça özetleriyle gelir
payment.split.voidedTelafi tamamlandı (VOIDED); alıcı net olarak ödeme yapmadı
payment.split.compensatingParçalı ödeme operasyon takibine düştü (COMPENSATING, needsReconciliation). cause: CAPTURE_FAILURE ya da COMPENSATION_INCOMPLETE
payment.split.outcome_pendingGeri alınamayan parçanın sonucu bekleniyor; süre durdu. pendingLegId, pendingLegSequence taşır
payment.split.reconciliation_requiredMutabakat gerekiyor. shortfallAmountMinor (eksik tutar), reason (REPLACEMENT_CARD_FAILED, REPLACEMENT_WINDOW_EXPIRED, BUYER_ABANDONED, CAPTURE_NOT_RECOVERABLE) ve varsa unsettledLegId taşır

Bu olaylar her parçalı ödeme için en fazla bir kez gönderilir. Parça olayı değildirler: ucunuz olay türüne aboneyse aşağıdaki seçenekten bağımsız gelirler.

Parça olayları

Her parçanın kendi ödeme kaydının olayları (payment.authorized, payment.captured, payment.failed, payment.voided, payment.refunded …) ve payment.split.leg_refund_pending (telafi iadesi bekleniyor) varsayılan olarak gönderilmez.

  • Almak için webhook ucunuzun olay listesine payment.split.leg_events seçeneğini ekleyin. Panelde Parçalı ödemede bacak olaylarını da gönder seçeneğidir.
  • Seçenek bir olay türü değildir; parça olayının türüne (ör. payment.captured) ayrıca abone olmanız gerekir. payment.* aboneliği bu seçeneği açmaz.
  • Parça olayının orderId'si <sipariş>:leg:<sıra> biçimindedir ve data.splitLeg alanı splitPaymentId, parentPaymentId (Checkout Formu'nda siparişin ödeme kaydı, API'de null), parentOrderId, legId ve legSequence taşır.
  • Teslimatı parça olaylarına göre değil, ana ödemenin payment.captured olayına göre yapın.

Ters ibraz (payment.disputed) bu seçenekten bağımsız her zaman gönderilir ve data.splitLeg ile ana ödeme bilgisini taşır.

Teslimat, imza ve abonelik: Webhook'lar.

İade

Parçalı ödemenin ana ödemesine iade istersiniz; platform tutarı parçalara dağıtır. Yalnız tamamlanmış (COMPLETED) parçalı ödeme iade edilebilir.

Dağıtım kuralı

  • Önce kart parçaları, sırayla ve gerekirse kısmi olarak iade edilir.
  • Kalan tutar, geri alınabilir kart dışı parçalardan karşılanır. Kart dışı parça yalnız kalan tutarının tamamıyla iade edilir.
  • Geri alınamayan parça (ör. Faturana Yansıt, Senetle Öde) dağıtıma girmez.
  • Bir parçanın iade tavanı ondan çekilen tutardır; taksitli kart parçasında vade farkı dahildir. Tam iadede vade farkı da iade edilir.
  • İade edilebilir tutar ve iade edilemeyen tutar GET /payments/split/:id yanıtındaki refund.refundableAmount ve refund.nonRefundableAmount alanlarındadır.

Tutar iade edilebilir toplamı aşarsa istek 400 split_pay.refund.amount_exceeded alır; iade edilebilir tutar details.refundableAmount'tadır. Tutar toplamın içinde ama parçalara bölünemiyorsa (ör. yalnız kart dışı parçalar var ve tutar bir parçayı bölüyor) 422 split_pay.refund.amount_not_distributable döner.

Checkout Formu ödemesinde

Siparişin ödeme kaydına mevcut iade ucuyla iade isteyin: POST /payments/:id/refund → İade.

  • amount zorunludur.
  • Parça parça sonuç yanıtın meta.details.splitRefund alanındadır.
  • Bazı parçalar iade edilemediyse yanıt split_pay.refund.incomplete koduyla başarısız döner. Sonucu henüz belli olmayan parça varsa yanıt 202 olur. İki durumda da aynı Idempotency-Key ile tekrar deneyin; iade edilmiş parça yeniden iade edilmez.

API ile başlatılan parçalı ödemede

POST https://api-gateway.lunixi.com/api/v1/payments/split/{splitPaymentId}/refund

Gövde { "amount": 15000, "reason": "…" }; reason isteğe bağlıdır. Uç payment:refund yetkisi ve zorunlu Idempotency-Key ister.

  • Yanıt data alanında refundRequestId, splitPaymentId, orderId, currency, status (COMPLETED, PARTIAL, FAILED, PROCESSING), requestedAmount, refundedAmount, refundableAmount, nonRefundableAmount, duplicate ve parça başına legs[] (legId, sequence, paymentIntentId, paymentMethod, providerCode, amount, status, errorCode) taşır.
  • Bütün parçalar iade edildiyse success: true döner. Bazı parçalar iade edilemediyse yanıt success: false ve code: "split_pay.refund.incomplete" taşır; aynı Idempotency-Key ile tekrar deneyin.
  • Aynı anahtarla farklı tutar ya da nedenle gelen istek reddedilir.

İade sonrası

  • Ana ödeme için tek olay gelir: ana ödemede iade edilecek tutar kalmadıysa payment.refunded, kaldıysa payment.partially_refunded. Olay settlementMode: "SPLIT", refundId, refundAmountMinor, totalRefundedMinor, fullyRefunded ve refundedLegs[] taşır.
  • Ana ödemenin status'u iade sonrasında değişmez. İade edilen toplamı olaydaki totalRefundedMinor ve GET /payments/split/:id yanıtındaki refund.refundedAmount gösterir.
  • Parça başına iade de yapabilirsiniz: parçanın ödeme kaydına POST /payments/:id/refund. Parçalı ödeme sürerken ya da parçanın telafi iadesi beklerken bu istek 409 split_pay.refund.not_allowed alır.

Liste ve detay

Ödeme listesi

  • GET /payments listesinde Checkout Formu'ndaki parçalı ödeme tek satırdır: siparişin ödeme kaydı, sipariş tutarıyla. Parçalar listede yer almaz.
  • includeLegs=true ile parçaların ödeme kayıtları da listelenir.
  • Parçalı ödemeyle ilgili satırlar split alanı taşır: splitPaymentId, role (PARENT ana ödeme, LEG parça), parçada parentPaymentId ve legSequence.
  • API ile başlatılan parçalı ödemenin ana ödemesi bir ödeme kaydı değildir; parçaları listede role: "LEG" ile görünür. Ana ödemeyi GET /payments/split ile okuyun.

Parçalı ödeme detayı

GET /api/v1/payments/split (liste, keyset sayfalama) ve GET /api/v1/payments/split/:id (detay) Bearer token ve payment:view yetkisi ister.

Detayda parça başına:

AlanAçıklama
legStatusParçanın durumu; bkz. Durumlar
paymentMethod, providerCodeYöntem ve sağlayıcı
legAmountParçanın sipariş tutarındaki payı
installmentCount, chargeAmountTaksit sayısı ve vade farkı dahil çekim tutarı
capturedAmount, refundedAmountÇekilen ve iade edilen tutar
refundStateREFUND_PENDING (iade bekliyor), REFUNDED (iade edildi), NOT_REFUNDABLE (geri alınamaz) ya da null
compensationRefundTelafi iadesinin ayrıntısı: status, amount, attempt, requestedAt, nextAttemptAt, lastErrorCode, refundedAt
disputeParçada ters ibraz varsa state, disputedAmount, openChargebackCount
pendingRedirectPath, awaiting3dsSinceKart parçası 3D Secure beklerken yönlendirme yolu ve bekleme başlangıcı
cardTokenMasked, cardLast4, cardBrandKart kimliği; ham token dönmez
paymentIntentId, paymentIntentStatusParçanın ödeme kaydı ve durumu
failureReasonBaşarısız parçada normalize hata kodu ve sağlayıcı mesajı

Üst düzeyde refund (refundableAmount, nonRefundableAmount, refundedAmount) ve dispute (hasDispute, disputedAmount, legCount) alanları bulunur.

Ters ibraz

Ters ibraz parçanın ödeme kaydına işlenir. Ana ödemenin durumu değişmez; detayda dispute işareti ve tutarı görünür. Diğer parçalara otomatik işlem yapılmaz. payment.disputed olayı data.splitLeg ile gelir → Ters İbraz.

Hatalar

Bütün kodların açıklaması Hata Yönetimi sayfasındadır.

DurumKodNe yapmalı
422split_pay.validation.amount_mismatchParçaların toplamını sipariş tutarına eşitleyin
422split_pay.validation.leg_count_out_of_rangeParça sayısını details.min ile details.max arasında tutun
422split_pay.validation.card_leg_count_out_of_rangeKart sayısını details.max ile sınırlayın
422split_pay.validation.invalid_leg_amountParça tutarını pozitif tam sayı gönderin
422split_pay.validation.currency_mismatchBütün parçaları siparişin para biriminde ve bu para birimini destekleyen sağlayıcıyla gönderin
422split_pay.validation.missing_card_tokenKart parçasına cardToken ekleyin; kart dışı parçadan kart alanlarını çıkarın
422split_pay.validation.methods_disabledKart Dışı Yöntemlerle Parçalı Ödeme'yi açın
422split_pay.validation.method_not_allowedYöntemi parçalı ödemeye açın ya da başka bir yöntem seçin
422split_pay.validation.provider_not_availableGET /payments/methods listesindeki bir sağlayıcıyı seçin
422split_pay.validation.provider_not_split_eligiblesplitEligible: true olan bir sağlayıcı seçin
422split_pay.validation.duplicate_providerBir sağlayıcıyı tek parçada kullanın
422split_pay.validation.multiple_irreversible_legsGeri alınamayan en fazla bir parça gönderin
422split_pay.validation.leg_below_minimumParçayı details.minLegAmount ya da üzerine çıkarın
422split_pay.validation.leg_outside_provider_limitsParçayı sağlayıcının details.minAmount–details.maxAmount aralığına getirin
422split_pay.validation.invalid_installmentTaksiti 1 ile details.max arasında seçin; kart dışı parçada taksit göndermeyin
422split_pay.validation.installment_quote_rejectedTeklifi parçanın tutarıyla yenileyin
422split_pay.insurance.requires_card_legSigorta seçiliyken en az bir kart parçası ekleyin ya da sigortasız devam edin; prim kart parçasından tahsil edilir
422split_pay.validation.callback_url_required / callback_url_invalidforce3D parçası varken http(s) bir callbackUrl gönderin
422split_pay.validation.duplicate_card / mixed_ownerFarklı kartlar, aynı kart sahibi
422payment.provider.disabled_in_formCheckout Formu'nda formda açık bir sağlayıcı seçin
409split_pay.checkout.order_not_openSiparişte başka bir ödeme sürüyor ya da sipariş kapanmış; details.reason'a bakın
409payment.checkout.order_lockedSiparişte parçalı ödeme sürüyor; sonuçlanmasını bekleyin
409split_pay.step.not_allowedDurumu okuyup beklenen adımı izleyin; details.reason'a bakın
409split_pay.step.busyBirkaç saniye sonra tekrar deneyin
410split_pay.continuation.unavailableDevam bağlantısı artık kullanılamıyor; details.reason'a bakın
410split_pay.resume.unavailableDevam sayfasının bağlantısı geçersiz ya da süresi dolmuş; details.reason'a bakın
409split_pay.resume.already_openedÖdeme başka bir pencerede sürüyor; alıcı o pencereden devam eder
401split_pay.resume.proof_invalidAlıcı ödemeye devam sayfasının ilk açıldığı pencereden devam eder
503split_pay.resume.not_configuredParçalı ödeme başlatılmadı, para hareket etmedi; kısa süre sonra tekrar deneyin
409split_pay.three_ds.restart_exhaustedBu kartın 3D Secure'ü zaten bir kez yeniden başlatıldı ve ayrı sayfa açıldı; alıcı doğrulamayı o sayfada tamamlar
410split_pay.three_ds.restart_expired3D Secure oturumu kapandı ya da süresi doldu; alıcıdan kartı yeniden girmesi istenir. details.reason'a bakın
400split_pay.refund.amount_exceededTutarı details.refundableAmount ile sınırlayın
422split_pay.refund.amount_not_distributableKart dışı parçayı tam tutarıyla kapsayan bir tutar seçin
409split_pay.refund.not_alloweddetails.reason'a bakın
—split_pay.refund.incompleteAynı Idempotency-Key ile tekrar deneyin
400Idempotency-Key eksikBaşlığı her istekte gönderin
403Parçalı ödeme kapalıKurulumunuzda özellik devre dışı

İlgili sayfalar