Cüzdan
Hata Yönetimi

Hata Yönetimi

Cüzdan hataları üç soruya cevap verecek şekilde tasarlanmıştır: ne oldu, para hareket etti mi, yeniden denenebilir mi.

Hata sınıfları

SınıfHTTPYeniden denenir miÖrnek
Kimlik doğrulama401 / 403Düzelttikten sonraINVALID_SIGNATURE, NONCE_REPLAY
Doğrulama400Gövde düzeltilerekEksik alan, geçersiz para birimi
İş kuralı400 / 409Koşul değişirseYetersiz bakiye, limit dolu
Kapı reddi403Koşul değişirseKYC seviyesi yetersiz, yetenek kapalı
Entegrasyon / dış sistem502 / 504DikkatliBanka entegrasyonu yanıtsız
Sunucu500Idempotency anahtarıylaBeklenmeyen hata

Kimlik doğrulama hataları

s2s imza yüzeyinin hata kodları ve çözümleri Kimlik Doğrulama sayfasındadır: AUTH_HEADERS_MISSING, INVALID_DATE, NONCE_REPLAY, INVALID_KID, MERCHANT_SUSPENDED, IP_NOT_ALLOWED, DIGEST_MISSING, INVALID_DIGEST, INVALID_SIGNATURE. İmzadan sonra iki 403 reddi daha gelebilir: PRODUCT_NOT_ENABLED ve WALLET_INSUFFICIENT_SCOPE.

Fail-closed ne demek

Cüzdan, para yolunda belirsizliği reddeder:

⚠️

Bir kapı (limit, KYC, risk, sağlayıcı) cevap veremiyorsa işlem reddedilir. Doğrulanamayan bir kontrolün işleme izin vermesi, hiçbir para hareketinde geçerli bir davranış değildir.

Pratik sonuçları:

  • Limit servisi yanıt vermiyorsa çıkış işlemi reddedilir.
  • Kart otorizasyonunda limit yanıtı kısa bir son tarih içinde gelmezse otorizasyon reddedilir.
  • Bağlı sağlayıcısı olmayan entegrasyonlar program yapılandırmasıyla kapalıdır; kapalı bir entegrasyonu çağırmak reddedilir (Yol Haritası).

Tek istisna, platform tabanında olmayan ve KYC eşiği hiç tanımlanmamış operasyon tipleridir: o kapı devreye girmez. Transfer, çekim, nakit ve kart işlemleri platform tabanındadır; kimliği doğrulanmamış kullanıcı için her programda reddedilir. Bkz. KYC Seviyeleri.

Yeniden deneme kuralları

⚠️

Aynı Idempotency-Key ile yeniden deneyin. Anahtarı değiştirerek yeniden denemek, ilk isteğiniz aslında başarılı olmuşsa ikinci bir para hareketi yaratır.

DurumYapılacak
Ağ hatası / zaman aşımı aldınızAynı anahtarla tekrar deneyin; sonuç aynı yanıt olarak döner
500 aldınızAynı anahtarla tekrar deneyin
AWAITING_RECON gördünüzDenemeyin; mutabakatı bekleyin
HELD gördünüzDenemeyin; inceleme sonucunu bekleyin
INDETERMINATE gördünüzYeni anahtarla denemeyin; operasyonu sorgulayın ya da aynı anahtarla tekrarlayın — kısa süre içinde kesinleşir
complete hata verdiYeni nonce ile değil — operasyonu sorgulayın

Belirsiz sonuç: INDETERMINATE

Bir para işleminin sonucu o an kesinleştirilemiyorsa (ör. defter kaydı onaylandı mı bilinmiyorsa) cüzdan bunu bir hata olarak değil, status: "INDETERMINATE" olarak bildirir. Anlamı: para hareket etmiş olabilir, son durum henüz yazılmamıştır. Cüzdan işlemi kendiliğinden kesinleştirir (COMPLETED, FAILED ya da REVERSED).

⚠️

