top of page

Wix'te Halkbank POS Kurulum Rehberi: Adım Adım Güvenli Ödeme Altyapısı

Wix Halkbank POS kurulumu adımları tamamlandığında işletmeler taksit ve 3D Secure destekli ödeme alabiliyor.

Doğru Kurulumun Önemi


Wix üzerinde Halkbank POS kurulumu, e-ticaret mağazanızın ödeme altyapısını oluşturan en kritik süreçlerden biridir. Doğru adımlar izlendiğinde bu kurulum tamamen güvenli ve hızlı şekilde tamamlanabilir, ancak en küçük bir hata bile ödeme akışını aksatabilir veya güvenlik açıkları yaratabilir. Bu rehber, Halkbank POS'u Wix mağazanıza entegre etmek için ihtiyaç duyduğunuz tüm adımları, kod örneklerini ve en iyi uygulamaları içerir.

Kurulum sürecinde üç ana aşama bulunur: Halkbank'tan API bilgilerinin alınması ve Velo backend'e eklenmesi, ödeme endpoint'lerinin yapılandırılması ve 3D Secure doğrulama akışının kurulması¹. Her aşama dikkatle tamamlanmalı ve test edilmelidir. Unutmayın ki bu kurulum sadece bir kerelik bir işlemdir - doğru yapıldığında sisteminiz yıllarca sorunsuz çalışacaktır.


Ön Hazırlık: Gerekli Bilgiler ve Araçlar

Kuruluma başlamadan önce bazı ön hazırlıkların yapılması gerekir. İlk olarak, Halkbank ile sanal POS anlaşmanızın tamamlanmış olması şarttır. Banka size bir e-posta gönderecek ve bu e-postada temel bilgileriniz yer alacaktır. Ancak kurulum için bunlar yeterli değildir - Halkbank yönetim paneline erişerek ek bilgileri kendiniz toplamanız gerekir.

Wix tarafında ise Dev Mode'un aktif olması zorunludur². Dev Mode, Wix Editor'ün üst menüsünden "Dev Mode" tıklanarak ve "Turn on Dev Mode" seçilerek etkinleştirilir². Bu mod aktif edildiğinde Code Panel açılır ve frontend ile backend JavaScript kodu yazmanıza izin verir². Dev Mode olmadan özel kod kullanamaz ve backend API çağrıları yapamazsınız².


Halkbank Yönetim Paneline Giriş

Halkbank'tan gelen e-postadaki bilgilerle https://sanalpos.halkbank.com.tr/halk/report/user.login adresine giriş yapın. Giriş yaptıktan sonra ilk işiniz, mevcut mağaza bilgilerinizi kontrol etmektir. Sol menüden "Yönetim" sekmesine tıklayın ve "Üye İşyeri İşlemleri" bölümünü açın. Burada göreceğiniz bilgileri not edin:

Mağaza Numarası (Merchant ID): Genellikle 9 haneli bir sayı olan bu numara, Halkbank sisteminde sizi tanımlayan benzersiz kimliğinizdir³. Tüm API çağrılarında bu numarayı kullanacaksınız.

Terminal ID: Üye İşyeri Terminal Bilgisi sayfasından erişebileceğiniz terminal numaranız, bazı ödeme modellerinde kullanılır³.

3D Model: "3D Ayarları" bölümünden mevcut 3D modelinizi kontrol edin. Wix entegrasyonu için "3D PAY" modeli gereklidir⁴. Eğer modeliniz farklıysa, Halkbank müşteri temsilcinizle iletişime geçerek değiştirin. 3D PAY modeli, ödeme akışını tamamen sizin kontrolünüze almanızı sağlar ve callback URL'lerini kullanabilmeniz için şarttır.


API Kullanıcısı Oluşturma

