Mağazamhazır Ödeme
API referansı
Tüm Türk bankalarında tek entegrasyonla kart ödemesi almak için ihtiyacınız olan her şey.
Giriş
Mağazamhazır Ödeme, sağlayıcıdan bağımsız bir kart ağ geçididir. Tek bir REST uç nokta kümesi çağırırsınız; her üye işyerinin tanımlı bankası ödemeyi yürütür. API her banka için aynıdır — bankaya özel kod yazmazsınız.
Makine tarafından okunabilir şema: GET /api/v1/openapi.json — Postman/Insomnia'ya aktarılabilir (OpenAPI 3.1).
Mutabakat nasıl işler
Anlaşılması gereken en önemli şey: para asla bizim değildir. Mağazamhazır Ödeme yalnızca provizyonu yönetir; tutar doğrudan kendi bankanızda hesabınıza geçer.
- ·Her ödeme SİZİN bankanızın sanal POS terminalinde çekilir; böylece bankanızın normal mutabakat döngüsünde SİZİN üye işyeri hesabınıza geçer — tıpkı bankayı doğrudan entegre etmiş gibi.
- ·Paranızı asla tutmaz, havuzda toplamaz veya bir platform hesabından geçirmeyiz. Ödeme adımı, çekilecek bir bakiye veya işlem tutarından platform payı yoktur.
- ·Bankanızın size verdiği sanal POS bilgilerini panele bir kez girersiniz. O andan itibaren canlı ödemeleriniz doğrudan bankanıza akar.
- ·Paneldeki Mutabakat görünümü, banka ve gün bazında çekilen ve iade edilen tutarların bir raporudur — bizim yaptığımız bir ödeme (payout) değildir.
Temel URL ve ortamlar
Tüm uç noktalar /api altındadır. Sandbox ve canlı, ana bilgisayara göre değil API anahtarı önekinize göre seçilir — sk_test_… banka sandbox'ına, sk_live_… canlıya yönlenir.
| Sandbox | Canlı | |
|---|---|---|
| Temel URL | https://pay.magazamhazir.com/api | https://pay.magazamhazir.com/api |
| Anahtar öneki | pk_test_ / sk_test_ | pk_live_ / sk_live_ |
| Tutarlar | alt birim (kuruş) | alt birim (kuruş) |
| Para birimleri | TRY · USD · EUR · GBP | TRY · USD · EUR · GBP |
Sandbox ortamı ödeme altyapısı tarafından işletilir. sk_test_ anahtarlarınız bizim ortak banka test terminallerimizi kullanır — yapılandırmanız gereken bir şey yok, bankayla anlaşmanıza da gerek yok. Kendi bilgileriniz yalnızca canlı ortam içindir.
{
"id": "pay_2c7d8e…",
"status": "captured",
"provider": "isbank",
"simulated": true,
"simulatedReason": "NO_SANDBOX_CREDENTIALS"
}- ·Her ödeme yanıtı `simulated` alanı taşır. İstek gerçek bir bankaya ulaştığında false olur.
- ·Sandbox erişimimiz olan bankalarda sk_test_ trafiği bankanın kendi test adresine gider — bizim değil, o bankanın test kartlarını kullanın.
- ·Henüz sandbox erişimimiz olmayan bir banka için altyapı sonucu simüle eder ve `simulated: true` ile bir `simulatedReason` döner. Yanıt yapısı birebir aynıdır; banka gerçek sandbox'a geçtiğinde entegrasyonunuz değişmez.
- ·Bize ait `7433` test kartları, gerçek sandbox'ı olan bir bankada bile her zaman simülatör tarafından yanıtlanır (`simulated: true`, sebep `MHPAY_TEST_CARD`) — böylece senaryo kartları her yerde çalışır. Gerçek sandbox'lı bir bankada başka herhangi bir kart bankaya ulaşır.
- ·Canlı ödemeler asla simüle edilmez — sk_live_ trafiğinde `simulated` her zaman false'tur.
Kimlik doğrulama
Her istek MHPAYv1 ile imzalanır — zaman damgası, isteğe özel rastgele anahtar, istek yolu ve ham gövde üzerinde HMAC-SHA256. Bunu x-mhpay-timestamp ile birlikte Authorization başlığında gönderin.
Authorization: MHPAYv1 base64("apiKey:<pk>&randomKey:<rnd>&signature:<hex>")
x-mhpay-timestamp: <unix seconds>
signature = HMAC-SHA256(secret, `${timestamp}.${randomKey}.${path}.${rawBody}`)- ·path includes the query string (e.g. /api/v1/payments?limit=50).
- ·rawBody is the exact bytes you send (empty string for GET).
- ·randomKey is fresh per request; the server accepts a ±300s window.
import { createHmac, randomBytes } from 'crypto';
function mhpayHeaders(pk, secret, path, body) {
const timestamp = Math.floor(Date.now() / 1000).toString();
const randomKey = randomBytes(12).toString('hex');
const signature = createHmac('sha256', secret)
.update(`${timestamp}.${randomKey}.${path}.${body}`)
.digest('hex');
const raw = `apiKey:${pk}&randomKey:${randomKey}&signature:${signature}`;
return {
Authorization: `MHPAYv1 ${Buffer.from(raw).toString('base64')}`,
'x-mhpay-timestamp': timestamp,
'Content-Type': 'application/json',
};
}Idempotency
Para hareketi içeren her POST'ta bir Idempotency-Key gönderin. Aynı anahtarı aynı gövdeyle yeniden denemek saklanan yanıtı tekrar döndürür; farklı gövdeyle kullanmak 409 döndürür.
POST /api/v1/payments Idempotency-Key: 6f1c9e2a-6d5b-4f0e-9b1a-2c7d8e9f0a1b
Hatalar
Hatalar bir HTTP durumu ve makine tarafından okunabilir bir kod içeren sabit bir zarf döndürür. Kod sürümler arasında değişmez, bu yüzden mesaja değil koda göre dallanın.
{
"statusCode": 402,
"code": "PAYMENT_DECLINED",
"message": "PAYMENT_DECLINED",
"details": []
}| HTTP | Kod | Ne zaman |
|---|---|---|
| 400 | COMMON_VALIDATION_FAILED | Bir alan doğrulamadan geçemedi (details[] alanına bakın). |
| 401 | AUTH_INVALID_SIGNATURE | Hatalı imza, eksik başlıklar veya süresi geçmiş zaman damgası. |
| 402 | PAYMENT_DECLINED | Banka kartı reddetti. |
| 404 | PAYMENT_NOT_FOUND | Bu üye işyeri için böyle bir ödeme / oturum yok. |
| 409 | IDEMPOTENCY_KEY_CONFLICT | Aynı Idempotency-Key farklı bir gövdeyle yeniden kullanıldı. |
| 409 | ORDER_ID_ALREADY_USED | Bu orderId için başarısız olmamış bir ödeme var — her deneme için yeni bir orderId gönderin (ör. order-1024A02). |
| 422 | REFUND_EXCEEDS_REMAINING | İade tutarı, kalan tahsil edilmiş tutardan büyük. |
| 422 | PAYMENT_INVALID_STATE | Bu işlem ödemenin mevcut durumunda yapılamaz. |
| 501 | PROVIDER_TOKENIZATION_UNSUPPORTED | Bu bankanın kart kasası yok (/v1/cards). |
| 502 | PAYMENT_OUTCOME_UNKNOWN | Banka zamanında yanıt vermedi. Bu bir red DEĞİLDİR — çekim yapılmış olabilir: GET /v1/payments/:id ile yeniden okuyun (meta.paymentId) ve asla körlemesine yeniden denemeyin. |
Barındırılan ödeme
En düşük PCI yolu. Bir oturum oluşturun, alışveriş yapanı barındırdığımız sayfaya yönlendirin ve callback adresinize dönsünler. Kart verisi sunucularınıza dokunmaz. 3-D Secure'ı otomatik çalıştırmak için use3ds ayarlayın.
/api/v1/checkout/sessions{
"amount": 15000,
"currency": "TRY",
"orderId": "order-1024",
"callbackUrl": "https://store.example/checkout/return",
"returnUrl": "https://store.example/orders/1024",
"use3ds": true
}{
"token": "cs_9f2a7b…",
"url": "https://pay.magazamhazir.com/pay/cs_9f2a7b…",
"expiresAt": "2026-07-19T18:40:00.000Z"
}- 1Oturumu oluşturun (imzalı, sunucu tarafında).
- 2Alışveriş yapanı
urladresine yönlendirin. Sayfa ödeme alıcısını — üye işyeri adınızı — gösterir ve kartı alır. - 3Banka yanıt verdiğinde onu
callbackUrl?paymentId=…&status=…adresine (3-D Secure sonrasında ek olaraksignatureile) gönderir ve bir webhook tetikleriz.
- ·
statusdeğerisuccess(tahsil edildi),failedya dapendingolur: pending, bankanın yanıtının henüz doğrulanamadığı anlamına gelir. pending’i ÖDENMEMİŞ sayın ve üzerine yeniden deneme önermeyin; her sonucu yalnızca URL’ye değil, webhook’a veya GET /v1/payments/:id yanıtına göre kesinleştirin. - ·
returnUrl(isteğe bağlı) alışveriş yapanın geri dönüş yoludur: sipariş sayfanız — sunucunuzun dönüş rotası olancallbackUrldeğil. Barındırılan sayfa bunu her son durumda (kullanılmış, süresi dolmuş veya ödenmiş bağlantıda) “Mağazaya dön” olarak gösterir. Kimlik bilgisi içermeyen http veya https, en fazla 2048 karakter; canlı anahtar https ister, aksi haldedetails[].constrainthttps_required_in_liveile400 COMMON_VALIDATION_FAILEDdöner.
Oluştur ve yönlendir
curl -X POST https://pay.magazamhazir.com/api/v1/checkout/sessions \
-H "Authorization: MHPAYv1 <base64(apiKey:<pk>&randomKey:<rnd>&signature:<hex>)>" \
-H "x-mhpay-timestamp: 1721400000" \
-H "Content-Type: application/json" \
-d '{"amount":15000,"currency":"TRY","orderId":"order-1024","callbackUrl":"https://store.example/checkout/return","returnUrl":"https://store.example/orders/1024","use3ds":true}'
# → { "token":"cs_9f2a7b…","url":"https://pay.magazamhazir.com/pay/cs_9f2a7b…","expiresAt":"…" }
# Redirect the shopper to url; they come back to callbackUrl?paymentId=…&status=…Ödeme oturumu API'si
Barındırılan /pay sayfasının bir oturumu okumak ve kartını göndermek için kullandığı iki token kapsamlı uç nokta. İkisi de genellikle sizin tarafınızdan değil, o sayfa tarafından çağrılır — oturumu sunucu tarafında siz oluşturursunuz (bkz. Barındırılan ödeme).
/api/v1/checkout/sessions/:tokenherkese açık · kimlik doğrulaması yok/api/v1/checkout/sessions/:token/payherkese açık · kimlik doğrulaması yok{
"token": "cs_9f2a7b…",
"amount": 15000,
"currency": "TRY",
"orderId": "order-1024",
"status": "open",
"installmentsAllowed": [1, 3, 6],
"expiresAt": "2026-07-19T18:40:00.000Z",
"mode": "live",
"simulated": false,
"merchantName": "Kafe Kuruş",
"returnUrl": "https://store.example/orders/1024"
}Bir token ve barındırılan /pay/:token URL'sini döndüren POST /v1/checkout/sessions ile bir oturum oluşturun. GET, sayfanın gösterdiklerini döndürür — tutar, para birimi, orderId, durum, ödeme alıcısı (merchantName) ve geri dönüş yolu (returnUrl); POST …/pay ise ödemeyi çalıştırmak için alışveriş yapanın kartını gönderir ve 3-D Secure geçidini (threeDSHtmlContent) veya üye işyeri yönlendirmesini döndürür.
HTTP/1.1 409 Conflict
{
"statusCode": 409,
"code": "CHECKOUT_SESSION_CONSUMED",
"message": "CHECKOUT_SESSION_CONSUMED",
"meta": {
"merchantName": "Kafe Kuruş",
"returnUrl": "https://store.example/orders/1024",
"paymentState": "threeds_pending"
}
}Bir oturum tek kullanımlıktır. Kullanılmış, süresi dolmuş veya engellenmiş bir oturum — GET, …/pay ve …/installments çağrılarında aynı şekilde — 409 CHECKOUT_SESSION_CONSUMED, 410 CHECKOUT_SESSION_EXPIRED veya 403 CHECKOUT_MERCHANT_UNAVAILABLE (üye işyeri artık canlı ödeme alamayan canlı oturum) döner; yanıtta meta.merchantName, meta.returnUrl ve bağlı ödemenin durumu ya da null olan meta.paymentState bulunur. Kullanılmış oturum ödenmiş oturum değildir: yalnızca paymentState captured olduğunda “ödendi” gösterin, çünkü yarım kalan veya başarısız bir 3-D Secure da oturumu kullanır. 404 CHECKOUT_SESSION_NOT_FOUND meta taşımaz.
Taksit
Ödeme sırasında taksit planları sunun. Bir kartın BIN'i için uygun planları sorgulayın, ardından ödemeyi alırken seçilen taksit sayısını gönderin. Yalnızca Türk Lirası — taksit USD, EUR veya GBP için geçerli değildir.
/api/v1/installments?bin=<6-8 digits>&amount=<minor>/api/v1/checkout/sessions/:token/installments?bin=<6-8 digits>herkese açık · kimlik doğrulaması yokcurl "https://pay.magazamhazir.com/api/v1/checkout/sessions/cs_9f2a7b…/installments?bin=454671"
{
"provider": "garanti",
"family": "bonus",
"options": [
{ "count": 1, "perInstallmentMinor": 12000, "totalMinor": 12000, "rateBps": 0, "surchargeMinor": 0 },
{ "count": 3, "perInstallmentMinor": 4180, "totalMinor": 12540, "rateBps": 450, "surchargeMinor": 540 },
{ "count": 6, "perInstallmentMinor": 2180, "totalMinor": 13080, "rateBps": 900, "surchargeMinor": 1080 }
]
}Her iki uç nokta da aynı şekli döndürür: provider, isteğe bağlı bir family (kartın taksit programı — bonus, world, axess, maximum, cardfinans, paraf, bankkart veya saglam) ve her biri count, taksit başına tutar ve minör birim cinsinden genel toplam içeren options[]. count 1 (tek çekim) her zaman bulunur. Herkese açık ödeme varyantı, alışverişçi kartını yazarken barındırılan /pay sayfasının çağırdığıdır; imzalı /v1/installments varyantı ise kendi kart formunuz içindir. Sunulan sayıları sınırlamak için oturumu installmentsAllowed ile oluşturun (POST /v1/checkout/sessions) ve planı çalıştırmak için POST /v1/payments'a veya barındırılan pay'e installments gönderin — izin verilmeyen bir sayı 422 INSTALLMENTS_NOT_AVAILABLE döndürür.
Her seçenek ayrıca rateBps ve surchargeMinor taşır — üyenin o taksit sayısı için tanımladığı vade farkı. totalMinor bunu zaten içerir (örn. 450 bps ile 3× %4,50 ekler), bu yüzden perInstallmentMinor ve totalMinor değerlerini olduğu gibi gösterin. Bu yalnızca gösterim içindir: gerçek vade farkını banka hesap kesiminde uygular, dolayısıyla tahsil edilen tutar değişmez. Vade farkı tablosu olmayan bir üyede her sayıda rateBps 0 döner (vade farksız) ve TRY dışındaki para birimlerinde taksit hiç sunulmaz.
POST /api/v1/payments
{
"amount": 12000,
"currency": "TRY",
"orderId": "order-1024",
"installments": 3,
"card": { "number": "4111111111111111", "expireMonth": 12, "expireYear": 2030, "cvc": "123" }
}Politika: taksit yalnızca TRY içindir. Canlı rotalarda plan on-us'tur — kartın kendi çıkaran bankası, üye işyerinin entegre ettiği bir banka olmalıdır — ve sunulan sayılar o bankanın tanımlı azami değerinde sınırlanır. Sandbox esnektir: sahte sağlayıcı, planların gerçek bir kart olmadan test edilebilir kalması için üye işyerinin varsayılan hesap sınırını (veya oturumun installmentsAllowed izin listesini) kullanır.
PCI kapsamı ve barındırılan öncelikli yaklaşım
Entegrasyonunuzu taşımak istediğiniz PCI kapsamına göre seçin. Barındırılan ödeme birincil, önerilen yoldur; doğrudan kart API'si ise kendi PCI-DSS kapsamına sahip üye işyerleri içindir.
Barındırılan kart sayfası (/pay/[token]), kart formunu kilitli, katı CSP'li sayfamızda çalıştırır. Ham kart verisi sunucularınıza hiç dokunmaz, böylece PCI kapsamınız SAQ-A'da kalır. Her entegrasyona buradan başlayın.
Doğrudan sunucudan sunucuya kart API'si (/v1/payments) yalnızca kendi PCI-DSS (SAQ-D) kapsamını taşıyan üye işyerleri içindir; çünkü sistemleriniz ham PAN, son kullanma ve CVC'yi aktarımda işler.
Doğrudan ödemeler
Kart formunu siz yönetin ve kartı doğrudan gönderin. Bu SAQ-D kapsamıdır — ham kart verisini siz işlersiniz. Tutarlar her zaman tam sayı minör birimdir (kuruş / cent).
/api/v1/payments{
"amount": 12000,
"currency": "TRY",
"orderId": "order-1024",
"installments": 1,
"card": {
"number": "4111111111111111",
"expireMonth": 12,
"expireYear": 2030,
"cvc": "123",
"holderName": "Ayşe Yılmaz"
},
"buyer": { "email": "ayse@example.com", "ip": "88.255.1.1" }
}{
"id": "pay_2c7d8e…",
"status": "captured",
"flow": "sale",
"orderId": "order-1024",
"amount": 12000,
"capturedAmount": 12000,
"refundedAmount": 0,
"currency": "TRY",
"provider": "garanti",
"providerPaymentRef": "620008031419",
"simulated": false,
"simulatedReason": null,
"card": { "bin": "411111", "last4": "1111", "brand": "VISA" },
"errorCode": null,
"createdAt": "2026-07-19T18:32:10.000Z"
}İmzalı istek
curl -X POST https://pay.magazamhazir.com/api/v1/payments \
-H "Authorization: MHPAYv1 <base64(apiKey:<pk>&randomKey:<rnd>&signature:<hex>)>" \
-H "x-mhpay-timestamp: 1721400000" \
-H "Idempotency-Key: 6f1c9e2a-6d5b-4f0e-9b1a-2c7d8e9f0a1b" \
-H "Content-Type: application/json" \
-d '{"amount":12000,"currency":"TRY","orderId":"order-1024","installments":1,"card":{"number":"4111111111111111","expireMonth":12,"expireYear":2030,"cvc":"123"}}'3-D Secure
Otomatik gönderilen bir ACS formu almak için bir 3DS ödemesi başlatın. Onu gösterin; alışveriş yapan bankasıyla doğrular; banka sonucu ağ geçidine gönderir, o da tamamlayıp callbackUrl adresinize yönlendirir.
/api/v1/payments/3ds/initialize{
"amount": 12000,
"currency": "TRY",
"orderId": "order-1024",
"callbackUrl": "https://store.example/checkout/return",
"preAuth": false,
"card": { "number": "4111111111111111", "expireMonth": 12, "expireYear": 2030, "cvc": "123" }
}{
"paymentId": "pay_2c7d8e…",
"status": "threeds_pending",
"threeDSHtmlContent": "PGh0bWw+…(base64 gate page)",
"redirectUrl": null
}threeDSHtmlContent alanını — bankanın 3-D Secure geçit sayfasını — base64’ten çözüp alışveriş yapanın sayfası olarak sunun: sayfa onu bankasına gönderir. Yanıt bunun yerine bir redirectUrl taşıyorsa alışveriş yapanı oraya yönlendirin. Banka sonucu ağ geçidine gönderir; ağ geçidi ödemeyi tamamlayıp callbackUrl adresinize yönlendirir. Geçit sayfası bankanın ihtiyaç duyduğu kart verisini taşır: asla loglamayın veya saklamayın, alışveriş yapanın tarayıcısından başka hiçbir yere göndermeyin.
Yönlendirme paymentId, status ve signature taşır. status; success (tahsil edildi ya da ön provizyonda authorized), failed veya pending olur: pending, bankanın dönüşünün henüz doğrulanamadığı ya da karara bağlanamadığı anlamına gelir — para hareket etmiş olabilir. pending’i ÖDENMEMİŞ sayın, üzerine yeniden deneme önermeyin ve kesinleşene kadar GET /v1/payments/:id ile yeniden okuyun; ağ geçidi operatörü durumu banka panelinden kesinleştirir ve ilgili webhook gönderilir.
Tahsil etmek yerine provizyon tutmak için preAuth: true gönderin. Ödeme authorized olarak tamamlanır (webhook payment.authorized), callbackUrl adresiniz yine status=success alır ve tutarı daha sonra /capture ile tahsil edersiniz — 3DS’siz ön provizyon akışıyla tamamen aynı.
Başlatma ve geri çağırma akışı
# 1. Initialize — returns the base64 gate page
curl -X POST https://pay.magazamhazir.com/api/v1/payments/3ds/initialize \
-H "Authorization: MHPAYv1 <base64(apiKey:<pk>&randomKey:<rnd>&signature:<hex>)>" \
-H "x-mhpay-timestamp: 1721400000" \
-H "Content-Type: application/json" \
-d '{"amount":12000,"currency":"TRY","orderId":"order-1024","callbackUrl":"https://store.example/checkout/return","card":{"number":"4111111111111111","expireMonth":12,"expireYear":2030,"cvc":"123"}}'
# → { "paymentId":"pay_…","status":"threeds_pending","threeDSHtmlContent":"PGh0bWw+…" }
# 2. Base64-decode threeDSHtmlContent and serve it as the shopper's page — it
# posts them to their bank. The bank posts back to the gateway, which redirects to:
# https://store.example/checkout/return?paymentId=pay_…&status=success&signature=…
# (status: success | failed | pending — pending is NOT paid: re-read the payment)İade, iptal ve geri alma
Tahsil edilmiş bir ödemeyi iade edin (tam veya kısmi), aynı gün satışını iptal edin, ön provizyonu tahsil edin veya provizyon bloğunu geri alın. Hepsi idempotenttir ve orijinal bankaya yönlendirilir.
/api/v1/payments/:id/refunds{ "amount": 4000, "reason": "customer request" }/api/v1/payments/:id/capturecapture a pre-auth · { amount? }/api/v1/payments/:id/cancelsame-day void/api/v1/payments/:id/reversereverse an auth holdÖn provizyon
Tahsil etmeden fonları bloke edin. POST /v1/payments ile aynı gövdeyi alır, ancak ödeme tahsil edilmiş yerine yetkilendirilmiş olarak sonuçlanır — daha sonra tahsil edersiniz.
/api/v1/payments/preauth{
"amount": 12000,
"currency": "TRY",
"orderId": "order-1024",
"card": { "number": "4111111111111111", "expireMonth": 12, "expireYear": 2030, "cvc": "123" }
}{
"id": "pay_2c7d8e…",
"status": "authorized",
"flow": "preauth",
"amount": 12000,
"capturedAmount": 0,
"refundedAmount": 0,
"currency": "TRY",
"provider": "garanti",
"createdAt": "2026-07-19T18:32:10.000Z"
}Yetenek bazlı: provizyon bloğu olmayan bankalar (ör. bir katılım bankası olan Kuveyt Türk) 501 PROVIDER_PREAUTH_UNSUPPORTED yanıtı verir. Sunmadan önce GET /v1/capabilities içindeki preAuth alanını kontrol edin. 3-D Secure bloğu için bunun yerine POST /v1/payments/3ds/initialize isteğine "preAuth": true gönderin.
Ön provizyon → tahsilat
Yetkilendirilmiş bir ödemeyi kapatın. Tahsilat varsayılan olarak bloke edilen tutarın tamamını, kısmi tahsilat için ise daha küçük bir tutarı alır. Bir bloğu tahsil etmek yerine serbest bırakmak için iptal edin.
/api/v1/payments/:id/capture{ amount? }/api/v1/payments/:id/cancelvoid an auth hold/api/v1/payments/:id/reversereverse an auth holdPOST /api/v1/payments/pay_2c7d8e…/capture
{ "amount": 8000 }capture bloğu kapatır ve payment.captured yayar; tam yetkilendirmeyi almak için amount alanını atlayın. cancel aynı gün yetkilendirmesini iptal eder, reverse ise provizyon bloğunu serbest bırakır (payment.cancelled / payment.reversed). Hepsi idempotenttir ve orijinal bankaya yönlendirilir.
Sorgulama ve listeleme
Tek bir ödemeyi id ile getirin veya bir üye işyerinin ödemelerini filtrelerle listeleyin. Ödeme nesnesi, her yazma uç noktasının döndürdüğü şekildir.
/api/v1/payments/:id/api/v1/payments/:id?sync=truealso ask the bank for its status/api/v1/payments?status=captured&orderId=order-1024&limit=50&offset=0{
"id": "pay_2c7d8e…",
"status": "captured",
"providerSync": {
"supported": true,
"providerStatus": "captured",
"providerPaymentRef": "0210600150160001"
}
}?sync=true additionally queries the acquiring bank. Banks without an inquiry service return providerSync.supported: false — the endpoint's shape never changes with the bank. It is read-only: status always reflects the gateway's own record and is never overwritten by the bank's answer.
Yetenekler
Farklı bankalar farklı özellikleri destekler. Aktif sağlayıcının neler yapabildiğini keşfedin ve arayüzünüzü bankanın adına göre değil yeteneklere göre uyarlayın.
/api/v1/capabilities/meGeliştirmeye başlamadan önce bunu kontrol edin. Her banka her özelliği sunmaz ve uç noktalar bankaya göre çoğaltılmaz, ortaktır: bir bankada bir özellik yoksa aynı rota farklı davranmak yerine 501 döner. tokenization false ise kayıtlı kartlar PROVIDER_TOKENIZATION_UNSUPPORTED, preAuth false ise /payments/preauth PROVIDER_PREAUTH_UNSUPPORTED döner (bir katılım bankası olan Kuveyt Türk’te provizyon bloğu yoktur). Aynı çağrı anahtarın kime ait olduğunu ve şu anda CANLI ödeme alınıp alınamayacağını da söyler. Salt okunurdur; bu yüzden canlı erişim kapalıyken bile canlı anahtar yanıt alır.
{
"provider": "isbank",
"capabilities": { "threeDS": true, "preAuth": true, "tokenization": false, "installments": true, "inquiry": true },
"sandbox": { "simulated": false, "sharedTerminal": true, "verified": true, "verifiedAt": "2026-07-21T01:37:11.036Z" },
"defaultProvider": "isbank",
"enabledProviders": [
{ "name": "isbank", "capabilities": { "threeDS": true, … }, "sandbox": { "simulated": false, … } }
],
"merchantId": "6f1c9e2a-6d5b-4f0e-9b1a-2c7d8e9f0a1b",
"mode": "live",
"liveEnabled": true,
"liveReady": false,
"liveBlockers": ["LIVE_ACCOUNT_INCOMPLETE"]
}| Alan | Anlamı |
|---|---|
| merchantId | anahtarın ait olduğu üye işyeri |
| mode | çağıran anahtarın modu: sk_test_… → sandbox, sk_live_… → live |
| defaultProvider | varsayılan banka — BIN yönlendirmesi on-us eşleşme bulamadığında ödemeyi o yürütür |
| enabledProviders | üye işyerinin entegre ettiği her banka; her biri yetenekleri ve sandbox durumuyla |
| liveEnabled | operatör bu üye işyeri için canlı ödemeyi onayladı |
| liveReady | şu anda CANLI ödeme alınabilir: canlı onaylı, üye işyeri aktif, varsayılan banka bu ağ geçidinde canlıya açık ve bu banka için gerekli tüm kimlik alanları dolu, aktif bir canlı hesap var |
| liveBlockers | hâlâ kapalı olan her kapı (liveReady true ise boş) |
| Engel | Anlamı |
|---|---|
| LIVE_NOT_ENABLED | operatör canlı ödemeyi henüz onaylamadı |
| MERCHANT_SUSPENDED | üye işyeri askıya alınmış |
| DEFAULT_BANK_NOT_LIVE | varsayılan banka bu ağ geçidinde canlı ödemeye açık değil |
| NO_ACTIVE_LIVE_ACCOUNT | varsayılan banka için aktif canlı hesap (banka kimlik bilgileri) yok |
| LIVE_ACCOUNT_INCOMPLETE | canlı hesapta gerekli bir kimlik alanı eksik |
Kayıtlı kartlar
Bir kartı bir kez tokenleştirip daha sonra tekrar tahsil edin. Yetenek bazlı: yalnızca kart kasası olan bankalar (ör. Akbank) bunları destekler; diğerleri 501 PROVIDER_TOKENIZATION_UNSUPPORTED yanıtı verir. Önce GET /v1/capabilities içindeki tokenization alanını kontrol edin.
/api/v1/cardstokenleştir · token referansları + bin/last4 döndürür/api/v1/cardskayıtlı kartları listele (maskeli)/api/v1/cards/:idkayıtlı bir kartı sil{
"id": "card_7a1f…",
"cardUserKey": "cuk_1a2b…",
"cardToken": "ctok_9f8e…",
"bin": "552879",
"last4": "0008",
"brand": "MASTERCARD",
"expMonth": 12,
"expYear": 2030
}POST /api/v1/payments
{
"amount": 12000,
"currency": "TRY",
"orderId": "order-1025",
"token": { "cardUserKey": "cuk_1a2b…", "cardToken": "ctok_9f8e…" }
}Tokenleştirme, PAN'ı asla değil, opak token referansları ile bin ve last4 döndürür. Kayıtlı bir kartı, card yerine token'ını ödeme aracı olarak geçirerek tahsil edin. Bir token yalnızca onu üreten kasanın bankasında çalışır; bankalar arasında taşınabilir değildir.
Banka kataloğu
Bu ağ geçidinin şu anda yönlendirebileceği bankaları listeleyin. Herkese açık ve kimlik doğrulamasız — bir kapsama duvarı oluşturmak veya belirli bir bankanın canlı olup olmadığını kontrol etmek için kullanın.
/api/v1/banksherkese açık · kimlik doğrulaması yokcurl https://pay.magazamhazir.com/api/v1/banks
{
"banks": [
{
"provider": "garanti",
"displayName": "Garanti BBVA",
"protocol": "GVPS",
"tier": "certified",
"credentialFields": [
{ "key": "merchantId", "label": "Merchant ID", "secret": false },
{ "key": "terminalId", "label": "Terminal ID", "secret": false },
{ "key": "provisionPassword", "label": "Provision password", "secret": true }
],
"capabilities": {
"threeDS": true, "preAuth": true, "tokenization": false,
"installments": true, "inquiry": true
}
}
]
}Yalnızca entegre bankalar döner, kademeye göre sıralanmış olarak. tier şunlardan biridir: certified, protocol-confirmed, creds-pending, not-started veya not-planned; certified, bankaya karşı canlı doğrulandığı anlamına gelir. credentialFields, bir operatörün bankayı etkinleştirmek için sağlaması gereken tam alanları listeler.
Yetenek keşfi
Bu ağ geçidinin yönlendirebildiği her banka; neyi desteklediği ve sandbox'ının gerçek olup olmadığıyla — herkese açık, anahtar gerekmez. Kendi bankalarınız ve canlı hazırlığınız için GET /v1/capabilities/me kullanın (yukarıda Yetenekler).
/api/v1/capabilitiesherkese açık · kimlik doğrulaması yok{
"providers": [
{
"name": "garanti",
"capabilities": {
"threeDS": true, "preAuth": true, "tokenization": false,
"installments": true, "inquiry": true
},
"sandbox": { "simulated": false, "sharedTerminal": true, "verified": true, "verifiedAt": "2026-07-21T01:37:11.036Z" }
}
]
}- ·sandbox.simulated true ise o bankaya giden sk_test_ trafiğini banka değil, ağ geçidinin simülatörü yanıtlar; sharedTerminal bankanın herkese açık test terminalini işaretler; verified ve verifiedAt, bankanın onayladığı gerçek bir sandbox satışını kaydeder.
- ·Varsayılan banka destekliyorsa yetenek true'dur; paylaşılan /v1 uç noktaları, false olduğunda bankaya göre farklı davranmak yerine 501 döndürür.
- ·tokenization false olduğunda kayıtlı kartları, preAuth false olduğunda ön provizyonu gizleyin; banka adlarını sabit kodlamayın.
Banka yönlendirme
Bir üye işyeri aynı anda birden çok bankayı entegre edebilir. Ağ geçidi her kartın BIN'ini okur, kartı çıkaran bankayı bulur ve o banka entegreyse ödemeyi ona yönlendirir ("on-us", genelde daha ucuz); değilse üye işyerinin varsayılan bankasını kullanır. Bu tamamen otomatik ve sunucu tarafındadır — istek ve yanıt şekilleriniz değişmez.
- 1The gateway reads the card's BIN (leading digits).
- 2It finds the card's issuing bank and, if the merchant has integrated it, routes there.
- 3Otherwise the merchant's
defaultbank runs the payment.
Başarı ve başarısızlık URL'leri
Portalın basit modunda iki dönüş URL'si tanımlarsınız. Ödeme sonuçlandıktan sonra alışveriş yapan eşleşen URL'ye yönlendirilir ve aynı olay webhook uç noktanıza da iletilir.
| URL | Ne zaman | Olaylar |
|---|---|---|
| successUrl | ödeme lehinize sonuçlanır | payment.succeeded · payment.captured · refund.succeeded |
| failUrl | ödeme reddedilir veya hata verir | payment.failed |
Yönlendirme alışveriş yapanın tarayıcısı içindir; webhook'u doğruluk kaynağı olarak kabul edin ve siparişi yalnızca imzasını doğruladıktan sonra tamamlayın.
Webhook'lar
İmzalı, zaman damgalı olaylar almak için bir uç nokta kaydedin. Her teslimatı, uç nokta gizli anahtarınıza karşı zaman damgası ve ham gövde üzerinde HMAC'i yeniden hesaplayarak doğrulayın.
/api/v1/webhook-endpoints{ "url": "https://store.example/webhooks/mhpay", "events": ["payment.succeeded", "refund.succeeded"] }X-MHPAY-Signature: t=1721400000,v1=8f3c… (two v1 during a secret rotation) X-MHPAY-Event: payment.succeeded User-Agent: MHPay-Webhooks/1.0 Content-Type: application/json
{
"id": "evt_5c2d…",
"type": "payment.succeeded",
"created": 1721400000,
"mode": "sandbox",
"data": {
"paymentId": "pay_2c7d8e…",
"orderId": "order-1024",
"status": "captured",
"amount": 12000,
"currency": "TRY",
"cardLast4": "1111"
}
}Her teslimat bu zarfa sarılır. id ile tekrarları ayıklayın — yeniden denemeler aynı id'yi kullanır, bu yüzden tekrarlanan bir id'yi aynı olay olarak değerlendirin ve yalnızca bir kez işleyin. mode, olayın sandbox'tan mı yoksa canlıdan mı geldiğini belirtir.
{
"id": "evt_8a1f…",
"type": "refund.succeeded",
"created": 1721486400,
"mode": "live",
"data": {
"paymentId": "pay_2c7d8e…",
"orderId": "order-1024",
"status": "partially_refunded",
"amount": 12000,
"currency": "TRY",
"cardLast4": "1111",
"refundAmount": 4000
}
}data.amount her olayda ödemenin ilk tutarı olarak kalır; refund.succeeded olayında data.refundAmount BU iadenin tutarı, data.status ise iadeden sonraki ödeme durumudur (partially_refunded veya refunded). Ne kadarın iade edildiğini bilmek için refundAmount değerlerini paymentId başına, olay id’sine göre tekrarları ayıklayarak toplayın.
Webhook uç noktalarını yönetme
Kaydettiğiniz uç noktaları listeleyin ve artık ihtiyaç duymadıklarınızı kaldırın. Yeni uç noktaları POST /v1/webhook-endpoints ile kaydedin (bkz. Webhook'lar); bu, imzalama gizli anahtarını bir kez döndürür.
/api/v1/webhook-endpoints/api/v1/webhook-endpoints/:id[
{
"id": "whe_5c2d…",
"url": "https://store.example/webhooks/mhpay",
"events": ["payment.succeeded", "refund.succeeded"],
"status": "active",
"createdAt": "2026-07-19T18:32:10.000Z"
}
]GET, kayıtlı her uç noktayı url'si, abone olunan olayları ve durumuyla döndürür — ancak yalnızca oluşturma anında bir kez gösterilen imzalama gizli anahtarını asla göstermez. DELETE, bir uç noktayı devre dışı bırakır, böylece teslimat almayı durdurur.
Webhook imzalarını doğrulama
Her teslimat, t=<unix>,v1=<hex> biçiminde tek bir X-MHPAY-Signature başlığı taşır (döndürme sırasında fazladan bir v1 ile). HMAC'i uç nokta imzalama gizli anahtarınızla (whsec_…) `${t}.${rawBody}` üzerinde yeniden hesaplayın, sabit zamanlı karşılaştırın ve eski teslimatları reddedin.
- ·X-MHPAY-Signature'ı t=<unix> zaman damgasına ve her v1=<hex> değerine ayrıştırın; gövdenin JSON ayrıştırmasından önceki tam alınan baytlarını kullanın.
- ·signature = HMAC-SHA256(signingSecret, `${t}.${rawBody}`), aynı başlığın içinde hex bir v1 değeri olarak gönderilir.
- ·Zaman damgası sapması 5 dakikadan (300s) fazla olan her şeyi reddedin ve tekrar ile zamanlama saldırılarını önlemek için sabit zamanlı bir fonksiyonla karşılaştırın.
- ·Gizli anahtar döndürme sırasında başlık iki v1 değeri taşır (önce geçerli gizli anahtar); hepsini toplayın ve herhangi biri eşleşirse teslimatı kabul edin.
const crypto = require('crypto');
// Verify the X-MHPAY-Signature header: "t=<unix>,v1=<hex>[,v1=<hex>]".
// During a secret rotation TWO v1 values arrive; accept ANY match.
function verifyWebhook(header, rawBody, secret, toleranceSec = 300) {
const parts = header.split(',').map(s => s.trim());
const t = Number(parts.find(p => p.startsWith('t='))?.slice(2));
const v1s = parts.filter(p => p.startsWith('v1=')).map(p => p.slice(3));
if (!t || Math.abs(Math.floor(Date.now() / 1000) - t) > toleranceSec) return false;
const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
return v1s.some(v => v.length === expected.length && crypto.timingSafeEqual(Buffer.from(v), Buffer.from(expected)));
}Gizli anahtar döndürme
İmzalama gizli anahtarını hiçbir teslimatı kaçırmadan değiştirin. Döndürme, yeni bir whsec_… (bir kez gösterilir) döndürürken önceki gizli anahtar 24 saatlik bir örtüşme boyunca doğrulamaya devam eder.
/api/v1/webhook-endpoints/:id/rotate{
"id": "whe_5c2d…",
"signingSecret": "whsec_new9f2a…",
"previousSecretExpiresAt": "2026-07-21T18:32:10.000Z"
}- 1rotate çağırın ve yeni signingSecret (whsec_…) değerini saklayın — yalnızca bir kez döndürülür.
- 2Sonraki 24 saat boyunca her iki gizli anahtar da her teslimatı imzalar, bu yüzden X-MHPAY-Signature iki v1 değeri taşır (önce geçerli gizli anahtar).
- 3Kod değişikliğine gerek yoktur: yukarıdaki doğrulayıcı zaten tüm v1 değerlerini toplar ve herhangi bir eşleşmeyi kabul eder.
- 4previousSecretExpiresAt sonrasında eski gizli anahtar imzalamayı bırakır ve teslimatlar yeniden tek bir v1 taşır.
Uç noktanızı test etme
Kayıtlı bir uç noktaya imzalı bir webhook.test olayını eşzamanlı olarak gönderin ve tam olarak nasıl yanıt verdiğini görün.
/api/v1/webhook-endpoints/:id/test{ "delivered": true, "statusCode": 200 }Test olayı, uç noktanın events[] filtresinden bağımsız olarak teslim edilir — bir abonelik değil, açık bir testtir. delivered uç noktanızın yanıt verip vermediğini, statusCode ise HTTP durumunu (erişilemezse null) bildirir. Deneme ayrıca teslimat günlüğünüzde gerçek olayların yanında görünür.
Canlıya geçiş
Beş adımda sandbox’tan, kendi banka hesabınıza düşen gerçek ödemelere geçin.
- Sanal POS bilgilerinizi bankanızdan alın (üye işyeri no, terminal no, mağaza/gizli anahtar — alanlar bankaya göre değişir).
- Bunları panelde Bankalar bölümüne bir kez girin. Sandbox için bir şey tanımlamaya gerek yoktur; bilgiler yalnızca canlıya özeldir.
- Bilgileri yerleşik denetimle doğrulayın — para hareketi olmayan, risksiz bir kontrol.
- Entegrasyonunuzu sk_live_ anahtarınıza geçirin. Sandbox mı canlı mı olduğu, ana bilgisayara veya bir bayrağa göre değil, anahtar önekine göre belirlenir.
- Küçük tutarlı gerçek bir ödeme gönderin, panelde doğrulayın ve banka ekstrenizle mutabık kalın.
Geçiş yapmadan önce sk_live_ anahtarıyla GET /v1/capabilities/me çağırın: liveReady true olmalıdır; eksik kalan her şeyi liveBlockers söyler.
Çekilecek bir tutar veya platform bakiyesi yoktur: ilk canlı ödemenizden itibaren para, bankanızın normal döngüsünde kendi hesabınıza geçer.
Test kartları
Sandbox’ta sonucu yalnızca kart numarası belirler — aşağıdaki her senaryo belirlenimcidir ve banka bilgisi gerektirmez.
4001 7433 0010 0001onaylar4001 7433 0010 0100reddederHer MHPAY test kartı 7433 işaretini taşır; böylece ilk bakışta tanınır ve başka bir alt yapının test kartlarıyla çakışamaz.
4001 7433 0010 0100 ^^^^ ^^^^ ^^^^ ^^^^ | | | | └─ Luhn kontrol hanesi | | | └──── senaryo kodu (000 = onaylı) | | └───────── banka kodu | └────────────── 7433 — her test kartındaki MHPAY işlareti └─────────────────── marka + kart tipi (4001 Visa kredi, 5002 Mastercard banka, …)
- ·Son kullanma: gelecekteki herhangi bir tarih. Sandbox kontrol etmez.
- ·CVC: herhangi 3 hane (Amex için 4). CVC reddini test etmek için hatalı CVC yerine geçersiz-CVC kartını kullanın — hatalı CVC bankaya ulaşmadan doğrulamada reddedilir.
- ·Diğer Luhn-geçerli kartlar, gerçek sandbox’ı olan bankalarda bankaya iletilir (sonuç bankadan gelir); henüz sandbox’ımız olmayan bankalarda simülatör onaylar.
Onaylanan kartlar
Her banka için bir tane; markalar ve kart tipleri arasında dağıtılmıştır. Hepsi status: captured döner.
| Kart numarası | Banka | Marka | Tip |
|---|---|---|---|
| 4001 7433 0010 0001 | Garanti BBVA | VISA | Kredi |
| 5001 7433 0020 0006 | İş Bankası | MASTERCARD | Kredi |
| 4002 7433 0030 0006 | Akbank | VISA | Banka |
| 5002 7433 0040 0001 | Yapı Kredi | MASTERCARD | Banka |
| 9791 7433 0050 0005 | Halkbank | TROY | Kredi |
| 9792 7433 0060 0002 | Vakıfbank | TROY | Banka |
| 4001 7433 0070 0008 | QNB | VISA | Kredi |
| 5001 7433 0080 0003 | Ziraat | MASTERCARD | Kredi |
| 4001 7433 0090 0004 | TEB | VISA | Kredi |
| 5001 7433 0095 0006 | Kuveyt Türk | MASTERCARD | Kredi |
| 3400 743300 10012 | Garanti BBVA | AMEX | Kredi |
| 4001 7433 0099 0005 | Foreign (non-TR) | VISA | Kredi |
| 5002 7433 0099 0001 | Foreign (non-TR) | MASTERCARD | Banka |
Başarısız kartlar
Her biri tek bir reddi sabitler. Hatalar HTTP 402 olarak, aşağıdaki kod meta.providerErrorCode içinde döner — düz retler PAYMENT_DECLINED, iade/kapatma retleri PAYMENT_PROVIDER_ERROR olarak gelir.
| Kart numarası | Senaryo | Hata kodu |
|---|---|---|
| 4001 7433 0010 0100 | Yetersiz bakiye | INSUFFICIENT_FUNDS |
| 4001 7433 0010 0118 | İşleme izin verilmedi (do not honour) | DO_NOT_HONOUR |
| 4001 7433 0010 0126 | Geçersiz işlem | INVALID_TRANSACTION |
| 4001 7433 0010 0134 | Kayıp kart | LOST_CARD |
| 4001 7433 0010 0142 | Çalıntı kart | STOLEN_CARD |
| 4001 7433 0010 0159 | Vadesi geçmiş kart | EXPIRED_CARD |
| 4001 7433 0010 0167 | Geçersiz CVC2 | INVALID_CVC |
| 4001 7433 0010 0175 | Kart sahibine izin verilmiyor | NOT_PERMITTED_CARDHOLDER |
| 4001 7433 0010 0183 | Terminale izin verilmiyor | NOT_PERMITTED_TERMINAL |
| 4001 7433 0010 0191 | Dolandırıcılık şüphesi | FRAUD_SUSPECT |
| 4001 7433 0010 0209 | Karta el koy | PICKUP_CARD |
| 4001 7433 0010 0217 | Genel hata | GENERAL_ERROR |
| 4001 7433 0010 0308 | 3DS doğrulaması başarısız (mdStatus 0) | FAKE_3DS_FAILED |
| 4001 7433 0010 0316 | 3DS denendi (mdStatus 4) — yine de otorize olur | — |
| 4001 7433 0010 0324 | 3DS başlatma başarısız | THREEDS_INIT_FAILED |
| 4001 7433 0010 0407 | Onaylanır ama iade/iptal edilemez | REFUND_NOT_ALLOWED |
| 4001 7433 0010 0415 | Ön provizyon alınır ama kapatılamaz | CAPTURE_NOT_ALLOWED |
| 4001 7433 0010 0506 | Banka zamanında yanıt vermez | PROVIDER_TIMEOUT |
Banka yönlendirme kartları
Yukarıdaki kartlar gerçek bir bankaya ait olmayan BIN'ler üzerine kuruludur, bu yüzden her zaman varsayılan bankanıza düşerler. Buradaki her kart ise gerçek bir banka BIN'i taşır — entegre her banka için bir kredi ve bir banka kartı — böylece o bankayı entegre ettiyseniz ödeme on-us olarak o bankaya, aksi halde varsayılan bankanıza yönlenir. Hepsi onaylanır ve daima simüle edilir: değişen şey, sonuç değil, yanıttaki routingReason değeridir (bin_on_us / default_fallback). İki “bilinmeyen banka” kartı hiçbir bankanın aralığında olmayan bir BIN taşır, bu yüzden her zaman fallback olur.
| Kart numarası | Banka | Tip | Yönlenir |
|---|---|---|---|
| 5420 3000 7433 0015 | Garanti BBVA | Kredi | On-us → garanti (bin_on_us) |
| 4282 2000 7433 0025 | Garanti BBVA | Banka | On-us → garanti (bin_on_us) |
| 5253 8200 7433 0014 | İş Bankası | Kredi | On-us → isbank (bin_on_us) |
| 4183 4200 7433 0029 | İş Bankası | Banka | On-us → isbank (bin_on_us) |
| 5127 5400 7433 0012 | Akbank | Kredi | On-us → akbank (bin_on_us) |
| 4132 5200 7433 0028 | Akbank | Banka | On-us → akbank (bin_on_us) |
| 5193 2400 7433 0018 | QNB | Kredi | On-us → qnbfinans (bin_on_us) |
| 4010 7200 7433 0021 | QNB | Banka | On-us → qnbfinans (bin_on_us) |
| 5200 1700 7433 0018 | Vakıfbank | Kredi | On-us → vakifbank (bin_on_us) |
| 4029 4000 7433 0029 | Vakıfbank | Banka | On-us → vakifbank (bin_on_us) |
| 5230 3400 7433 0011 | Yapı Kredi | Kredi | On-us → yapikredi (bin_on_us) |
| 4048 0900 7433 0025 | Yapı Kredi | Banka | On-us → yapikredi (bin_on_us) |
| 5116 6000 7433 0017 | Kuveyt Türk | Kredi | On-us → kuveytturk (bin_on_us) |
| 4025 8900 7433 0025 | Kuveyt Türk | Banka | On-us → kuveytturk (bin_on_us) |
| 5118 8500 7433 0016 | Ziraat | Kredi | On-us → ziraat (bin_on_us) |
| 4045 9100 7433 0027 | Ziraat | Banka | On-us → ziraat (bin_on_us) |
| 5100 5600 7433 0011 | Halkbank | Kredi | On-us → halkbank (bin_on_us) |
| 4155 1400 7433 0027 | Halkbank | Banka | On-us → halkbank (bin_on_us) |
| 5101 3800 7433 0013 | TEB | Kredi | On-us → teb (bin_on_us) |
| 4024 5800 7433 0023 | TEB | Banka | On-us → teb (bin_on_us) |
| 5197 5300 7433 0018 | Şekerbank | Kredi | On-us → sekerbank (bin_on_us) |
| 4038 3600 7433 0024 | Şekerbank | Banka | On-us → sekerbank (bin_on_us) |
| 5222 4000 7433 0013 | Anadolubank | Kredi | On-us → anadolubank (bin_on_us) |
| 4258 4600 7433 0025 | Anadolubank | Banka | On-us → anadolubank (bin_on_us) |
| 4242 4242 4242 4242 | Unknown issuer (fallback) | Kredi | Bilinmeyen banka → varsayılan banka (default_fallback) |
| 5555 5555 5555 4444 | Unknown issuer (fallback) | Banka | Bilinmeyen banka → varsayılan banka (default_fallback) |