INDETERMINATE bir ret değildir. Bu sonuca telafi ile (yeniden tahsilat, başka bir yöntemle ödeme, karta iade) karşılık vermek çift para hareketi yaratabilir. Doğru davranış beklemek ve sorgulamaktır.

Bu sonucu döndüren uçlar: cüzdanla ödeme onayı (Cüzdanla Ödeme) ve temsilci ile yükleme (Bakiye Yükleme).

Operasyon üzerindeki hata alanları

Başarısız bir operasyon, hatayı iki alanda taşır:

Alanİçerik
failureCodeMakine tarafından okunabilir kod
failureReasonİnsan tarafından okunabilir açıklama

Kullanıcıya failureReason'ı ham hâliyle göstermeyin; kendi ürün diline çevirin. Destek ekibinize failureCode'u gösterin.

Dil

Hata mesajları Accept-Language header'ına göre döner (varsayılan Türkçe).

-H "Accept-Language: en"

Son kullanıcı uygulamanızda kullanıcının dilini bu header ile taşıyın; OTP mesajlarının dili ise istek gövdesindeki locale alanıyla belirlenir. İkisi ayrı ayarlardır.

Kullanıcıya hata gösterme

Teknik durumKullanıcıya ne denmeli
Yetersiz bakiye"Bakiyeniz yetersiz" + gereken tutarı gösterin (requiredAmount)
Limit doluHangi limit, ne zaman yenilenecek
KYC yetersizHangi seviye gerekli ve nasıl yükseltilir
HELD"İşleminiz kontrol ediliyor" — "başarısız" demeyin
AWAITING_RECON"İşleminiz doğrulanıyor" — "başarısız" demeyin
INDETERMINATE"İşleminiz doğrulanıyor" — "başarısız" demeyin, başka ödeme yöntemi önermeyin
Entegrasyon hatası"Şu anda tamamlanamadı, tekrar deneyin"
⚠️

Belirsiz durumlara "başarısız" demek, kullanıcının yeniden denemesine ve çifte işleme yol açar. Bu, cüzdan entegrasyonlarında en pahalı arayüz hatasıdır.

Yapılandırılmış details taşıyan hatalar

Bazı hatalar salt metin değildir: details altında makine tarafından okunabilir bir kırılım taşırlar. Bunları metinden ayrıştırmayın.

Program arşivleme (409)

KodAnlamı
WALLET_PROGRAM_ARCHIVE_BLOCKED_BALANCEProgramda bakiyesi olan hesaplar var — bakiyeyi boşaltın
WALLET_PROGRAM_ARCHIVE_BLOCKED_IN_FLIGHTUçuşta para var — kuyruğu kapatın
WALLET_PROGRAM_ARCHIVE_UNVERIFIABLEBakiyeler satır içi doğrulanamadı; platform prosedürü gerekir

..._IN_FLIGHT hatası details.inFlightByAxis (eksen → sayı), details.capped, details.probeCap ve eksen başına details.axes[] taşır. Dört eksen: OPERATION, CASHOUT_CODE, CARD_AUTHORIZATION, BULK_PAYOUT_BATCH.

⚠️

Sayım probeCap (500) değerinde kırpılır. capped: true olan bir eksenin sayısı "500+" olarak gösterilmelidir; kırpma bilgisi eksen başınadır (axes[].capped). İlk iki kod farklı kullanıcı mesajı ister — "bakiyeyi boşalt" ile "kuyruğu kapat" aynı iş değildir. Ayrıntı: Panel — Programlar.

Toplu içe aktarma / ayırma (422)

WALLET_BULK_IMPORT_REJECTED ve WALLET_BULK_OFFBOARD_REJECTED, satır satır raporu details altında taşır. Hiçbir satır yazılmamıştır. Bkz. Kurumsal Hesaplar.

Limit denominasyon uyuşmazlığı