Halkbank panelinde normal kullanıcı hesabınızla giriş yapabilirsiniz, ancak API entegrasyonu için özel bir "API Kullanıcısı" oluşturmanız gerekir⁴. Sol menüden "Yönetim > Yeni Kullanıcı Ekle" yolunu takip edin. Açılan formda kullanıcı tipi olarak "API Kullanıcısı" seçin ve bir kullanıcı adı ile şifre belirleyin⁴. Bu bilgileri güvenli bir yerde saklayın - Wix backend'inizde bu bilgileri kullanacaksınız.

API kullanıcısı oluşturduktan sonra, "Güvenlik Anahtarı Değiştirme" bölümüne gidin⁵. Burada göreceğiniz 3D Güvenlik Anahtarını not edin. Bu anahtar, hash hesaplamalarında kullanılacak ve işlem verilerinin bütünlüğünü garanti edecektir. Eğer mevcut bir anahtar görmüyorsanız, "Yeni Anahtar Oluştur" butonuna tıklayarak bir tane oluşturabilirsiniz.


Adım 1: Wix Velo Backend'i Hazırlama

Wix Editor'de Dev Mode aktif olduktan sonra, sol tarafta Code Panel'i göreceksiniz. Bu panelde "Backend" klasörü altında yeni dosyalar oluşturacaksınız. Backend dosyaları .jsw uzantısıyla biter ve sadece sunucu tarafında çalışır - tarayıcıda asla görünmez veya erişilemez⁶.


Secrets Manager ile Güvenli Bilgi Saklama

API bilgilerinizi doğrudan kod içine yazmak büyük bir güvenlik hatasıdır. Wix, bu tür hassas bilgileri saklamak için Secrets Manager adlı bir hizmet sunar⁷. Code Panel'de "Site Structure" sekmesine tıklayın ve "Secrets Manager" bölümünü bulun. "Add Secret" butonuna tıklayarak sırası ile şu bilgileri ekleyin:

Secret Name: halkbank_merchant_id
Secret Value: [Mağaza numaranız]

Secret Name: halkbank_api_username  
Secret Value: [API kullanıcı adınız]

Secret Name: halkbank_api_password
Secret Value: [API kullanıcı şifreniz]

Secret Name: halkbank_security_key
Secret Value: [3D Güvenlik anahtarınız]

