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çim | Parçalar | Sayfa |
|---|---|---|
| Çoklu kartla ödeme | Yalnı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 ödeme | Bir ya da birden fazla kart ve kart dışı yöntemler | Birden 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
| Yol | Kim başlatır | Bölüm |
|---|---|---|
| Checkout Formu | Alıcı, formdaki Birden fazla yöntemle öde girişinden. Sizin ek kod yazmanız gerekmez | Checkout Formu ile |
| Merchant API | Siz, kendi ödeme sayfanızdan POST /payments/split ile | API 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.
| Anahtar | Ne açar |
|---|---|
| Çoklu Kartla Ödeme | Alı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ı Ödeme | Alı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:
| Ayar | Değer |
|---|---|
| En fazla parça | 2–5, varsayılan 3. Kartlar ve kart dışı yöntemler birlikte sayılır |
| Parça başına en az tutar | Boşsa alt sınır yoktur. Sağlayıcının kendi tutar sınırları her zaman geçerlidir |
| Toplam süre | 10–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/methodssatırındakisplitEligiblesö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.
- Para birimi: bütün parçalar siparişin para birimindedir ve seçilen sağlayıcı bu para birimini desteklemelidir.
- Tutar: parçaların toplamı sipariş tutarına eşittir. Her parça pozitif tam sayıdır, Parça başına en az tutar'ın altında kalmaz ve sağlayıcının
minAmount/maxAmountaralığındadır. - Sayı: kart dışı yöntem içeren parçalı ödemede 2 ile En fazla parça arasında parça olur. Kart sayısı için Açma bölümüne bakın.
- Kart parçası: Çoklu Kartla Ödeme › Kart parçası.
- Kart dışı parça, yöntem ve sağlayıcı: Birden Fazla Yöntemle Ödeme › Yöntem ve sağlayıcı seçimi.
- Geri alınamayan parça: Birden Fazla Yöntemle Ödeme › Geri alınamayan parça.
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
expiresAtalanı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
expiresAtnullolur. 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
409payment.checkout.order_lockedalı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:
409split_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/init | Parçalı ödemeyi başlatır. legs[]: kart parçası { cardToken, amount, installment?, installmentQuoteToken? }, kart dışı parça { paymentMethod, providerCode, amount } |
POST /payments/form/split/status | Güncel durumu, ana ödemenin paymentId'sini, adım listesini ve beklenen adımı döner |
POST /payments/form/split/method | Sırası gelen kart dışı parçayı başlatır. Gövde form/payment gövdesidir, ek olarak legId taşır |
POST /payments/form/split/card | Kredi onayından sonra kart parçasını alıcının kartıyla başlatır: { legId, cardToken } |
POST /payments/form/split/replacement-card | Eksik tutar için yeni kartı alır: { cardToken }. Tutar sunucudan gelir |
POST /payments/form/split/continue | Devam bağlantısının kodunu (code) siparişin yeni form token'ına çevirir |
POST /payments/form/split/restart-3ds | Banka 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,pendingStepveexpiresAtalanlarını taşır;splitPaymentIdtarayıcıya verilmez. - Yanıtlar ayrıca ödemenin başladığı 3D Secure gösterimini
threeDsDisplay(INLINEya daREDIRECT) alanında taşır. form/split/initveform/split/statusyanıtları üst düzeyde ana ödemeninpaymentId'sini taşır. Bu, size intent oluştururken dönen vecallbackUrl'inize gelen kimliktir. Parçaların kimlikleristeps[].paymentIdvependingStep.paymentIdalanları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.paymentIdile 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.
| Alan | Zorunlu | Açıklama |
|---|---|---|
totalAmount | Evet | Sipariş tutarı, minor unit. Parçaların toplamına tam olarak eşit olmalı |
currency | Evet | ISO-4217 (TRY, USD, EUR) |
ownerRef | Evet | Kart 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[] | Evet | 1–5 parça. Kart dışı parça içeren istekte 2 ile En fazla parça arasında |
callbackUrl | Koşullu | 3D Secure sonrası alıcının döneceği http(s) adresiniz. Bir kart parçasında force3D varsa zorunlu |
orderId | Hayır | Sipariş numaranız. Olaylarda orderId olarak döner |
ownerScope | Hayır | Sahip 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ı */ ]
}
}| Alan | Açıklama |
|---|---|
success | Yalnız parçalı ödeme tamamlandığında (COMPLETED) true |
code, data.status | Parçalı ödemenin durumu; bkz. Durumlar |
duplicate | Aynı Idempotency-Key ile gelen istek mevcut parçalı ödemeyi döndürdüyse true; yeni çekim yapılmaz |
needsReconciliation | Parçalı ödeme operasyon takibinde |
steps[] | Platformun kurduğu adım listesi, yürütme sırasıyla |
pendingStep | Beklenen adım; bekleyen adım yoksa null |
expiresAt | Toplam 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:
| Alan | Açıklama |
|---|---|
legId, sequence | Parçanın kimliği ve yürütme sırası (1'den başlar) |
kind | CARD ya da METHOD (kart dışı) |
paymentMethod, providerCode | Yöntem ve sağlayıcı. Kart parçasında providerCode null'dır |
splitBehavior | Parçanın fazı; bkz. Adım sırası |
amount | Parçanın tutarı, minor unit |
status | Parçanın durumu; bkz. Durumlar |
paymentId | Kart dışı parçanın ödeme kaydı; aksiyon uçlarında kullanılır. Kart parçasında ve parça başlamadıysa null |
replacesLegId | Bu parça, eksik tutar için girilen yeni kartsa yerine girdiği parçanın kimliği |
current | Parç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
step | Anlamı | Ne yapmalı |
|---|---|---|
THREE_DS | Kart parçası 3D Secure bekliyor | Alı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_METHOD | Sıradaki kart dışı parça başlatılmayı bekliyor | Aynı isteği aynı Idempotency-Key ile yeniden gönderin. Yeni kayıt açılmaz; parça bu istekteki blokla başlatılır |
ACTION | Kart 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_PENDING | Kart dışı parçanın sonucu sağlayıcıdan bekleniyor | Bekleyin; sonuç netleşince parçalı ödeme kendiliğinden ilerler. Alıcıya "işleminiz kontrol ediliyor" gösterin |
CREDIT_APPROVAL | Kredi onayı bekleniyor | Yalnız kredi sağlayıcısı bağlı olduğunda. Bkz. Kredi parçası |
CARD_INPUT, REPLACEMENT_CARD | Alıcının kartı bekleniyor | Yalnı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-Keyile 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-Keyile gönderebilirsiniz; yanıtduplicate: truetaşı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ı:
| Durum | Anlamı |
|---|---|
COMPOSING | Doğrulandı ve kaydedildi; parçalar henüz başlamadı |
AUTHORIZING | Parçalar sırayla yürütülüyor |
AWAITING_3DS | Bir kart parçası 3D Secure bekliyor |
AWAITING_ACTION | Bir kart dışı parça başlatılmayı, alıcı aksiyonunu ya da sonucunu bekliyor |
AWAITING_CREDIT_APPROVAL | Kredi onayı bekleniyor (yalnız kredi sağlayıcısı bağlı olduğunda) |
AWAITING_REPLACEMENT_CARD | Eksik tutar için alıcının yeni kartı bekleniyor (yalnız Checkout Formu) |
AUTHORIZED, CAPTURING | Bütün parçalar hazır; kartlar çekiliyor |
COMPLETED | Bütün parçalar çekildi; sipariş ödendi |
COMPENSATING | Telafi sürüyor: provizyonlar bırakılıyor, çekilmiş parçalar iade ediliyor |
VOIDED | Telafi tamamlandı; alıcı net olarak ödeme yapmadı |
FAILED | Parçalı ödeme başarısız sonuçlandı |
RECONCILIATION_REQUIRED | Geri 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.
| Alan | Açıklama |
|---|---|
settlementMode | SPLIT: tahsilat parçalardadır |
splitPaymentId | Parçalı ödemenin kimliği |
orderId | Sizin sipariş numaranız |
intentId | Yalnız Checkout Formu'nda: siparişin ödeme kaydı |
status | CAPTURED ya da FAILED; parçalı ödemenin durumu ayrıca splitStatus'tadır |
totalAmountMinor | Sipariş tutarı |
capturedAmountMinor / amountMinor | Baş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ı
| Olay | Ne zaman |
|---|---|
payment.split.completed | Bütün parçalar çekildi (COMPLETED). Parça özetleriyle gelir |
payment.split.voided | Telafi tamamlandı (VOIDED); alıcı net olarak ödeme yapmadı |
payment.split.compensating | Parçalı ödeme operasyon takibine düştü (COMPENSATING, needsReconciliation). cause: CAPTURE_FAILURE ya da COMPENSATION_INCOMPLETE |
payment.split.outcome_pending | Geri alınamayan parçanın sonucu bekleniyor; süre durdu. pendingLegId, pendingLegSequence taşır |
payment.split.reconciliation_required | Mutabakat 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_eventsseç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 vedata.splitLegalanısplitPaymentId,parentPaymentId(Checkout Formu'nda siparişin ödeme kaydı, API'denull),parentOrderId,legIdvelegSequencetaşır. - Teslimatı parça olaylarına göre değil, ana ödemenin
payment.capturedolayı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/:idyanıtındakirefund.refundableAmountverefund.nonRefundableAmountalanları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.
amountzorunludur.- Parça parça sonuç yanıtın
meta.details.splitRefundalanındadır. - Bazı parçalar iade edilemediyse yanıt
split_pay.refund.incompletekoduyla başarısız döner. Sonucu henüz belli olmayan parça varsa yanıt202olur. İki durumda da aynıIdempotency-Keyile 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}/refundGövde { "amount": 15000, "reason": "…" }; reason isteğe bağlıdır. Uç payment:refund yetkisi ve zorunlu Idempotency-Key ister.
- Yanıt
dataalanındarefundRequestId,splitPaymentId,orderId,currency,status(COMPLETED,PARTIAL,FAILED,PROCESSING),requestedAmount,refundedAmount,refundableAmount,nonRefundableAmount,duplicateve parça başınalegs[](legId,sequence,paymentIntentId,paymentMethod,providerCode,amount,status,errorCode) taşır. - Bütün parçalar iade edildiyse
success: truedöner. Bazı parçalar iade edilemediyse yanıtsuccess: falsevecode: "split_pay.refund.incomplete"taşır; aynıIdempotency-Keyile 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ıysapayment.partially_refunded. OlaysettlementMode: "SPLIT",refundId,refundAmountMinor,totalRefundedMinor,fullyRefundedverefundedLegs[]taşır. - Ana ödemenin
status'u iade sonrasında değişmez. İade edilen toplamı olaydakitotalRefundedMinorveGET /payments/split/:idyanıtındakirefund.refundedAmountgö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 istek409split_pay.refund.not_allowedalır.
Liste ve detay
Ödeme listesi
GET /paymentslistesinde Checkout Formu'ndaki parçalı ödeme tek satırdır: siparişin ödeme kaydı, sipariş tutarıyla. Parçalar listede yer almaz.includeLegs=trueile parçaların ödeme kayıtları da listelenir.- Parçalı ödemeyle ilgili satırlar
splitalanı taşır:splitPaymentId,role(PARENTana ödeme,LEGparça), parçadaparentPaymentIdvelegSequence. - 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 ödemeyiGET /payments/splitile 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:
| Alan | Açıklama |
|---|---|
legStatus | Parçanın durumu; bkz. Durumlar |
paymentMethod, providerCode | Yöntem ve sağlayıcı |
legAmount | Parçanın sipariş tutarındaki payı |
installmentCount, chargeAmount | Taksit sayısı ve vade farkı dahil çekim tutarı |
capturedAmount, refundedAmount | Çekilen ve iade edilen tutar |
refundState | REFUND_PENDING (iade bekliyor), REFUNDED (iade edildi), NOT_REFUNDABLE (geri alınamaz) ya da null |
compensationRefund | Telafi iadesinin ayrıntısı: status, amount, attempt, requestedAt, nextAttemptAt, lastErrorCode, refundedAt |
dispute | Parçada ters ibraz varsa state, disputedAmount, openChargebackCount |
pendingRedirectPath, awaiting3dsSince | Kart parçası 3D Secure beklerken yönlendirme yolu ve bekleme başlangıcı |
cardTokenMasked, cardLast4, cardBrand | Kart kimliği; ham token dönmez |
paymentIntentId, paymentIntentStatus | Parçanın ödeme kaydı ve durumu |
failureReason | Baş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.
| Durum | Kod | Ne yapmalı |
|---|---|---|
| 422 | split_pay.validation.amount_mismatch | Parçaların toplamını sipariş tutarına eşitleyin |
| 422 | split_pay.validation.leg_count_out_of_range | Parça sayısını details.min ile details.max arasında tutun |
| 422 | split_pay.validation.card_leg_count_out_of_range | Kart sayısını details.max ile sınırlayın |
| 422 | split_pay.validation.invalid_leg_amount | Parça tutarını pozitif tam sayı gönderin |
| 422 | split_pay.validation.currency_mismatch | Bütün parçaları siparişin para biriminde ve bu para birimini destekleyen sağlayıcıyla gönderin |
| 422 | split_pay.validation.missing_card_token | Kart parçasına cardToken ekleyin; kart dışı parçadan kart alanlarını çıkarın |
| 422 | split_pay.validation.methods_disabled | Kart Dışı Yöntemlerle Parçalı Ödeme'yi açın |
| 422 | split_pay.validation.method_not_allowed | Yöntemi parçalı ödemeye açın ya da başka bir yöntem seçin |
| 422 | split_pay.validation.provider_not_available | GET /payments/methods listesindeki bir sağlayıcıyı seçin |
| 422 | split_pay.validation.provider_not_split_eligible | splitEligible: true olan bir sağlayıcı seçin |
| 422 | split_pay.validation.duplicate_provider | Bir sağlayıcıyı tek parçada kullanın |
| 422 | split_pay.validation.multiple_irreversible_legs | Geri alınamayan en fazla bir parça gönderin |
| 422 | split_pay.validation.leg_below_minimum | Parçayı details.minLegAmount ya da üzerine çıkarın |
| 422 | split_pay.validation.leg_outside_provider_limits | Parçayı sağlayıcının details.minAmount–details.maxAmount aralığına getirin |
| 422 | split_pay.validation.invalid_installment | Taksiti 1 ile details.max arasında seçin; kart dışı parçada taksit göndermeyin |
| 422 | split_pay.validation.installment_quote_rejected | Teklifi parçanın tutarıyla yenileyin |
| 422 | split_pay.insurance.requires_card_leg | Sigorta seçiliyken en az bir kart parçası ekleyin ya da sigortasız devam edin; prim kart parçasından tahsil edilir |
| 422 | split_pay.validation.callback_url_required / callback_url_invalid | force3D parçası varken http(s) bir callbackUrl gönderin |
| 422 | split_pay.validation.duplicate_card / mixed_owner | Farklı kartlar, aynı kart sahibi |
| 422 | payment.provider.disabled_in_form | Checkout Formu'nda formda açık bir sağlayıcı seçin |
| 409 | split_pay.checkout.order_not_open | Siparişte başka bir ödeme sürüyor ya da sipariş kapanmış; details.reason'a bakın |
| 409 | payment.checkout.order_locked | Siparişte parçalı ödeme sürüyor; sonuçlanmasını bekleyin |
| 409 | split_pay.step.not_allowed | Durumu okuyup beklenen adımı izleyin; details.reason'a bakın |
| 409 | split_pay.step.busy | Birkaç saniye sonra tekrar deneyin |
| 410 | split_pay.continuation.unavailable | Devam bağlantısı artık kullanılamıyor; details.reason'a bakın |
| 410 | split_pay.resume.unavailable | Devam sayfasının bağlantısı geçersiz ya da süresi dolmuş; details.reason'a bakın |
| 409 | split_pay.resume.already_opened | Ödeme başka bir pencerede sürüyor; alıcı o pencereden devam eder |
| 401 | split_pay.resume.proof_invalid | Alıcı ödemeye devam sayfasının ilk açıldığı pencereden devam eder |
| 503 | split_pay.resume.not_configured | Parçalı ödeme başlatılmadı, para hareket etmedi; kısa süre sonra tekrar deneyin |
| 409 | split_pay.three_ds.restart_exhausted | Bu kartın 3D Secure'ü zaten bir kez yeniden başlatıldı ve ayrı sayfa açıldı; alıcı doğrulamayı o sayfada tamamlar |
| 410 | split_pay.three_ds.restart_expired | 3D Secure oturumu kapandı ya da süresi doldu; alıcıdan kartı yeniden girmesi istenir. details.reason'a bakın |
| 400 | split_pay.refund.amount_exceeded | Tutarı details.refundableAmount ile sınırlayın |
| 422 | split_pay.refund.amount_not_distributable | Kart dışı parçayı tam tutarıyla kapsayan bir tutar seçin |
| 409 | split_pay.refund.not_allowed | details.reason'a bakın |
| — | split_pay.refund.incomplete | Aynı Idempotency-Key ile tekrar deneyin |
| 400 | Idempotency-Key eksik | Başlığı her istekte gönderin |
| 403 | Parçalı ödeme kapalı | Kurulumunuzda özellik devre dışı |
İlgili sayfalar
- Çoklu Kartla Ödeme — yalnız kartlarla bölme
- Birden Fazla Yöntemle Ödeme — kartlar ve kart dışı yöntemlerle bölme
- Checkout Formu — Payment — tek yöntemli kart dışı ödeme ve sağlayıcı seçimi
- Yöntemleri Listeleme —
splitEligible,splitBehaviorve sıra - Ön Provizyon, Capture & İptal — provizyon ve çekim modelinin tek ödemelik hâli
- Taksit & BIN — taksit teklifi
- Webhook'lar — teslimat ve imza