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.

SandboxCanlı
Temel URLhttps://pay.magazamhazir.com/apihttps://pay.magazamhazir.com/api
Anahtar önekipk_test_ / sk_test_pk_live_ / sk_live_
Tutarlaralt birim (kuruş)alt birim (kuruş)
Para birimleriTRY · USD · EUR · GBPTRY · 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.

Simüle edilmiş yanıt (sandbox erişimi olmayan banka)
{
  "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.

İmza girdileri
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.
Node.js
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.

Yanıt
{
  "statusCode": 402,
  "code": "PAYMENT_DECLINED",
  "message": "PAYMENT_DECLINED",
  "details": []
}
HTTPKodNe zaman
400COMMON_VALIDATION_FAILEDBir alan doğrulamadan geçemedi (details[] alanına bakın).
401AUTH_INVALID_SIGNATUREHatalı imza, eksik başlıklar veya süresi geçmiş zaman damgası.
402PAYMENT_DECLINEDBanka kartı reddetti.
404PAYMENT_NOT_FOUNDBu üye işyeri için böyle bir ödeme / oturum yok.
409IDEMPOTENCY_KEY_CONFLICTAynı Idempotency-Key farklı bir gövdeyle yeniden kullanıldı.
409ORDER_ID_ALREADY_USEDBu orderId için başarısız olmamış bir ödeme var — her deneme için yeni bir orderId gönderin (ör. order-1024A02).
422REFUND_EXCEEDS_REMAININGİade tutarı, kalan tahsil edilmiş tutardan büyük.
422PAYMENT_INVALID_STATEBu işlem ödemenin mevcut durumunda yapılamaz.
501PROVIDER_TOKENIZATION_UNSUPPORTEDBu bankanın kart kasası yok (/v1/cards).
502PAYMENT_OUTCOME_UNKNOWNBanka 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.

POST/api/v1/checkout/sessions
İstek
{
  "amount": 15000,
  "currency": "TRY",
  "orderId": "order-1024",
  "callbackUrl": "https://store.example/checkout/return",
  "returnUrl": "https://store.example/orders/1024",
  "use3ds": true
}
Yanıt
{
  "token": "cs_9f2a7b…",
  "url": "https://pay.magazamhazir.com/pay/cs_9f2a7b…",
  "expiresAt": "2026-07-19T18:40:00.000Z"
}
  1. 1Oturumu oluşturun (imzalı, sunucu tarafında).
  2. 2Alışveriş yapanı url adresine yönlendirin. Sayfa ödeme alıcısını — üye işyeri adınızı — gösterir ve kartı alır.
  3. 3Banka yanıt verdiğinde onu callbackUrl?paymentId=…&status=… adresine (3-D Secure sonrasında ek olarak signature ile) gönderir ve bir webhook tetikleriz.
  • ·status değeri success (tahsil edildi), failed ya da pending olur: 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ı olan callbackUrl değ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 halde details[].constraint https_required_in_live ile 400 COMMON_VALIDATION_FAILED dö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).

