Hata Yönetimi
Hata yanıtları tek bir zarf kullanır. Hatanın nereden çıktığı (kimlik doğrulama, yetki, iş kuralı, servis) fark etmez — alanlar aynıdır.
{
"status": "failure",
"code": "payment.card.declined",
"message": "Kart reddedildi",
"statusCode": 409,
"timestamp": "2026-08-17T10:32:23.816Z",
"service": "api-gateway",
"systemTime": 1786962743816,
"requestId": "req_7f3d9c1a4b2e",
"docsUrl": "https://docs.lunixi.com/tr/getting-started/errors#INVALID_SIGNATURE"
}message'a göre değil, code'a göre dallanın.
message insan içindir: çevrilir ve zamanla değişir. code sözleşmenin parçasıdır ve sabittir. Mesaj metnine göre if yazan bir entegrasyon, sözlüğe yeni bir dil ya da yeni bir metin girdiğimiz gün sessizce kırılır — ve bu artık teorik değil, çeviri yürürlükte.
Alanlar
| Alan | Tip | Not |
|---|---|---|
status | string | Hatada daima "failure" |
code | string | Noktalı granular kod (payment.card.declined) — dallanma bunun üzerinden |
message | string | İnsan-okur açıklama; çevrilebilir |
statusCode | number | HTTP durumu, gövdede de tekrarlanır |
timestamp | string | ISO 8601 |
service | string | Hatayı üreten servis |
systemTime | number | epoch milisaniye |
requestId | string | Korelasyon anahtarı — destek talebinde bu değeri iletin |
details | object | Opsiyonel — yalnız varsa eklenir |
docsUrl | string | Opsiyonel — yalnız dokümante edilmiş hatalarda döner |
docsUrl her hatada gelmez. Yalnız entegratörün kendisinin düzeltebileceği hatalar bir doküman bağlantısı taşır. Sunucu kaynaklı hatalarda (INTERNAL_ERROR, MICROSERVICE_ERROR, gateway.error …) alan hiç eklenmez — boş string ya da null değil, yok. Yapabileceğiniz bir şey olmadığı için link gürültü olurdu.
Koda dökerken alanın olmayabileceğini varsayın.
Zarfın kök seviyesinde düz alanlar vardır. Bir error nesnesi içine sarılmaz; response.error.code diye okumaya çalışmayın.
Doğrulama hataları
Alan doğrulaması başarısız olduğunda details alan bazlı döker:
{
"status": "failure",
"code": "validation.error",
"message": "Doğrulama hatası",
"statusCode": 400,
"requestId": "req_7f3d9c1a4b2e",
"details": {
"errors": [
{ "field": "amount", "errors": ["amount minör birim tam sayı olmalıdır"] }
]
}
}requestId ile korelasyon
Her yanıt — başarılı ya da hatalı — x-request-id başlığı taşır. Aynı değer gövdedeki requestId alanında ve bizim mikroservis loglarımızda bulunur.
Destek talebi açarken bu değeri iletin. Tek anahtarla isteğin uçtan uca izini çıkarabiliyoruz.
Kendi id'nizi gönderebilirsiniz
İstekte x-request-id (ya da x-correlation-id) gönderirseniz ona saygı duyulur ve aynı değer yanıtta döner. Böylece kendi izleme sisteminizle bizimkini aynı anahtar üzerinden eşleyebilirsiniz.
Çözüm sırası: x-request-id → x-correlation-id → gateway kendi üretir.
Kabul edilen biçim dardır: yalnız A-Z a-z 0-9 . _ : - karakterleri ve en fazla 128 karakter.
Bunun dışında bir değer gönderirseniz istek reddedilmez — değer sessizce yok sayılır ve gateway kendi id'sini üretir. Yani "gönderdiğim id neden dönmedi?" sorusunun cevabı genelde budur: karakter kümesi ya da uzunluk.
Dil seçimi
message alanı ve docsUrl bağlantısı istediğiniz dilde döner.
x-lang: trx-lang yoksa Accept-Language kullanılır; o da yoksa kurulumun varsayılan dili geçerlidir.
| Dil | message | docsUrl |
|---|---|---|
en | İngilizce | https://docs.lunixi.com/getting-started/errors#KOD |
tr | Türkçe | https://docs.lunixi.com/tr/getting-started/errors#KOD |
Desteklenmeyen bir dil istenirse varsayılana düşülür. Sözlükte olmayan bir kod için orijinal mesaj gösterilir — çıplak kod asla gösterilmez.
HTTP durum kodları
| Durum | Anlamı |
|---|---|
400 | Geçersiz istek — eksik veya hatalı alan |
401 | Kimlik doğrulanamadı — token yok, geçersiz ya da süresi dolmuş |
403 | Yetki yok — kapsam yetersiz, IP izinli listede değil, ya da merchant askıya alınmış |
404 | Kaynak bulunamadı |
409 | İş kuralı çatışması — ör. kart reddi, çift kayıt |
422 | İstek geçerli JSON ama iş kuralına takılıyor |
429 | Hız limiti aşıldı |
500 | Sunucu hatası |
503 | Servis geçici olarak kullanılamıyor |
Hangi hatada yeniden denenir
Yeniden deneyin: 500 · 502 · 503 · 504 — üstel geri çekilmeyle.
Denemeyin: 400 · 401 · 403 · 409 · 422 — istek aynı kaldığı sürece sonuç değişmez. Önce isteği düzeltin.
Ödeme oluşturma çağrısını yeniden denerken aynı Idempotency-Key başlığını gönderin; aksi halde ikinci bir intent açarsınız. → API'ye Genel Bakış
Kod sözlüğü
Aşağıdaki kodların her birinin kendi başlığı ya da tablo satırı vardır. Yanıt bir docsUrl taşıyorsa bağlantı doğrudan oraya götürür.
VALIDATION_ERROR
Gönderdiğiniz alanlardan biri geçersiz. Sebep alan bazında details.errors[] içindedir; oradaki field değerine bakın.
UNAUTHENTICATED
Kimlik doğrulanamadı. Authorization: Bearer … başlığı yok, token geçersiz ya da süresi dolmuş. Token ömrü tipik olarak 5 dakikadır — önbelleğe alıp expires_at'e göre yenileyin. → Kimlik Doğrulama
PERMISSION_DENIED
Token geçerli ama bu işlem için gereken kapsamı taşımıyor. Anahtarınıza tanımlı kapsamları kontrol edin.
auth.permission.forbidden
PERMISSION_DENIED ile aynı durum, granular kod biçiminde döner.
INVALID_SIGNATURE
İmza doğrulanamadı. En sık üç sebep:
- Gövdesiz istekte
Digest:satırını kanonik dizeye eklediniz — eklenmemeli. Token basma çağrısının kanonik dizesi dört satırdır. - Satır sırası ya da başlık yazımı farklı.
crypto.sign'ın ilk argümanınulldeğil — Ed25519'da hash algoritması belirtilmez.
NONCE_REPLAY
Bu X-Nonce daha önce kullanılmış. Nonce tek kullanımlıktır; her istek için yeni bir değer üretin (UUID uygundur).
IP_NOT_ALLOWED
İstek, anahtarınız için tanımlı izin listesinde olmayan bir IP'den geldi. Sunucunuzun çıkış IP'si değiştiyse (yeni deploy, NAT değişikliği) listeyi güncelleyin.
MERCHANT_SUSPENDED
Hesap askıya alınmış. Bu, istekle düzeltilebilecek bir durum değildir — destek ekibiyle iletişime geçin.
AUTH_REFRESH_REUSED
Bir yenileme jetonu ikinci kez kullanıldı ve oturum güvenlik gereği sonlandırıldı. Genellikle iki süreç aynı jetonu paylaştığında olur — token yenilemeyi tek bir yerde toplayın.
PRODUCT_NOT_ENABLED
Kimliğiniz doğrulandı, izniniz de yerinde — ama çağırdığınız uç bir ürüne ait ve o ürüne yetkiniz yok. Ürün, izinden ayrı bir eksendir: bir işlemi yapma izniniz olması, o ürünün hesabınızda açık olduğu anlamına gelmez.
İki ayrı koşul birden gerekir; hangisinin eksik olduğunu panelden görebilirsiniz:
| Koşul | Nerede | Nasıl açılır |
|---|---|---|
| Ürüne aktif abonelik | Abonelik ekranı | Ürüne abone olun |
| API anahtarında ürünün tanımlı olması | API Anahtarları ekranı | Anahtarı düzenleyip ürünü ekleyin |
Aboneliğiniz varken bu hatayı alıyorsanız neredeyse her zaman ikinci koşul eksiktir: API anahtarı bilinçli bir daraltmadır ve abonelik açıldığında mevcut anahtarlarınız kendiliğinden genişlemez.
Panelden yaptığınız değişiklik anında yansımaz: yetki görüntüsü erişim jetonunuza gömülüdür ve jeton yenilenince tazelenir. Sunucu tarafında bekleyecek bir şey yoksa yeni bir jeton alın.
PRODUCT_ENTITLEMENT_UNAVAILABLE
PRODUCT_NOT_ENABLED ile karıştırmayın. Bu kod "ürününüz yok" demez; "ürün yetkinizi şu anda doğrulayamıyoruz" der. HTTP durumu 503'tür ve geçicidir.
Yetkilendirme kapısı fail-closed çalışır: doğrulayamadığımız bir yetkiyle isteği geçirmeyiz. Yapmanız gereken, hesabınızda bir değişiklik değil — yeniden denemektir. Üstel geri çekilmeli (exponential backoff) bir yeniden deneme yeterlidir.
payment.amount.field_removed
Ödeme isteğinde kaldırılmış bir tutar alanı (price ya da paidPrice) gönderdiniz. Ödeme uçlarında tek tutar alanı amount'tır: kuruş cinsinden tam sayı, en az 1. Gönderdiğiniz kaldırılmış alanlar details.fields içinde, varsa diğer alan hataları details.errors[] içinde döner.
amountsepet toplamıdır: alıcının ödediği ürün ve hizmet bedeli, vade farkı hariç.basketItemsgönderirseniz kalemlerinpricetoplamıamount'a eşit olmalıdır. Kalemdekipricealanı kalem tutarıdır ve yerinde durur.- Vade farkını göndermezsiniz. Taksitte sistem vade farkını bağlayıcı taksit teklifinden hesaplar ve çekilen tutara ekler.
→ Checkout Formu · Kart — 2D · Taksit & BIN
payment.method.disabled
Seçtiğiniz ödeme yöntemi işletmenizin panelindeki form ayarlarında kapalı. Panelde kapatılan yöntem her kanalda kapalıdır: Checkout Formu'nda gösterilmez, GET /payments/methods listesinde yer almaz ve POST /payments/direct/payment ile de başlatılamaz. HTTP durumu 422'dir; ödeme başlamadan reddedilir, para hareket etmez.
- Yöntemi kullanmak istiyorsanız panelde Ödeme Formu Ayarları'ndan açın.
- Hangi yöntemlerin açık olduğunu
GET /payments/methodsile okuyun.
→ Payment · Checkout Formu — Payment
payment.method.unknown
Gönderdiğiniz yöntem kodu tanınmıyor. HTTP durumu 400'dür. Yöntem kodları büyük harfle yazılır (CARD, WALLET, MOBILE_BILLING …); başka bir yönteme ya da karta çevrilmez.
POST /payments/direct/paymentisteğindepaymentMethodalanına geçerli bir kod gönderin.GET /payments/methods?paymentMethod=süzgecinde tanınmayan, küçük harfle yazılmış, boş ya da tekrarlanan değer bu kodu alır. Yanıttadetails.fieldpaymentMethod'dur; tanınan bütün kodlardetails.allowedlistesindedir.
→ Yöntemleri Listeleme · Payment
payment.provider.required
Bu yöntemde sağlayıcıyı alıcı seçer (providerSelectionMode: BUYER) ve hesabınıza birden fazla sağlayıcı bağlı, ama istekte providerCode yok. HTTP durumu 400'dür; ödeme başlamadan reddedilir.
- Bağlı sağlayıcıların kodları
details.boundProviderCodesiçindedir. - Sağlayıcıları alıcıya gösterin ve seçtiği sağlayıcının kodunu yöntem bloğunda
providerCodeile gönderin (ör.wallet.providerCode).
→ Yöntemleri Listeleme › Sağlayıcı seçimi · Cüzdanla Öde
payment.provider.none_eligible
Bu yöntemde sağlayıcıyı platform seçer (providerSelectionMode: PLATFORM), istekte providerCode yok ve hesabınıza bağlı sağlayıcıların hiçbiri bu ödemeyi karşılamıyor. HTTP durumu 422'dir. Ödeme başlatılmaz ve tutar çekilmez.
Her sağlayıcının sonucu details.candidates[] içindedir:
| Alan | Açıklama |
|---|---|
providerCode | Sağlayıcının kodu |
outcome | INELIGIBLE: sağlayıcı bu ödemeyi karşılamıyor. UNAVAILABLE: sağlayıcıdan uygunluk yanıtı alınamadı. NOT_CHECKED: seçim süresi dolduğu için sağlayıcı denenmedi |
reason | Sebep kodu ya da null |
- Sonuçlardan biri
UNAVAILABLEya daNOT_CHECKEDise aynı isteği daha sonra tekrar deneyebilirsiniz. - Sağlayıcıyı yöntem bloğunda
providerCodeile kendiniz de seçebilirsiniz. - Bütün sonuçlar
INELIGIBLEise alıcıya başka bir yöntem önerin.
→ Faturana Yansıt › Hiçbir sağlayıcı uygun değil · Yöntemleri Listeleme › Sağlayıcı seçimi
payment.provider.disabled_in_form
Seçilen sağlayıcı işletmenin Form Ayarları'nda yalnız formda kapatılmış. HTTP durumu 422'dir; ödeme başlamadan reddedilir ve para hareket etmez. Bu kod yalnız Checkout Formu yolunda döner.
- Checkout Formu alıcıya formda açık başka bir sağlayıcı ya da yöntem sunar.
- Sağlayıcıyı formda kullanmak istiyorsanız panelde Ödeme → Form Ayarları ekranında yöntemin Ödeme seçenekleri listesinden açın.
- Formda kapalı sağlayıcı
GET /payments/methodslistesinde görünür vePOST /payments/direct/paymentile kullanılabilir.
→ Checkout Formu — Payment › Sıra ve formda gösterilen sağlayıcılar
payment.method.selection_attempts_exhausted
Bu ödemede kart dışı yöntem seçimi deneme sınırına (3) ulaşıldı. HTTP durumu 409'dur; seçim yazılmaz, sağlayıcı çağrılmaz ve para hareket etmez.
- Sınır ödeme (sipariş) başınadır; aynı siparişin yeni denemeleri de aynı sayacı kullanır.
- Alıcı aynı siparişi kartla ödeyebilir.
→ Checkout Formu — Payment › Sağlayıcı seçimi
payment.checkout.order_locked
Siparişte parçalı ödeme sürüyor; sonuçlanmadan aynı siparişte tek kartla, kart dışı yöntemle ya da cüzdanla ödeme başlatılamaz. HTTP durumu 409'dur; ödeme kaydına dokunulmaz.
- Parçalı ödemenin sonuçlanmasını bekleyin. Parçalı ödeme başarısız olur, süresi dolar ya da alıcı vazgeçerse sipariş açık kalır ve başka bir yöntemle ödenebilir.
→ Parçalı Ödeme › Sipariş kilidi
split_pay.checkout.order_not_open
Siparişte başka bir ödeme başlamış ya da sipariş kapanmış; parçalı ödeme başlatılamaz. HTTP durumu 409'dur; parçalı ödeme yazılmaz ve kart çekilmez. Sebep details.reason içindedir:
details.reason | Anlamı |
|---|---|
ORDER_NOT_OPEN | Sipariş açık değil: tek yöntemli bir deneme başlamış ya da sipariş kapanmış |
METHOD_IN_PROGRESS | Siparişte kart dışı bir yöntem seçilmiş ve sürüyor |
WALLET_PAYMENT_IN_PROGRESS | Siparişte onayı gönderilmiş ve sonucu kesinleşmemiş bir cüzdan ödemesi var |
METHOD_PINNED | Sipariş intent'te kart dışı bir yönteme sabitlenmiş |
ORDER_LOCKED | Siparişte başka bir parçalı ödeme başlıyor ya da sürüyor |
→ Parçalı Ödeme › Sipariş kilidi
Parçalı ödeme kodları
Parçalı ödeme uçlarının (POST /payments/split, POST /payments/split/{splitPaymentId}/refund ve Checkout Formu'nun parçalı ödeme uçları) kodları. Ayrıntı her zaman details içindedir.
Doğrulama
Parçalı ödeme başlamadan reddedilir; hiçbir parçadan para çekilmez. HTTP durumu 422'dir. details.legIndex ya da details.index sorunlu parçanın sırasını (0'dan başlar) gösterir.
| Kod | Anlamı | Ne yapmalı |
|---|---|---|
split_pay.validation.amount_mismatch | Parçaların toplamı sipariş tutarına eşit değil | Toplamı details.totalAmount yapın |
split_pay.validation.leg_count_out_of_range | Parça sayısı izin verilen aralığın dışında | details.min ile details.max arasında parça gönderin |
split_pay.validation.card_leg_count_out_of_range | Kart sayısı sınırı aşıyor | En çok details.max kart kullanın. Çoklu Kartla Ödeme kapalıyken sınır 1'dir |
split_pay.validation.invalid_leg_amount | Parça tutarı pozitif tam sayı değil | Tutarı minor unit cinsinden tam sayı gönderin |
split_pay.validation.currency_mismatch | Bir parçanın para birimi siparişle uyuşmuyor ya da seçilen sağlayıcı bu para birimini desteklemiyor | Bütün parçaları siparişin para biriminde, bu para birimini destekleyen sağlayıcıyla gönderin |
split_pay.validation.missing_card_token | Kart parçasında kart bilgisi yok ya da kart dışı parça kart bilgisi taşıyor | Kart parçasına cardToken ekleyin; kart dışı parçadan kart alanlarını çıkarın |
split_pay.validation.methods_disabled | Kart dışı yöntemlerle parçalı ödeme kapalı | Panelde Kart Dışı Yöntemlerle Parçalı Ödeme'yi açın ya da yalnız kartlarla bölün |
split_pay.validation.method_not_allowed | Yöntem parçalı ödemeye açılmamış | Yöntemi Form Ayarları'nda parçalı ödemeye açın ya da başka bir yöntem seçin |
split_pay.validation.provider_not_available | Sağlayıcı bu yöntem için kullanılamıyor ya da sağlayıcı kodu yok | GET /payments/methods listesindeki bir sağlayıcının kodunu gönderin |
split_pay.validation.provider_not_split_eligible | Sağlayıcı parçalı ödemede kullanılamıyor | splitEligible: true olan bir sağlayıcı ya da başka bir yöntem seçin |
split_pay.validation.duplicate_provider | Aynı sağlayıcı birden fazla parçada | Bir sağlayıcıyı tek parçada kullanın |
split_pay.validation.multiple_irreversible_legs | Birden fazla geri alınamayan parça var | Geri alınamayan en fazla bir parça gönderin |
split_pay.validation.leg_below_minimum | Bir parça, parça başına en az tutarın altında | Parçayı details.minLegAmount ya da üzerine çıkarın |
split_pay.validation.leg_outside_provider_limits | Bir parça sağlayıcının tutar aralığının dışında | Parçayı details.minAmount ile details.maxAmount arasına getirin |
split_pay.validation.invalid_installment | Bir parçanın taksit sayısı geçersiz | Taksiti 1 ile details.max arasında seçin. details.reason CREDIT_APPROVAL_PHASE ise kredi onayı içeren ödemede kart taksitli olamaz; NON_CARD_LEG ise kart dışı parçada taksit gönderilemez |
split_pay.validation.installment_quote_rejected | Kart parçasının taksit teklifi kullanılamıyor: süresi dolmuş ya da parçanın tutarı veya taksitle eşleşmiyor | Teklifi parçanın tutarıyla yenileyin. Sebep details.reason, taksit details.installment içindedir |
split_pay.insurance.requires_card_leg | Sigorta seçili ama parçalı ödemede kart parçası yok. Sigorta primi kart parçasından tahsil edilir; sigortalı parçalı ödemede kart parçaları tek çekimle alınır | En az bir kart parçası ekleyin ya da sigortasız devam edin (details.canContinueWithoutInsurance). Sigorta seçimi kullanılmış sayılmaz |
Adımlar, devam bağlantısı ve devam sayfası
| Kod | HTTP | Anlamı | Ne yapmalı |
|---|---|---|---|
split_pay.step.not_allowed | 409 | Parçalı ödemede bu adım şu anda yapılamaz; kayıt değişmez ve para hareket etmez | Durumu okuyup beklenen adımı izleyin. Sebep details.reason içindedir (aşağıda) |
split_pay.step.busy | 409 | Aynı parçalı ödemeyi şu anda başka bir istek yürütüyor | Birkaç saniye sonra tekrar deneyin |
split_pay.continuation.unavailable | 410 | Devam bağlantısı artık kullanılamıyor. details.reason: INVALID (kod tanınmıyor), EXPIRED (süre doldu), CLOSED (ödeme sonuçlandı ya da artık alıcı adımı beklemiyor) | Alıcı yeni bir ödeme başlatabilir |
split_pay.resume.unavailable | 410 | Devam sayfasının bağlantısı artık kullanılamıyor. details.reason: INVALID (bağlantı tanınmıyor), EXPIRED (süre doldu) | Alıcı yeni bir ödeme başlatabilir. Ödemenin sonucu size webhook ile gelir |
split_pay.resume.already_opened | 409 | Devam sayfası başka bir pencerede açıldı; bağlantı tek pencerede kullanılır | Alıcı ödemeye ilk açtığı pencereden devam eder |
split_pay.resume.proof_invalid | 401 | Devam sayfasının oturumu doğrulanamadı | Alıcı ödemeye devam sayfasının ilk açıldığı pencereden devam eder |
split_pay.resume.not_configured | 503 | Parçalı ödeme şu anda başlatılamıyor. Ödeme başlatılmadı, para hareket etmedi | Alıcı tek yöntemle ödeyebilir ya da kısa süre sonra tekrar deneyebilir |
split_pay.three_ds.restart_exhausted | 409 | Banka pencereye izin vermediği için bu kart parçasının 3D Secure'ü ayrı sayfada zaten bir kez yeniden başlatıldı ve ayrı sayfa açıldı; ikinci kez başlatılmaz. Ayrı sayfa henüz açılmadıysa aynı istek hata değil, aynı yanıtı alır | Alıcı doğrulamayı açık olan ayrı sayfada tamamlar. Doğrulama tamamlanmazsa ödeme terk edilen 3D Secure kuralıyla sonuçlanır |
split_pay.three_ds.restart_expired | 410 | Bu kart parçasının 3D Secure oturumu kapandı ya da süresi doldu; ayrı sayfada yeniden başlatma yapılmaz. details.reason: THREE_DS_CLOSED (oturum kapandı), THREE_DS_SESSION_EXPIRED (oturumun süresi doldu) | Alıcıdan kartı yeniden girmesi istenir |
split_pay.step.not_allowed için details.reason:
| Değer | Anlamı |
|---|---|
SPLIT_NOT_WAITING | Siparişte süren parçalı ödeme yok ya da parçalı ödeme bu adımı beklemiyor |
NOT_CURRENT_LEG | İstenen parça sırası gelen parça değil |
LEG_NOT_STARTABLE | Parça başlatılabilecek durumda değil |
PROVIDER_MISMATCH, METHOD_MISMATCH | Gönderilen sağlayıcı ya da yöntem parçadakiyle aynı değil |
SPLIT_EXPIRED | Toplam süre doldu |
REPLACEMENT_WINDOW_CLOSED | Yeni kart için verilen süre doldu |
CARD_LEG_REQUIRED | Bu adım bir kart parçası bekliyor |
CARD_SOURCE_UNSUPPORTED | Gönderilen kart bu adımda kullanılamıyor |
İade
| Kod | HTTP | Anlamı | Ne yapmalı |
|---|---|---|---|
split_pay.refund.amount_exceeded | 400 | İade tutarı iade edilebilir toplamı aşıyor. details.refundableAmount ve details.nonRefundableAmount döner | Tutarı details.refundableAmount ile sınırlayın |
split_pay.refund.amount_not_distributable | 422 | Tutar iade edilebilir toplamın içinde ama parçalara bölünemiyor; kart dışı parça yalnız kalan tutarının tamamıyla iade edilir | Kart dışı parçayı tam kapsayan ya da kart parçalarına sığan bir tutar seçin |
split_pay.refund.not_allowed | 409 | İade şu anda yapılamaz. details.reason: SPLIT_NOT_COMPLETED (parçalı ödeme tamamlanmadı), SPLIT_IN_PROGRESS (parçalı ödeme sürüyor), COMPENSATION_REFUND_PENDING (parçanın telafi iadesi sürüyor) | Parçalı ödemenin ya da telafi iadesinin bitmesini bekleyin |
split_pay.refund.incomplete | — | Bazı parçalar iade edilemedi; parça parça sonuç yanıttadır. Ana ödeme iade ucunda başarısız yanıtın kodudur; parçalı ödeme iade ucunda success: false ile döner | Aynı Idempotency-Key ile tekrar deneyin; iade edilmiş parça yeniden iade edilmez |
Diğer sık görülen kodlar
Bunlar docsUrl taşımaz ama sık karşılaşılır:
| Kod | Ne yapmalı |
|---|---|
INVALID_DATE | İmzalı istekte X-Date ±5 dakika penceresi dışında — sunucu saatinizi kontrol edin |
DIGEST_MISSING | Gövde var ama Digest başlığı yok |
INVALID_DIGEST | Gövde özeti Digest ile uyuşmuyor — başlık SHA-256= önekli olmalı |
INVALID_CURSOR | Sayfalama cursor'ı bozuk — elle üretmeyin, önceki yanıttaki pageInfo.nextCursor'ı aynen gönderin. → Sayfalama |
fraud.decision.unconfigured | Hata değil — yapılandırılmamış merchant için varsayılan karar. → Akışlar |
fraud.quota.exceeded | Fraud kotanız doldu — Retry-After kadar bekleyip yeniden deneyin. → Hatalar ve Yeniden Deneme |
FRAUD_EVENT_INVALID | Olay alımına gönderilen olay doğrulamadan geçmedi. → Hatalar ve Yeniden Deneme |
payment.promissory_note.not_found | 404 — Ödemeye ait senet yok: ödeme senetle yapılmamış ya da başka hesaba ait. paymentId değerini kontrol edin. → Senetle Öde |
payment.promissory_note.document_unavailable | 503 — Senet belgesi şu anda sağlayıcıdan alınamıyor; bir süre sonra tekrar deneyin. → Senetle Öde |
payment.promissory_note.not_cancellable, payment.promissory_note.provider_unavailable, payment.promissory_note.cancel_rejected | Hata yanıtı değildir; senet iptal yanıtında senet başına cancelResults[].errorCode değeridir. → Senetle Öde — Senetleri iptal etme |
Fraud uçlarının tüm hata kodları, kota başlıkları ve yeniden deneme kuralları: Fraud — Hatalar ve Yeniden Deneme.
Gizlilik
İstek gövdeleriniz loglanmaz. Sunucu tarafında yalnız yol, HTTP durumu, süre, requestId, merchantId ve hata kodu kaydedilir; sorgu dizesi log'a yazılmadan kırpılır.
İlgili
- Kimlik Doğrulama — imzalı istek hataları
- API'ye Genel Bakış — zarf ve idempotency
- Webhook'lar — teslimat hataları ayrı bir mekanizmadır