SDK
Web
Kart Alanı

Kart Alanı (Hosted Field)

Kendi ödeme ekranınızı çizmek ama kart verisine hiç dokunmamak istediğinizde bunu kullanırsınız. Alan, sayfanıza bir çapraz-origin iframe olarak gömülür; kart numarası ve CVC sizin DOM'unuza hiç girmez.

const field = Lunixi.checkout.createCardField({ /* … */ });
await field.mount('#card-field');

Checkout SDK'sının bir varyantıdır — ayrı script yüklemeniz gerekmez, loader yeterlidir.

Sayfanıza yerleştirme

Alanın çizileceği boş bir <div> açarsınız; SDK içini kendisi doldurur.

<div id="card-field-checkout"></div>
 
<script src="https://cdn.lunixi.com/lunixi-checkout.min.js"></script>
<script>
  const checkout = Lunixi.checkout.createCardField({
    options: {
      token: 'ödeme intent yanıtındaki token',
      Currency: 'TRY',
      Price: '125.00',
      Locale: 'tr',
      force3Ds: '1',
      cardHolderName: 'Demo User',
    },
  });
 
  checkout.mount('#card-field-checkout');
</script>

mount() iki biçimi de kabul eder. Önce getElementById dener, bulamazsa querySelector'a düşer — yani 'card-field-checkout' (çıplak id) ve '#card-field-checkout' (CSS seçici) aynı sonucu verir. Bir DOM elemanı da geçirebilirsiniz.

⚠️

Hedef <div>'i boş bırakın. SDK monte ederken içeriğini temizler; oraya koyduğunuz yer tutucu içerik kaybolur. Yükleme göstergesi istiyorsanız div'in dışına koyun ve mount sonrası gizleyin.

Alanın yüksekliği kart girildikçe değişir (taksit tablosu açılır). Iframe yüksekliğini HEIGHT_CHANGED mesajıyla bildirir; SDK bunu sizin adına uygular, yani div'e sabit height vermeyin.

Taban adresleri değiştirme

Yerel geliştirmede ya da on-prem kurulumda:

Lunixi.configure({
  apiBaseUrl: 'https://api-gateway.lunixi.com/',
  cdnBaseUrl: 'https://cdn.lunixi.com/',
});

Bunu createCardField'dan önce çağırın.

Neden önemli

Kart verisi sizin JavaScript'inizin erişemediği bir origin'de yaşar. Bu, PCI DSS kapsamını daraltır: sayfanızda kart numarası hiç bulunmadığı için o sayfa kart verisi işleyen bir bileşen sayılmaz.

Kendi <input> alanınıza kart numarası aldığınız anda o sayfa PCI kapsamına girer. Hosted field tam olarak bunu engellemek içindir.

Parent'a ne geçer, ne geçmez

Iframe içeriden dışarıya yalnız şunları bildirir:

Mesajİçerik
CARD_VALIDITY_CHANGEDYalnız true / false — alan geçerli mi
CARD_BRAND_CHANGEDTespit edilen marka (VISA, MASTERCARD …)
CARD_BIN_CHANGEDİlk 6 hane — banka tespiti ve taksit tablosu için
HEIGHT_CHANGEDIframe'in piksel yüksekliği (yeniden boyutlandırma)
TOKENIZATION_STARTED / TOKENIZATION_FINISHEDTokenizasyonun başladığı/bittiği
TOKENIZEDpaymentMethodToken, brand, last4, cardHolderName, cardSave
ERRORcode — aşağıdaki tabloya bakın
🚫

PAN ve CVC hiçbir mesajda geçmez. Tokenizasyondan sonra elinizde yalnız opak paymentMethodToken ve last4 olur. Kart numarasını parent sayfada okumanız mümkün değildir — tasarım böyle.

BIN'in (ilk 6 hane) dışarı verilmesi bilinçlidir: taksit tablosunu ve banka kampanyasını göstermek için gerekir, tek başına kartı kullanılabilir kılmaz.

Parent'tan iframe'e gönderilenler

INIT · TOKENIZE · FOCUS · RESET · PING

Bunları doğrudan yazmazsınız; SDK'nın metotları arkada bu mesajlara dönüşür.

Tokenizasyon

TOKENIZE geldiğinde iframe kendisi platforma gider:

POST /api/v1/payments/form/tokenize

Yanıttaki cardToken'ı TOKENIZED mesajıyla parent'a iletir. Yani kart verisi iframe → platform yolunu izler, sizin sunucunuzdan geçmez.

Sonra ödemeyi bu token'la tamamlarsınız.

Hata kodları

KodAnlamı
tokenize_not_initializedINIT gelmeden TOKENIZE çağrıldı
card_invalidAlan geçerli değil — kullanıcı henüz tamamlamamış
tokenize_failedPlatform tokenizasyonu reddetti
tokenize_network_errorIframe platforma ulaşamadı

Güvenlik kurgusu

Bu alanın koruması birkaç katmandan gelir ve hepsi fail-closed:

  • Parent origin iframe URL'sinden verilir. Iframe, parent origin'i bilmiyorsa ya da zarf güvenli değilse hiç postMessage yapmaz — sessizce durur.
  • Katı CSP. default-src 'none', script-src 'self', form-action 'none', object-src 'none', base-uri 'none'; connect-src yalnız platform adresine açık.
  • frame-ancestors HTTP başlığında zorlanır. Meta etiketinde bilinçli olarak yoktur (orada zaten yok sayılır); asıl kural CDN/nginx tarafında yanıt başlığı olarak uygulanır — yani alanı kimin çerçeveleyebileceği sunucu tarafında sabittir.
⚠️

Alanı kendi sitenizde çerçeveleyebilmeniz için origin'inizin izinli olması gerekir. İzinli değilse iframe yüklenir ama hiçbir mesaj göndermez; boş bir alan görür ve konsolda hata bulamazsınız. İlk entegrasyonda bu belirti origin kaydınızı kontrol etmeniz gerektiği anlamına gelir.

Ne zaman bu, ne zaman tam checkout

İhtiyaçSeçim
Ödeme ekranının tamamını biz çizelimCheckout Form
Ekran benim, yalnız kart alanı sizdenKart Alanı (bu sayfa)
Kart verisine hiç dokunmadan kart saklamaKart Alanı + cardSave

İlgili