Secret Name: halkbank_terminal_id
Secret Value: [Terminal ID'niz]

Secrets Manager'da saklanan bu bilgiler, backend kodlarınızda wix-secrets-backend modülü aracılığıyla erişilebilir⁷. Ancak frontend kodlarında veya tarayıcıda asla görünmez. Bu, API bilgilerinizi korumak için en güvenli yöntemdir.


Backend Dosyasının Oluşturulması

Code Panel'de "Backend" klasörüne sağ tıklayın ve "New .jsw File" seçin. Dosyaya halkbankService.jsw gibi açıklayıcı bir isim verin. Bu dosya, Halkbank ile tüm iletişiminizi yönetecek.

Dosyanın başına gerekli modülleri import edin:

// backend/halkbankService.jsw
import { fetch } from 'wix-fetch';
import { getSecret } from 'wix-secrets-backend';
import crypto from 'crypto';

wix-fetch modülü, HTTP istekleri yapmak için kullanılır. wix-secrets-backend modülü Secrets Manager'dan bilgileri çekmek için, crypto modülü ise hash hesaplamaları için gereklidir.


Adım 2: Hash Hesaplama Fonksiyonunun Yazılması

Hash hesaplama, Halkbank POS entegrasyonunun en kritik bileşenlerinden biridir. Hash, verilerinizin matematiksel bir parmak izi gibidir ve verinin yolda değiştirilmediğini garanti eder. Halkbank sistemi, PCI DSS 4.0 standartlarına uyum için SHA-512 algoritması kullanır⁸.

async function calculateHash(orderId, amount, currency) {
  try {
    const merchantId = await getSecret('halkbank_merchant_id');
    const securityKey = await getSecret('halkbank_security_key');
    
    // Hash ver3 için veri string'i oluştur
    // Format: MerchantId|OrderId|Amount|Currency|SecurityKey
    const dataString = `${merchantId}|${orderId}|${amount}|${currency}|${securityKey}`;
    
    // SHA-512 hash hesapla ve Base64'e çevir
    const hash = crypto
      .createHash('sha512')
      .update(dataString, 'utf8')
      .digest('base64');
    
    return hash;
  } catch (error) {
    console.error('Hash calculation error:', error);
    throw new Error('Failed to calculate hash');
  }
}

Bu fonksiyon, sipariş numarası, tutar ve para birimi bilgilerini alır, güvenlik anahtarıyla birleştirir ve SHA-512 hash'ini hesaplar. Hash hesaplama sırasında kullanılan format çok önemlidir - Halkbank dokümantasyonunda belirtilen formata kesinlikle uymalısınız. Aksi takdirde banka hash'i doğrulayamaz ve işlem reddedilir.


Adım 3: Ödeme Başlatma Endpoint'inin Oluşturulması

Ödeme başlatma, müşterinin "Ödeme Yap" butonuna tıkladığında tetiklenen süreçtir. Bu aşamada sipariş bilgileri toplanır, hash hesaplanır ve Halkbank API'sine bir POST isteği gönderilir.

export async function initiatePayment(orderData) {
  try {
    // Secrets'tan bilgileri çek
    const merchantId = await getSecret('halkbank_merchant_id');
    const apiUsername = await getSecret('halkbank_api_username');
    const apiPassword = await getSecret('halkbank_api_password');
    const terminalId = await getSecret('halkbank_terminal_id');
    
    // Tutarı kuruş cinsine çevir (Halkbank tutarları kuruş ister)
    const amountInKurus = Math.round(orderData.amount * 100);
    
    // Hash hesapla
    const hash = await calculateHash(
      orderData.orderId,
      amountInKurus,
      '949' // TRY para birimi kodu
    );
    
    // API isteği için data hazırla
    const requestData = {
      merchantId: merchantId,
      terminalId: terminalId,
      orderId: orderData.orderId,
      amount: amountInKurus,
      currency: '949',
      cardNumber: orderData.cardNumber.replace(/\s/g, ''),
      cardExpiry: orderData.cardExpiry, // Format: MMYY
      cvv: orderData.cvv,
      cardHolderName: orderData.cardHolderName,
      hash: hash,
      returnUrl: `https://${orderData.siteUrl}/_functions/halkbankCallback`,
      cancelUrl: `https://${orderData.siteUrl}/payment-cancel`,
      installment: orderData.installment || '0',
      language: 'tr'
    };
    
    // Basic Authentication için header oluştur
    const authHeader = Buffer.from(
      `${apiUsername}:${apiPassword}`
    ).toString('base64');
    
    // Halkbank API'sine POST isteği gönder
    const response = await fetch(
      'https://sanalpos.halkbank.com.tr/api/v1/payment/3dpay',
      {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Basic ${authHeader}`
        },
        body: JSON.stringify(requestData)
      }
    );
    
    const result = await response.json();
    
    if (result.status === 'success') {
      return {
        success: true,
        redirectUrl: result.redirectUrl,
        transactionId: result.transactionId
      };
    } else {
      return {
        success: false,
        error: result.errorMessage || 'Payment initiation failed'
      };
    }
  } catch (error) {
    console.error('Payment initiation error:', error);
    return {
      success: false,
      error: 'System error occurred'
    };
  }
}

Bu fonksiyon export anahtar kelimesiyle başlar çünkü frontend kodlarından çağrılabilir olmalıdır⁹. Fonksiyon içinde önce tüm hassas bilgiler Secrets Manager'dan çekilir, ardından sipariş verileri formatlanır ve Halkbank'a gönderilir. Önemli bir detay, tutarların kuruş cinsinden gönderilmesidir - 100 TL için 10000 göndermelisiniz.


Adım 4: Frontend Entegrasyonu

Backend fonksiyonlarınız hazır olduğuna göre, şimdi müşterinin göreceği arayüzü hazırlamanın zamanı geldi. Wix Editor'de ödeme sayfanızı açın ve Dev Mode'da page code'unu düzenleyin.

// Sayfa kodu (Page Code)
import { initiatePayment } from 'backend/halkbankService';
import wixWindow from 'wix-window';

$w.onReady(function () {
  
  $w('#paymentButton').onClick(async () => {
    // Butonu devre dışı bırak (çift tıklama önlemi)
    $w('#paymentButton').disable();
    $w('#loadingIcon').show();
    
    try {
      // Form verilerini topla
      const orderData = {
        orderId: generateOrderId(),
        amount: parseFloat($w('#totalAmount').text),
        cardNumber: $w('#cardNumberInput').value,
        cardExpiry: $w('#expiryInput').value,
        cvv: $w('#cvvInput').value,
        cardHolderName: $w('#cardHolderInput').value,
        installment: $w('#installmentDropdown').value,
        siteUrl: wixWindow.getSiteUrl()
      };
      
      // Form validasyonu
      if (!validatePaymentForm(orderData)) {
        $w('#errorMessage').text = 'Lütfen tüm alanları doğru doldurun';
        $w('#errorMessage').show();
        return;
      }
      
      // Backend fonksiyonunu çağır
      const result = await initiatePayment(orderData);
      
      if (result.success) {
        // 3D Secure ekranına yönlendir
        wixWindow.openLightbox('ProcessingLightbox');
        setTimeout(() => {
          wixWindow.location.href = result.redirectUrl;
        }, 1000);
      } else {
        $w('#errorMessage').text = result.error;
        $w('#errorMessage').show();
      }
    } catch (error) {
      console.error('Payment error:', error);
      $w('#errorMessage').text = 'Bir hata oluştu. Lütfen tekrar deneyin.';
      $w('#errorMessage').show();
    } finally {
      $w('#paymentButton').enable();
      $w('#loadingIcon').hide();
    }
  });
});

function generateOrderId() {
  const timestamp = Date.now();
  const random = Math.floor(Math.random() * 10000);
  return `ORD${timestamp}${random}`;
}

function validatePaymentForm(data) {
  // Kart numarası kontrolü (16 hane)
  const cardNumber = data.cardNumber.replace(/\s/g, '');
  if (!/^\d{16}$/.test(cardNumber)) return false;
  
  // Son kullanma tarihi kontrolü (MMYY format)
  if (!/^\d{4}$/.test(data.cardExpiry)) return false;
  
  // CVV kontrolü (3 hane)
  if (!/^\d{3}$/.test(data.cvv)) return false;
  
  // Kart sahibi isim kontrolü
  if (!data.cardHolderName || data.cardHolderName.length < 3) return false;
  
  return true;
}

Bu kod, ödeme butonuna tıklandığında form verilerini toplar, validasyon yapar ve backend fonksiyonunu çağırır. Başarılı olursa müşteriyi Halkbank'ın 3D Secure ekranına yönlendirir. Kullanıcı deneyimi için loading ikonu gösterilir ve butona çift tıklama engellenir.


Adım 5: HTTP Functions ile Callback Endpoint'i

3D Secure doğrulaması tamamlandıktan sonra, Halkbank müşteriyi sizin belirlediğiniz callback URL'e yönlendirir. Bu URL, bir HTTP function olmalıdır çünkü dışarıdan POST istekleri kabul etmesi gerekir. Wix'te HTTP functions, http-functions.js dosyasında tanımlanır¹⁰.

Code Panel'de "Backend" klasöründe http-functions.js dosyası yoksa oluşturun. Bu dosya özeldir ve Wix tarafından otomatik olarak tanınır¹⁰.

// backend/http-functions.js
import { ok, badRequest, notFound } from 'wix-http-functions';
import { getSecret } from 'wix-secrets-backend';
import wixData from 'wix-data';
import crypto from 'crypto';

export async function post_halkbankCallback(request) {
  try {
    // POST body'den form verilerini al
    const body = await request.body.text();
    const params = parseFormData(body);
    
    // Gelen parametreler
    const {
      orderId,
      status,
      hash: receivedHash,
      amount,
      currency,
      authCode,
      transactionId,
      errorCode,
      errorMessage,
      mdStatus
    } = params;
    
    // Hash doğrulama
    const expectedHash = await calculateCallbackHash(
      orderId, 
      amount, 
      currency,
      status
    );
    
    if (receivedHash !== expectedHash) {
      console.error('Hash mismatch!', {
        received: receivedHash,
        expected: expectedHash
      });
      return badRequest({
        body: 'Invalid hash'
      });
    }
    
    // mdStatus kontrolü (3D Secure sonucu)
    // 1 = Başarılı, 2-7 = Başarısız
    if (mdStatus !== '1') {
      await updateOrderStatus(orderId, 'failed', {
        errorCode,
        errorMessage
      });
      
      return ok({
        body: JSON.stringify({
          redirect: `/payment-failed?orderId=${orderId}`
        }),
        headers: {
          'Content-Type': 'application/json'
        }
      });
    }
    
    // Status kontrolü (Halkbank ödeme sonucu)
    if (status === 'APPROVED' || status === 'SUCCESS') {
      // Siparişi güncelle
      await updateOrderStatus(orderId, 'paid', {
        authCode,
        transactionId,
        paymentDate: new Date()
      });
      
      // Başarı sayfasına yönlendir
      return ok({
        body: JSON.stringify({
          redirect: `/order-confirmation?orderId=${orderId}`
        }),
        headers: {
          'Content-Type': 'application/json'
        }
      });
    } else {
      // Ödeme başarısız
      await updateOrderStatus(orderId, 'failed', {
        errorCode,
        errorMessage
      });
      
      return ok({
        body: JSON.stringify({
          redirect: `/payment-failed?orderId=${orderId}`
        }),
        headers: {
          'Content-Type': 'application/json'
        }
      });
    }
  } catch (error) {
    console.error('Callback error:', error);
    return badRequest({
      body: 'Callback processing failed'
    });
  }
}

async function calculateCallbackHash(orderId, amount, currency, status) {
  const merchantId = await getSecret('halkbank_merchant_id');
  const securityKey = await getSecret('halkbank_security_key');
  
  const dataString = `${merchantId}|${orderId}|${amount}|${currency}|${status}|${securityKey}`;
  
  return crypto
    .createHash('sha512')
    .update(dataString, 'utf8')
    .digest('base64');
}

async function updateOrderStatus(orderId, status, details) {
  try {
    // Wix Data kullanarak Orders koleksiyonunu güncelle
    const query = wixData.query('Orders')
      .eq('orderId', orderId);
    
    const results = await query.find();
    
    if (results.items.length > 0) {
      const order = results.items[0];
      
      await wixData.update('Orders', {
        _id: order._id,
        paymentStatus: status,
        authorizationCode: details.authCode,
        transactionId: details.transactionId,
        paymentDate: details.paymentDate,
        errorCode: details.errorCode,
        errorMessage: details.errorMessage,
        updatedAt: new Date()
      });
      
      return true;
    }
    
    return false;
  } catch (error) {
    console.error('Order update error:', error);
    return false;
  }
}

function parseFormData(body) {
  const params = {};
  const pairs = body.split('&');
  
  for (const pair of pairs) {
    const [key, value] = pair.split('=');
    params[key] = decodeURIComponent(value);
  }
  
  return params;
}

HTTP functions dosyasında fonksiyon isimleri önemlidir. post_halkbankCallback fonksiyonu, https://yoursite.wixsite.com/_functions/halkbankCallback URL'ine gelen POST isteklerini yakalar¹⁰. Fonksiyon ismi post_ ile başlamalı ve URL path ismini içermelidir.


Adım 6: 3D Secure Doğrulama Akışı

3D Secure akışı, müşteri güvenliğinin sağlandığı en kritik aşamadır. Akış şu şekilde işler:

Müşteri kart bilgilerini girip "Ödeme Yap" butonuna tıkladığında, initiatePayment fonksiyonu çağrılır ve Halkbank API'sine bir istek gönderilir. Banka yanıt olarak bir redirectUrl döner - bu URL, bankanın 3D Secure doğrulama ekranının adresidir. Frontend kodunuz müşteriyi bu URL'e yönlendirir.

Müşteri banka ekranında cep telefonuna gelen SMS şifresini girer. Şifre doğruysa, banka müşteriyi sizin belirlediğiniz returnUrl adresine POST isteğiyle yönlendirir. Bu istek, işlem sonucunu içeren parametreleri taşır. HTTP function'ınız bu parametreleri alır, hash'i doğrular ve sipariş durumunu günceller.


mdStatus Kodlarının Anlamı

mdStatus parametresi, 3D Secure doğrulamasının sonucunu belirtir¹¹:

  • 1: Doğrulama başarılı, işleme devam edilebilir

  • 2: Kart sahibi veya kartı veren banka sisteme kayıtlı değil

  • 3: Kartı veren banka sisteme kayıtlı değil

  • 4: Doğrulama denemesi yapılmış ancak başarısız

  • 5: Doğrulama yapılamadı

  • 6: 3D Secure hatası

  • 7: Sistem hatası

Sadece mdStatus = 1 durumunda ödeme işlemine devam edilmelidir. Diğer tüm durumlarda işlem iptal edilmeli ve müşteriye uygun hata mesajı gösterilmelidir.


Adım 7: İşlem Sonuç Kodları ve Hata Yönetimi

Halkbank'tan dönen status parametresi, ödeme işleminin sonucunu belirtir. Olası değerler:

  • APPROVED / SUCCESS: Ödeme başarılı

  • DECLINED: Ödeme reddedildi

  • ERROR: Sistem hatası

Ayrıca errorCode ve errorMessage parametreleri, başarısız işlemlerde detaylı bilgi sağlar. Bu kodları müşteriye gösterirken anlaşılır Türkçe mesajlara çevirmelisiniz:

function getErrorMessage(errorCode) {
  const messages = {
    '01': 'Kartınız ile işlem yapılamıyor. Lütfen bankanızla iletişime geçin.',
    '05': 'İşlem reddedildi. Lütfen kart bilgilerinizi kontrol edin.',
    '12': 'Geçersiz işlem. Lütfen bilgilerinizi kontrol edin.',
    '51': 'Yetersiz bakiye. Lütfen başka bir kart deneyin.',
    '54': 'Kartınızın son kullanma tarihi geçmiş.',
    '57': 'Bu işlem için yetkiniz yok.',
    '61': 'Limit aşımı. İşlem tutarı kartınızın limitini aşıyor.',
    '65': 'Günlük işlem limitiniz aşıldı.',
    '75': 'Şifre deneme sayınız aşıldı.'
  };
  
  return messages[errorCode] || 'İşlem başarısız. Lütfen tekrar deneyin.';
}

Bu mesajlar, callback fonksiyonunuzda kullanılarak müşteriye doğru bilgi verilir.


Adım 8: Sipariş Yönetimi ve Wix Data Entegrasyonu

Ödeme işlemleri tamamlandığında, sipariş durumunun güncellenmesi gerekir. Wix'te bunun için iki yöntem vardır: Wix Stores kullanıyorsanız built-in Order API'yi, özel bir sistem kullanıyorsanız Wix Data koleksiyonlarını kullanabilirsiniz¹².


Wix Data ile Sipariş Kaydı

Önce Wix Editor'de bir "Orders" koleksiyonu oluşturun. Database Manager'dan "Add Collection" tıklayın ve şu alanları ekleyin:

orderId (Text) - Unique
customerId (Text)
customerEmail (Text)
amount (Number)
currency (Text)
paymentStatus (Text)
authorizationCode (Text)
transactionId (Text)
cardLastFour (Text)
installment (Number)
paymentDate (Date)
errorCode (Text)
errorMessage (Text)
createdAt (Date)
updatedAt (Date)

Sipariş oluşturulduğunda bu koleksiyona kayıt ekleyin:

import wixData from 'wix-data';

async function createOrder(orderData) {
  try {
    const order = {
      orderId: orderData.orderId,
      customerId: orderData.customerId,
      customerEmail: orderData.customerEmail,
      amount: orderData.amount,
      currency: '949',
      paymentStatus: 'pending',
      cardLastFour: orderData.cardNumber.slice(-4),
      installment: orderData.installment || 0,
      createdAt: new Date(),
      updatedAt: new Date()
    };
    
    const result = await wixData.insert('Orders', order);
    return result;
  } catch (error) {
    console.error('Order creation error:', error);
    throw error;
  }
}

Callback aşamasında ise updateOrderStatus fonksiyonu ile sipariş güncellenir.


Adım 9: Taksit Desteği Ekleme

Taksit özelliği, müşterilere ödemeyi bölerek yapma imkanı sunar. Halkbank'ta taksit oranları anlaşmanıza göre değişir. Frontend'de bir dropdown ile taksit seçeneklerini sunabilirsiniz:

// Sayfa yüklendiğinde taksit seçeneklerini doldur
$w.onReady(async function () {
  const amount = parseFloat($w('#totalAmount').text);
  const installments = await getInstallmentOptions(amount);
  
  $w('#installmentDropdown').options = installments.map(opt => ({
    label: opt.label,
    value: opt.value.toString()
  }));
});

// Backend'de taksit seçeneklerini hesapla
export async function getInstallmentOptions(amount) {
  // Minimum taksit tutarı 100 TL
  if (amount < 100) {
    return [{ label: 'Tek Çekim', value: '0' }];
  }
  
  const options = [
    { installment: 0, rate: 0, label: 'Tek Çekim' },
    { installment: 2, rate: 0, label: '2 Taksit (Komisyonsuz)' },
    { installment: 3, rate: 1.5, label: '3 Taksit (+%1.5)' },
    { installment: 6, rate: 3, label: '6 Taksit (+%3)' },
    { installment: 9, rate: 4.5, label: '9 Taksit (+%4.5)' },
    { installment: 12, rate: 6, label: '12 Taksit (+%6)' }
  ];
  
  return options.map(opt => {
    const totalAmount = amount * (1 + opt.rate / 100);
    const monthlyPayment = opt.installment > 0 
      ? (totalAmount / opt.installment).toFixed(2)
      : totalAmount.toFixed(2);
    
    const label = opt.installment === 0
      ? `Tek Çekim (${amount.toFixed(2)} TL)`
      : `${opt.installment} Taksit (Aylık ${monthlyPayment} TL)`;
    
    return {
      label: label,
      value: opt.installment
    };
  });
}

Taksit seçildiğinde, initiatePayment fonksiyonuna taksit sayısı parametre olarak gönderilir ve Halkbank API'sine iletilir.


Adım 10: Test ve Canlıya Geçiş

Kurulum tamamlandıktan sonra, sistemi test etmek kritik öneme sahiptir. Halkbank test ortamı sağlamıyorsa, küçük tutarlı gerçek işlemlerle test yapmalısınız.


Test Checklist'i

  1. Hash Hesaplama: Console.log ile hesaplanan hash'leri kontrol edin

  2. API Bağlantısı: Halkbank API'ye istek gönderildiğini doğrulayın

  3. 3D Yönlendirme: Müşterinin banka ekranına yönlendirildiğini test edin

  4. Callback İşleme: HTTP function'ın çalıştığını ve parametreleri aldığını kontrol edin

  5. Hash Doğrulama: Callback'te hash doğrulamasının çalıştığını test edin

  6. Sipariş Güncelleme: Orders koleksiyonunun doğru güncellendiğini kontrol edin

  7. Hata Senaryoları: Yanlış kart bilgisi, yetersiz bakiye gibi durumları test edin

  8. Taksit: Farklı taksit seçeneklerinin çalıştığını doğrulayın


Canlıya Geçiş Adımları

Test aşaması başarılı olduktan sonra:

  1. Wix Editor'de "Publish" butonuna tıklayarak siteyi yayınlayın

  2. Halkbank panelinde test modundan canlı moda geçin (varsa)

  3. İlk gerçek işlemi kendiniz yaparak son bir kontrol gerçekleştirin

  4. Halkbank müşteri temsilcinize canlıya geçtiğinizi bildirin

  5. İlk birkaç günde işlemleri yakından takip edin

  6. Herhangi bir sorun olursa logs'ları inceleyin


Güvenli ve Hızlı Ödeme Altyapısı

Doğru adımlar izlendiğinde, Wix üzerinde Halkbank POS kurulumu tamamen güvenli ve hızlı şekilde tamamlanabilir. İlk adımda API bilgileri Velo backend'e güvenli şekilde eklenir, ardından ödeme endpoint'leri yapılandırılır ve callback URL'leri hazırlanır. 3D Secure yönlendirmelerinin doğru çalışması için banka dönüş parametreleri, hash doğrulaması ve işlem sonuç kodlarının kontrol edildiği bir doğrulama akışı kurulur.


Müşteri Halkbank'ın doğrulama ekranında işlemi onayladıktan sonra, sistem bu verileri işleyerek siparişi tamamlar. Kurulum adımları doğru izlenirse, Wix mağazanız hem taksitli hem de tek çekim işlemleri sorunsuz şekilde kabul eder ve ödeme akışı tamamen güvenli bir yapıya kavuşur. Unutmayın ki bu sistemin bakımı da önemlidir - düzenli olarak logs'ları kontrol edin, hash algoritması güncellemelerini takip edin ve Halkbank'tan gelen bildirimlere dikkat edin.


Kaynakça

  1. Halkbank. "Sanal POS API Dokümantasyonu". İç kaynak.

  2. Elfsight. (2025). "How to Add API to Wix Website: Step-by-Step Integration Guide". Erişim: https://elfsight.com/tutorials/how-to-add-api-to-wix-website/

  3. Qukasoft. "Halkbank Entegrasyonu". Erişim: https://help.qukasoft.com/odeme-yontemleri/halkbank-entegrasyonu

  4. serB2B. "Halkbank Sanal POS Entegrasyonu". Erişim: https://docs.serenay.net.tr/en/settings-advanced/odeme-ayarlari/sanal-pos-ayarlari/settings-basic-halkbank/

  5. Akıllı Ticaret. (2025). "Halkbank Sanal Pos Entegrasyonu". Erişim: https://akilliticaret.com/konu/halkbank-sanal-pos-entegrasyonu

  6. Wix. "Course: Coding with Velo: Backend". Erişim: https://www.wix.com/learn/courses/coding/velo-backend

  7. Medium - CodeX. (2021). "Using Velo by Wix to Integrate 3rd-Party API Data". Erişim: https://medium.com/codex/using-velo-by-wix-to-integrate-3rd-party-api-data-e9e121a638e7

  8. Webimonline. "Halkbank Sanal POS Hash Hatası Destek". Erişim: https://www.webimonline.com/halkbank-sanal-pos-hash-hatasi-destek

  9. Wix Velo. "API Overview". Erişim: https://dev.wix.com/docs/velo

  10. Davydov Consulting. "Wix API Integration | Wix Velo API". Erişim: https://www.davydovconsulting.com/velocode/api-integration-into-wix-website

  11. GitHub - mewebstudio. "pos: Türk bankaları için sanal pos paketi". Erişim: https://github.com/mewebstudio/pos

  12. Wix Velo. "Wix Pay Backend Introduction". Erişim: https://dev.wix.com/docs/velo/apis/wix-pay-backend/introduction


Blakfy Müşteriİlişkiler Uzmanı

Blakfy Uzmanı

bottom of page