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ıf | HTTP | Yeniden denenir mi | Örnek |
|---|---|---|---|
| Kimlik doğrulama | 401 / 403 | Düzelttikten sonra | INVALID_SIGNATURE, NONCE_REPLAY |
| Doğrulama | 400 | Gövde düzeltilerek | Eksik alan, geçersiz para birimi |
| İş kuralı | 400 / 409 | Koşul değişirse | Yetersiz bakiye, limit dolu |
| Kapı reddi | 403 | Koşul değişirse | KYC seviyesi yetersiz, yetenek kapalı |
| Entegrasyon / dış sistem | 502 / 504 | Dikkatli | Banka entegrasyonu yanıtsız |
| Sunucu | 500 | Idempotency anahtarıyla | Beklenmeyen 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.
| Durum | Yapılacak |
|---|---|
| Ağ hatası / zaman aşımı aldınız | Aynı anahtarla tekrar deneyin; sonuç aynı yanıt olarak döner |
500 aldınız | Aynı anahtarla tekrar deneyin |
AWAITING_RECON gördünüz | Denemeyin; mutabakatı bekleyin |
HELD gördünüz | Denemeyin; inceleme sonucunu bekleyin |
INDETERMINATE gördünüz | Yeni anahtarla denemeyin; operasyonu sorgulayın ya da aynı anahtarla tekrarlayın — kısa süre içinde kesinleşir |
complete hata verdi | Yeni 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 |
|---|---|
failureCode | Makine 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 durum | Kullanıcıya ne denmeli |
|---|---|
| Yetersiz bakiye | "Bakiyeniz yetersiz" + gereken tutarı gösterin (requiredAmount) |
| Limit dolu | Hangi limit, ne zaman yenilenecek |
| KYC yetersiz | Hangi 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)
| Kod | Anlamı |
|---|---|
WALLET_PROGRAM_ARCHIVE_BLOCKED_BALANCE | Programda bakiyesi olan hesaplar var — bakiyeyi boşaltın |
WALLET_PROGRAM_ARCHIVE_BLOCKED_IN_FLIGHT | Uçuşta para var — kuyruğu kapatın |
WALLET_PROGRAM_ARCHIVE_UNVERIFIABLE | Bakiyeler 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.
| Kod | HTTP | Anlamı | Ne yapmalı |
|---|---|---|---|
PRODUCT_NOT_ENABLED | 403 | Kimlik cüzdan ürününe yetkili değil | Aboneliğinizi ve API anahtarınızın ürün listesini kontrol edin |
PRODUCT_ENTITLEMENT_UNAVAILABLE | 503 | Yetki 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:
- Organizasyonunuzun cüzdan ürününe aktif aboneliği olmalı
- Çağrıda kullandığınız API anahtarının ürün listesinde
WALLET_SERVICEyazmalı
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.
| Kod | HTTP | Anlamı | Ne yapmalı |
|---|---|---|---|
WALLET_INSUFFICIENT_SCOPE | 403 | Anahtarda bu çağrı için gereken cüzdan izni yok | Kimlik 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
| Durum | Sebep | Çözüm |
|---|---|---|
| Yeniden denemede çift işlem | Anahtar her denemede değişti | Anahtarı iş anlamına bağlayın |
| Tüm istekler 401 | Sunucu 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ğil | Abonelik + anahtarın ürün listesi → Ürün yetkisi |
| Mesajlar İngilizce geliyor | Accept-Language gönderilmemiş | Header'ı ekleyin |