GET/api/v1/checkout/sessions/:tokenherkese açık · kimlik doğrulaması yok
POST/api/v1/checkout/sessions/:token/payherkese açık · kimlik doğrulaması yok
Yanıt
{
  "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.

Kullanılmış / süresi dolmuş oturum
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.

GET/api/v1/installments?bin=<6-8 digits>&amount=<minor>
GET/api/v1/checkout/sessions/:token/installments?bin=<6-8 digits>herkese açık · kimlik doğrulaması yok
cURL
curl "https://pay.magazamhazir.com/api/v1/checkout/sessions/cs_9f2a7b…/installments?bin=454671"
Yanıt
{
  "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.

İstek
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.

Önerilen · SAQ-A

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.

Gelişmiş · SAQ-D

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).

POST/api/v1/payments
İstek
{
  "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" }
}
Yanıt
{
  "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.

POST/api/v1/payments/3ds/initialize
İstek
{
  "amount": 12000,
  "currency": "TRY",
  "orderId": "order-1024",
  "callbackUrl": "https://store.example/checkout/return",
  "preAuth": false,
  "card": { "number": "4111111111111111", "expireMonth": 12, "expireYear": 2030, "cvc": "123" }
}
Yanıt
{
  "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.

POST/api/v1/payments/:id/refunds
İstek
{ "amount": 4000, "reason": "customer request" }
POST/api/v1/payments/:id/capturecapture a pre-auth · { amount? }
POST/api/v1/payments/:id/cancelsame-day void
POST/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.

POST/api/v1/payments/preauth
İstek
{
  "amount": 12000,
  "currency": "TRY",
  "orderId": "order-1024",
  "card": { "number": "4111111111111111", "expireMonth": 12, "expireYear": 2030, "cvc": "123" }
}
Yanıt
{
  "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.

POST/api/v1/payments/:id/capture{ amount? }
POST/api/v1/payments/:id/cancelvoid an auth hold
POST/api/v1/payments/:id/reversereverse an auth hold
İstek
POST /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.

GET/api/v1/payments/:id
GET/api/v1/payments/:id?sync=truealso ask the bank for its status
GET/api/v1/payments?status=captured&orderId=order-1024&limit=50&offset=0
Yanıt
{
  "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.

GET/api/v1/capabilities/me

Geliş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.

Yanıt
{
  "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"]
}
AlanAnlamı
merchantIdanahtarın ait olduğu üye işyeri
modeçağıran anahtarın modu: sk_test_… → sandbox, sk_live_… → live
defaultProvidervarsayı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
liveEnabledoperatö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
liveBlockershâlâ kapalı olan her kapı (liveReady true ise boş)
EngelAnlamı
LIVE_NOT_ENABLEDoperatör canlı ödemeyi henüz onaylamadı
MERCHANT_SUSPENDEDüye işyeri askıya alınmış
DEFAULT_BANK_NOT_LIVEvarsayılan banka bu ağ geçidinde canlı ödemeye açık değil
NO_ACTIVE_LIVE_ACCOUNTvarsayılan banka için aktif canlı hesap (banka kimlik bilgileri) yok
LIVE_ACCOUNT_INCOMPLETEcanlı 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.

POST/api/v1/cardstokenleştir · token referansları + bin/last4 döndürür
GET/api/v1/cardskayıtlı kartları listele (maskeli)
DELETE/api/v1/cards/:idkayıtlı bir kartı sil
Yanıt
{
  "id": "card_7a1f…",
  "cardUserKey": "cuk_1a2b…",
  "cardToken": "ctok_9f8e…",
  "bin": "552879",
  "last4": "0008",
  "brand": "MASTERCARD",
  "expMonth": 12,
  "expYear": 2030
}
Kayıtlı bir kartı tahsil et
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.

GET/api/v1/banksherkese açık · kimlik doğrulaması yok
cURL
curl https://pay.magazamhazir.com/api/v1/banks
Yanıt
{
  "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).

GET/api/v1/capabilitiesherkese açık · kimlik doğrulaması yok
Yanıt
{
  "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.

  1. 1The gateway reads the card's BIN (leading digits).
  2. 2It finds the card's issuing bank and, if the merchant has integrated it, routes there.
  3. 3Otherwise the merchant's default bank 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.

URLNe zamanOlaylar
successUrlödeme lehinize sonuçlanırpayment.succeeded · payment.captured · refund.succeeded
failUrlödeme reddedilir veya hata verirpayment.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.

POST/api/v1/webhook-endpoints
İstek
{ "url": "https://store.example/webhooks/mhpay", "events": ["payment.succeeded", "refund.succeeded"] }
Teslimat başlıkları
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
Olay zarfı
{
  "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.

refund.succeeded (kısmi iade)
{
  "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.

payment.succeededpayment.failedpayment.authorizedpayment.capturedpayment.cancelledpayment.reversedrefund.succeededwebhook.test

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.

GET/api/v1/webhook-endpoints
DELETE/api/v1/webhook-endpoints/:id
Yanıt
[
  {
    "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.

POST/api/v1/webhook-endpoints/:id/rotate
Yanıt
{
  "id": "whe_5c2d…",
  "signingSecret": "whsec_new9f2a…",
  "previousSecretExpiresAt": "2026-07-21T18:32:10.000Z"
}
  1. 1rotate çağırın ve yeni signingSecret (whsec_…) değerini saklayın — yalnızca bir kez döndürülür.
  2. 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).
  3. 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.
  4. 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.

POST/api/v1/webhook-endpoints/:id/test
Yanıt
{ "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.

  1. Sanal POS bilgilerinizi bankanızdan alın (üye işyeri no, terminal no, mağaza/gizli anahtar — alanlar bankaya göre değişir).
  2. 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.
  3. Bilgileri yerleşik denetimle doğrulayın — para hareketi olmayan, risksiz bir kontrol.
  4. 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.
  5. 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 0001onaylar
4001 7433 0010 0100reddeder

Her 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ıBankaMarkaTip
4001 7433 0010 0001Garanti BBVAVISAKredi
5001 7433 0020 0006İş BankasıMASTERCARDKredi
4002 7433 0030 0006AkbankVISABanka
5002 7433 0040 0001Yapı KrediMASTERCARDBanka
9791 7433 0050 0005HalkbankTROYKredi
9792 7433 0060 0002VakıfbankTROYBanka
4001 7433 0070 0008QNBVISAKredi
5001 7433 0080 0003ZiraatMASTERCARDKredi
4001 7433 0090 0004TEBVISAKredi
5001 7433 0095 0006Kuveyt TürkMASTERCARDKredi
3400 743300 10012Garanti BBVAAMEXKredi
4001 7433 0099 0005Foreign (non-TR)VISAKredi
5002 7433 0099 0001Foreign (non-TR)MASTERCARDBanka

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ıSenaryoHata kodu
4001 7433 0010 0100Yetersiz bakiyeINSUFFICIENT_FUNDS
4001 7433 0010 0118İşleme izin verilmedi (do not honour)DO_NOT_HONOUR
4001 7433 0010 0126Geçersiz işlemINVALID_TRANSACTION
4001 7433 0010 0134Kayıp kartLOST_CARD
4001 7433 0010 0142Çalıntı kartSTOLEN_CARD
4001 7433 0010 0159Vadesi geçmiş kartEXPIRED_CARD
4001 7433 0010 0167Geçersiz CVC2INVALID_CVC
4001 7433 0010 0175Kart sahibine izin verilmiyorNOT_PERMITTED_CARDHOLDER
4001 7433 0010 0183Terminale izin verilmiyorNOT_PERMITTED_TERMINAL
4001 7433 0010 0191Dolandırıcılık şüphesiFRAUD_SUSPECT
4001 7433 0010 0209Karta el koyPICKUP_CARD
4001 7433 0010 0217Genel hataGENERAL_ERROR
4001 7433 0010 03083DS doğrulaması başarısız (mdStatus 0)FAKE_3DS_FAILED
4001 7433 0010 03163DS denendi (mdStatus 4) — yine de otorize olur—
4001 7433 0010 03243DS başlatma başarısızTHREEDS_INIT_FAILED
4001 7433 0010 0407Onaylanır ama iade/iptal edilemezREFUND_NOT_ALLOWED
4001 7433 0010 0415Ön provizyon alınır ama kapatılamazCAPTURE_NOT_ALLOWED
4001 7433 0010 0506Banka zamanında yanıt vermezPROVIDER_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ıBankaTipYönlenir
5420 3000 7433 0015Garanti BBVAKrediOn-us → garanti (bin_on_us)
4282 2000 7433 0025Garanti BBVABankaOn-us → garanti (bin_on_us)
5253 8200 7433 0014İş BankasıKrediOn-us → isbank (bin_on_us)
4183 4200 7433 0029İş BankasıBankaOn-us → isbank (bin_on_us)
5127 5400 7433 0012AkbankKrediOn-us → akbank (bin_on_us)
4132 5200 7433 0028AkbankBankaOn-us → akbank (bin_on_us)
5193 2400 7433 0018QNBKrediOn-us → qnbfinans (bin_on_us)
4010 7200 7433 0021QNBBankaOn-us → qnbfinans (bin_on_us)
5200 1700 7433 0018VakıfbankKrediOn-us → vakifbank (bin_on_us)
4029 4000 7433 0029VakıfbankBankaOn-us → vakifbank (bin_on_us)
5230 3400 7433 0011Yapı KrediKrediOn-us → yapikredi (bin_on_us)
4048 0900 7433 0025Yapı KrediBankaOn-us → yapikredi (bin_on_us)
5116 6000 7433 0017Kuveyt TürkKrediOn-us → kuveytturk (bin_on_us)
4025 8900 7433 0025Kuveyt TürkBankaOn-us → kuveytturk (bin_on_us)
5118 8500 7433 0016ZiraatKrediOn-us → ziraat (bin_on_us)
4045 9100 7433 0027ZiraatBankaOn-us → ziraat (bin_on_us)
5100 5600 7433 0011HalkbankKrediOn-us → halkbank (bin_on_us)
4155 1400 7433 0027HalkbankBankaOn-us → halkbank (bin_on_us)
5101 3800 7433 0013TEBKrediOn-us → teb (bin_on_us)
4024 5800 7433 0023TEBBankaOn-us → teb (bin_on_us)
5197 5300 7433 0018ŞekerbankKrediOn-us → sekerbank (bin_on_us)
4038 3600 7433 0024ŞekerbankBankaOn-us → sekerbank (bin_on_us)
5222 4000 7433 0013AnadolubankKrediOn-us → anadolubank (bin_on_us)
4258 4600 7433 0025AnadolubankBankaOn-us → anadolubank (bin_on_us)
4242 4242 4242 4242Unknown issuer (fallback)KrediBilinmeyen banka → varsayılan banka (default_fallback)
5555 5555 5555 4444Unknown issuer (fallback)BankaBilinmeyen banka → varsayılan banka (default_fallback)