WALLET_LIMIT_CURRENCY_MISMATCH — limit satırının tutar tavanları işlem para biriminden farklı bir para biriminde tanımlıdır. Kur çevirisi yapılmaz; tavan dürüstçe karşılaştırılamadığı için işlem reddedilir. Çözüm operatördedir: ilgili para birimi için bir limit satırı ekleyin. Bkz. Limitler.

Ürün yetkisi (PRODUCT_NOT_ENABLED)

Cüzdan API'si ürün kapılı bir yüzeydir: imzanız geçerli olsa bile, kimliğiniz cüzdan ürününe (WALLET_SERVICE) yetkili değilse hiçbir uç açılmaz — okuma uçları dahil.

KodHTTPAnlamıNe yapmalı
PRODUCT_NOT_ENABLED403Kimlik cüzdan ürününe yetkili değilAboneliğinizi ve API anahtarınızın ürün listesini kontrol edin
PRODUCT_ENTITLEMENT_UNAVAILABLE503Yetki doğrulanamadı (kaynak erişilemez)Üstel geri çekilmeyle yeniden deneyin
⚠️

İkisini karıştırmayın. PRODUCT_NOT_ENABLED kalıcı bir rettir: hesabınızda bir şey değişmeden yeniden denemek aynı sonucu verir. PRODUCT_ENTITLEMENT_UNAVAILABLE geçicidir ve "ürününüz yok" demez — "şu anda doğrulayamıyoruz" der. Kapı fail-closed olduğu için doğrulanamayan yetkiyle işlem geçirilmez.

PRODUCT_NOT_ENABLED alıyorsanız iki koşulun ikisi birden gerekir:

  1. Organizasyonunuzun cüzdan ürününe aktif aboneliği olmalı
  2. Çağrıda kullandığınız API anahtarının ürün listesinde WALLET_SERVICE yazmalı

Aboneliğiniz varken bu hatayı alıyorsanız neredeyse her zaman ikincisi eksiktir: API anahtarı bilinçli bir daraltmadır ve abonelik açıldığında mevcut anahtarlarınız kendiliğinden genişlemez. Ayrıntı: Hata Yönetimi.

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.

Anahtar izni (WALLET_INSUFFICIENT_SCOPE)

Ürün yetkisinin yanında her cüzdan çağrısı, API anahtarında belirli bir izin ister — örneğin cüzdan içi para hareketi için wallet:operation:intervene, IBAN'a ya da banka hesabına para göndermek için wallet:bank-payout:operate. Denetim fail-closed çalışır: çağrı için gereken izni taşımayan anahtar reddedilir ve hiçbir işlem yürütülmez.

KodHTTPAnlamıNe yapmalı
WALLET_INSUFFICIENT_SCOPE403Anahtarda bu çağrı için gereken cüzdan izni yokKimlik Doğrulama sayfasında listelenen izni anahtara verin, ardından yeniden deneyin
{
  "status": "failure",
  "code": "WALLET_INSUFFICIENT_SCOPE",
  "message": "…",
  "statusCode": 403,
  "requestId": "…"
}

Tüm cüzdan uçlarını kapatan PRODUCT_NOT_ENABLED'dan farklı olarak bu hata yalnız anahtarın yetkili olmadığı çağrıları etkiler — aynı anahtar bakiye okuyabilirken bir transfer reddedilebilir. Anahtarın izinleri değişmeden yeniden denemek aynı sonucu verir.

Yaygın hatalar

DurumSebepÇözüm
Yeniden denemede çift işlemAnahtar her denemede değiştiAnahtarı iş anlamına bağlayın
Tüm istekler 401Sunucu saati kaymışNTP ile senkronize edin
Bazı uçlar 403 (WALLET_INSUFFICIENT_SCOPE)Anahtarda o çağrılar için gereken izin yokİzni ekleyin → Anahtar izni
Tüm uçlar 403 (PRODUCT_NOT_ENABLED)Kimlik cüzdan ürününe yetkili değilAbonelik + anahtarın ürün listesi → Ürün yetkisi
Mesajlar İngilizce geliyorAccept-Language gönderilmemişHeader'ı ekleyin