DOCS
Panel Giriş Başvurun

Pazaryeri Entegrasyonu

Ödeme İşlemleri

Son kullanıcıdan kartla ödeme alın, tutarı satıcılara ve pazaryerine komisyonlarına göre dağıtın; durum sorgulama, taksit, saklı kart ve tamamlama servisleriyle akışı yönetin.

Stopaj hatırlatma: pazaryeri işlemlerinde %1 stopaj zorunludur — KDV hariç net tutar üzerinden hesaplayıp withholdingTax alanında bildirin. Ayrıntı: Stopaj Uygulaması.

CreatePayment

Yeni bir ödeme başlatır; hem 3D Secure hem 3D'siz işlemler için kullanılır.

TESTPOST https://apitest.paynkolay.com.tr/marketplace/v1/payment/create

PRODPOST https://api.paynkolay.com.tr/marketplace/v1/payment/create

İstek — JSON
{
  "apiKey": "calculated_api_key",
  "apiSecretKey": "sx_value",
  "bankCard": {
    "cardHolder": "AHMET YILMAZ",
    "cardNumber": "4546711234567894",
    "cvv": "123",
    "expiryMonth": "12",
    "expiryYear": "2026",
    "isThreeD": true,
    "registerCard": false
  },
  "installment": 2,
  "isFetchInstallments": false,
  "encodedValue": null,
  "trxCurrency": "TRY",
  "trxAmount": 150.00,
  "trxCode": "ORDER_12345",
  "trxType": "SALES",
  "callbackUrl": "https://yoursite.com/payment-callback",
  "sellerList": [
    { "sellerExternalId": "SELLER_001", "trxAmount": 100.00, "withholdingTax": 0.80, "sellerDiscountAmount": 0.00 },
    { "sellerExternalId": "SELLER_002", "trxAmount": 50.00, "withholdingTax": 0.40, "sellerDiscountAmount": 0.00 }
  ],
  "shippingCost": 0.00,
  "otherAmount": 0.00,
  "mpDiscountAmount": 0.00,
  "totalDiscountAmount": 0.00,
  "marketplaceCode": "MP12345",
  "customerCardInfo": { "mpCustomerKey": "12345678901", "cardAlias": null, "cardTranId": null, "cardToken": null }
}

Temel Parametreler

ParametreTipZorunluAçıklama
apiKeyStringHash ile üretilen anahtar — bkz. Hash Hesaplama
apiSecretKeyStringSX değeri
trxCurrencyStringPara birimi (TRY, USD, EUR)
trxAmountBigDecimalToplam işlem tutarı
trxCodeStringİşlem takip kodu (kendi referansınız)
trxTypeStringİşlem tipi: SALES
callbackUrlString3D sonucunun POST edileceği URL; autoComplete=false ise tamamlamayı yapacak kendi servisiniz
marketplaceCodeStringPazaryeri kodu

Kart Bilgileri — bankCard

ParametreTipZorunluAçıklama
cardHolderString✅*Kart üzerindeki isim (saklı kartta opsiyonel)
cardNumberString✅*Kart numarası (saklı kartta opsiyonel)
cvvString✅*CVV (saklı kartta opsiyonel)
expiryMonth / expiryYearString✅*Son kullanma ay/yıl (saklı kartta opsiyonel)
isThreeDBoolean3D Secure kullanılsın mı?
registerCardBooleanKart saklansın mı? (yalnızca 3D'li işlemlerde)

Taksit Bilgileri

ParametreTipZorunluAçıklama
installmentIntegerTaksit sayısı (1 = tek çekim)
isFetchInstallmentsBooleanTaksit bilgisi Paynkolay'dan mı çekilecek?
encodedValueStringFetchPaymentInstallments'tan dönen encoded değer

Satıcı Listesi — sellerList

ParametreTipZorunluAçıklama
sellerExternalIdStringSatıcının external ID'si
trxAmountBigDecimalSatıcıya ait işlem tutarı
commissionRateBigDecimalÖzel komisyon oranı (profil dışında)
commissionAmountBigDecimalHesaplanmış komisyon tutarı
mpCostBigDecimalİşlem ücreti
withholdingTaxBigDecimalStopaj tutarı
sellerDiscountAmountBigDecimalSatıcı indirim tutarı

Komisyon kuralları: commissionRate ve commissionAmount aynı anda gönderilemez. Özel komisyon uygulanmayacaksa ikisini de null gönderin; yalnız oran gönderirseniz tutar otomatik hesaplanır.

İndirim ve Ücretler / Müşteri Kartı

ParametreTipZorunluAçıklama
shippingCost / otherAmountBigDecimalKargo ve diğer ücretler
mpDiscountAmount / totalDiscountAmountBigDecimalPazaryeri ve toplam indirim tutarları
customerCardInfo.mpCustomerKeyString✅*Müşteri kimliği (TCKN/cep/pasaport) — kart saklama için zorunlu
customerCardInfo.cardAliasStringKart takma adı (saklama için)
customerCardInfo.cardTranId / cardTokenStringSaklı kart ile ödeme için kimlik/token

Yanıt

Yanıt — JSON
{
  "data": {
    "refCode": "REF123456789",
    "trxCode": "ORDER_12345",
    "form": "PGh0bWw+...3D HTML Form Base64..."
  },
  "success": true,
  "responseCode": "200",
  "responseMessage": "SUCCESS"
}

form, 3D işlemlerde Base64 kodlu HTML formudur — decode edip müşteriye render edersiniz.

3D Secure Akışı

MüşteriSunucunuzPaynkolayBanka (3D)Ödeme formu1POST /payment/createisThreeD=true · apiKey2refCode + Base64 form3Formu decode edip göster4SMS / OTP onayı5callbackUrl'e POST6Callback hash doğrula7Sonuç sayfası8
  1. 1CreatePayment gönderinisThreeD=true ile isteği yapın; yanıtta Base64 form döner.
  2. 2Formu render edinBase64'ü çözüp HTML'i müşterinin tarayıcısına basın.
  3. 3Banka doğrulamasıMüşteri banka 3D ekranında SMS/OTP kodunu girer.
  4. 4Callback alınBanka sonucu callbackUrl adresinize POST eder.
  5. 5Hash'i doğrulayınGelen veriyi callback hash formülüyle doğrulayın.
  6. 6Sonucu işleyinresponseCode 200/2 ise siparişi onaylayın, değilse reddedin.
Form Decode + Callback — JavaScript
// Yanıttaki 3D formunu müşteriye göster
if (response.success && response.data.form) {
  const htmlForm = Buffer.from(response.data.form, 'base64').toString('utf-8');
  res.send(htmlForm);
}

// callbackUrl'e gelen sonucu işle
app.post('/payment-callback', (req, res) => {
  if (!verifyCallbackHash(req.body, apiSecretKey)) {
    return res.status(400).send('Invalid hash');
  }

  if (req.body.responseCode === '200' || req.body.responseCode === '2') {
    updateOrderStatus(req.body.trxCode, 'PAID');
  } else {
    updateOrderStatus(req.body.trxCode, 'FAILED');
  }

  res.status(200).send('OK');
});

autoComplete: pazaryeri tanımınızda autoComplete ayarı false ise callback'e gelen POST ödemenin tamamlandığı anlamına gelmez; işlem beklemede kalır ve CompletePaymentExternal servisini çağırarak akışı sizin tamamlamanız gerekir.

GetPaymentStatus

TESTPOST https://apitest.paynkolay.com.tr/marketplace/v1/payment/status

PRODPOST https://api.paynkolay.com.tr/marketplace/v1/payment/status

İstek — JSON
{
  "refCode": "REF123456789",
  "trxCode": "ORDER_12345"
}

refCode veya trxCode'dan en az birini göndermeniz yeterlidir.

Yanıt — JSON
{
  "data": [
    {
      "trxStatus": "SUCCESS",
      "trxCode": "ORDER_12345",
      "refCode": "REF123456789",
      "trxType": "SALES",
      "trxAmount": 150.00,
      "trxCurrency": "TRY"
    }
  ],
  "success": true,
  "responseCode": "200",
  "responseMessage": "SUCCESS"
}
DurumAçıklama
SUCCESSBaşarılı işlem
PENDINGİşlem devam ediyor
FAILEDBaşarısız işlem
CANCELLEDİptal edilmiş
REFUNDEDİade yapılmış

GetStoredCardList & Saklı Kartla Ödeme

TESTPOST https://apitest.paynkolay.com.tr/marketplace/v1/payment/storedCardList

PRODPOST https://api.paynkolay.com.tr/marketplace/v1/payment/storedCardList

İstek — JSON
{
  "mpCode": "MP12345",
  "apiSecretKey": "sx_value",
  "mpCustomerKey": "12345678901",
  "apiKey": "calculated_api_key"
}

Bu servisin apiKey değeri ödeme formülünden farklıdır: Base64(SHA512(apiSecretKey | mpCustomerKey | merchantSecretKey)) — bkz. Saklı Kart ApiKey.

Yanıt — JSON
{
  "data": {
    "cardTotalCount": 2,
    "storedCardList": [
      {
        "cardToken": "token_abc123",
        "cardTranId": "tran_xyz789",
        "cardMaskedPan": "454671******7894",
        "cardIssuer": "Akbank",
        "cardType": "Credit",
        "cardBrand": "VISA",
        "cardAlias": "İş Kartım"
      },
      {
        "cardToken": "token_def456",
        "cardTranId": "tran_uvw321",
        "cardMaskedPan": "540061******1234",
        "cardIssuer": "İş Bankası",
        "cardType": "Debit",
        "cardBrand": "MASTERCARD",
        "cardAlias": "Kişisel Kart"
      }
    ]
  },
  "success": true,
  "responseCode": "200",
  "responseMessage": "SUCCESS"
}

Yanıtta müşterinin kartları cardToken, cardTranId, maskeli PAN ve banka bilgileriyle listelenir. Saklı kartla ödemede kart bilgileri gönderilmez:

Saklı Kartla Ödeme — JavaScript
await createPayment({
  // ...diğer parametreler
  bankCard: {
    isThreeD: true,
    registerCard: false
    // kart bilgileri GÖNDERİLMEZ
  },
  customerCardInfo: {
    mpCustomerKey: '12345678901',
    cardTranId: selectedCard.cardTranId  // VEYA cardToken
  }
});

FetchPaymentInstallments

TESTPOST https://apitest.paynkolay.com.tr/marketplace/v1/payment/fetchInstallments

PRODPOST https://api.paynkolay.com.tr/marketplace/v1/payment/fetchInstallments

İstek — JSON
{
  "mpCode": "MP12345",
  "apiSecretKey": "sx_value",
  "cardNumber": "45467112",
  "amount": 1000.00,
  "isCardValid": false
}
ParametreTipZorunluAçıklama
mpCodeStringPazaryeri kodu
apiSecretKeyStringSX değeri
cardNumberStringKart numarasının ilk 6-8 hanesi veya tamamı
amountBigDecimalİşlem tutarı
isCardValidBooleantrue ise kart geçerliliği kontrol edilir
Yanıt — JSON
{
  "data": {
    "cardScope": "WORLD",
    "paymentInstallments": [
      {
        "installment": 1,
        "installmentAmount": 1000.00,
        "cardTrxType": "CREDIT",
        "bankCode": "0046",
        "commissionAmount": 0.00,
        "commissionRate": 0.00,
        "trxAmount": 1000.00,
        "currencyCode": "TRY",
        "currencyNumber": "949",
        "program": "WORLD",
        "cardBankNo": "0046",
        "plusInstallment": 0,
        "encodedValue": "encoded_value_1"
      },
      {
        "installment": 2,
        "installmentAmount": 510.00,
        "cardTrxType": "CREDIT",
        "bankCode": "0046",
        "commissionAmount": 20.00,
        "commissionRate": 2.00,
        "trxAmount": 1020.00,
        "currencyCode": "TRY",
        "currencyNumber": "949",
        "program": "WORLD",
        "cardBankNo": "0046",
        "plusInstallment": 0,
        "encodedValue": "encoded_value_2"
      }
    ]
  },
  "success": true,
  "responseCode": "200",
  "responseMessage": "SUCCESS"
}

Yanıttaki her taksit seçeneği installmentAmount, komisyon bilgileri ve bir encodedValue içerir. Kullanıcının seçtiği taksidin encodedValue'sunu CreatePayment'ta isFetchInstallments: true ile gönderirsiniz.

Taksit Seçimi ve Ödeme — JavaScript
// 1. Taksit seçeneklerini çek
const installments = await fetchPaymentInstallments({
  mpCode: 'MP12345',
  apiSecretKey: 'sx',
  cardNumber: cardNumber.substring(0, 8),
  amount: 1000.00
});

// 2. Kullanıcıya taksit seçeneklerini göster
installments.data.paymentInstallments.forEach(inst => {
  console.log(`${inst.installment} Taksit: ${inst.installmentAmount} TL`);
});

// 3. Kullanıcı seçim yaptı (örn: 2 taksit)
const selectedInstallment = installments.data.paymentInstallments[1];

// 4. Ödemeyi oluştur
await createPayment({
  // ... diğer parametreler
  installment: selectedInstallment.installment,
  isFetchInstallments: true,
  encodedValue: selectedInstallment.encodedValue
});

UpdatePaymentCommission

TESTPOST https://apitest.paynkolay.com.tr/marketplace/v1/payment/updateCommission

PRODPOST https://api.paynkolay.com.tr/marketplace/v1/payment/updateCommission

İstek — JSON
{
  "mpCode": "MP12345",
  "refCode": "REF123456789",
  "trxCode": "ORDER_12345",
  "sellerList": [
    { "sellerExternalId": "SELLER_001", "commissionAmount": 5.00, "trxAmount": 100.00, "withholdingTax": 0.80, "sellerDiscountAmount": 0.00 }
  ]
}

Bu servis yalnızca ödeme işlemiyle aynı gün kullanılabilir; ertesi gün çalışmaz. Stopaj bilgisini de güncellemeyi unutmayın.

Yanıt — JSON
{
  "data": [
    {
      "mpCode": "MP12345",
      "refCode": "REF123456789",
      "trxCode": "ORDER_12345",
      "trxCurrency": "TRY",
      "trxAmount": 100.00,
      "trxStatus": "SUCCESS",
      "sellerTransactionList": [
        {
          "sellerName": "Ahmet Yılmaz",
          "trxAmount": 100.00,
          "trxCurrency": "TRY",
          "trxStatus": "SUCCESS",
          "pfCommissionRate": 2.50,
          "pfCommissionAmount": 2.50,
          "mpCommissionRate": 5.00,
          "mpCommissionAmount": 5.00,
          "mpCost": 0.50,
          "trxType": "SALES",
          "withholdingTax": 0.80
        }
      ]
    }
  ],
  "success": true,
  "responseCode": "200",
  "responseMessage": "SUCCESS"
}

CompletePaymentExternal

autoComplete = false olan pazaryerlerinde ödeme otomatik tamamlanmaz: form akışı bitince callback önce sizin servisinize gelir; kendi validasyon ve kayıt işlemlerinizden sonra bu servisi çağırarak akışı tamamlarsınız.

autoCompleteDavranış
trueVarsayılan — ödeme, form akışı tamamlanınca otomatik tamamlanır; ek çağrı gerekmez.
falseÖdeme beklemede kalır; validasyon/DB kaydı sonrası CompletePaymentExternal çağrısıyla siz tamamlarsınız.

Ayar üye işyeri bazında Paynkolay tarafından yapılandırılır; false çalışmak için entegrasyon ekibiyle iletişime geçin.

  1. 1CreatePaymentcallbackUrl olarak kendi servisinizi verin.
  2. 2Callback POSTForm sonucu REFERENCE_CODE dahil servisinize POST edilir.
  3. 3Kayıt oluşturunİşlemi kendi veritabanınıza yazın.
  4. 4ValidasyonKendi iş mantığı kontrollerinizi çalıştırın.
  5. 5CompletePaymentExternalreferenceCode + satış SX ile tamamlayın.
  6. 6Sonuçİşlem sonucu döner, akış tamamlanır.

TESTPOST https://apitest.paynkolay.com.tr/marketplace/v1/payment/completePaymentExternal

PRODPOST https://api.paynkolay.com.tr/marketplace/v1/payment/completePaymentExternal

Server-to-server JSON POST'tur; JWT token gerektirmez — kimlik doğrulama satış SX ile yapılır. Bu servis, tekil üye işyeri (Vpos) tarafındaki CompletePayment'tan farklıdır ve yalnızca pazaryeri işlemleri içindir. Bu akışta callback alanları büyük harflidir (REFERENCE_CODE, RESPONSE_CODE…); RESPONSE_CODE=2 + boş AUTH_CODE, işlemin tamamlama beklediği anlamına gelir.

İstek — JSON
{
  "referenceCode": "qv6UkBD2m1Ora+tS6UHTW36hm0s4+0RG1pUsoAF6xBuM3cW8ZbIupXOYVpUW6983ZXKzL4qXdE01MEwD+ObnAnA6pOg=",
  "apiSecretKey": "sx_value"
}
ParametreTipZorunluAçıklama
referenceCodeStringCallback'te REFERENCE_CODE alanında gelen Base64 değer — değiştirilmeden gönderilir, tek kullanımlıktır
apiSecretKeyStringSatış SX değeri

Başarılı yanıt responseCode: "2" ile işlem detaylarını (authCode, tutarlar, komisyon, hash…) döner. Hata durumlarında da HTTP 200 gelir — sonucu success ve responseCode alanlarından kontrol edin. Aynı referenceCode ile ikinci deneme "Aynı referans kodu ile birden fazla deneme yapılmıştır." hatası verir.

Yanıt — JSON
{
  "success": true,
  "message": null,
  "responseCode": "2",
  "responseMessage": "İşlem Başarılı",
  "trxCode": "ORDER_12345",
  "referenceCode": "IKSIRPF123456",
  "authCode": "S35971",
  "timestamp": "2026-07-27 16:43:47+0300",
  "currencyCode": "949",
  "hash": "I6mMIL2JW1yREC+RW1kos/pJzAN/L8+d5oaMY6Pe9RtuEcnP+NievGxC/R1IYAxG+vhBE4i4i1zyNvzR0pyuHQ==",
  "commissionRate": "1.3000",
  "commissionAmount": "25.9900",
  "installment": "1",
  "trxAmount": "1999.00",
  "authAmount": "1999.00",
  "bankMessage": "Onaylandı",
  "issuerBankCode": "111",
  "installmentFeeRate": "0.00",
  "installmentFeeAmount": "0.00",
  "cardType": "CreditCard",
  "paymentSystem": "V"
}
// createPayment isteğinde callbackUrl olarak verdiğiniz endpoint
app.post('/payment-callback', async (req, res) => {
  const referenceCode = req.body.REFERENCE_CODE || req.body.referenceCode;

  if (!referenceCode) {
    return res.status(400).send('referenceCode zorunludur');
  }

  // 1. İşlem kaydı oluştur (kendi DB'niz)
  await saveTransactionRecord(req.body);

  // 2. Validasyon / iş mantığı işlemleri
  // ...

  // 3. Ödemeyi tamamla
  const response = await fetch(
    'https://apitest.paynkolay.com.tr/marketplace/v1/payment/completePaymentExternal',
    {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        referenceCode: referenceCode,
        apiSecretKey: process.env.API_SECRET_KEY
      })
    }
  );

  const result = await response.json();

  if (result.success && result.responseCode === '2') {
    await updateOrderStatus(result.trxCode, 'PAID');
  } else {
    await updateOrderStatus(result.trxCode, 'FAILED');
    console.error('Ödeme tamamlanamadı:', result.message || result.responseMessage);
  }

  res.status(200).send(result.responseMessage);
});
<?php
// createPayment isteğinde callbackUrl olarak verdiğiniz endpoint
$referenceCode = $_POST['REFERENCE_CODE'] ?? $_POST['referenceCode'] ?? '';

if ($referenceCode === '') {
    http_response_code(400);
    exit('referenceCode zorunludur');
}

// 1. İşlem kaydı oluştur (kendi DB'niz)
// 2. Validasyon / iş mantığı işlemleri
// ...

// 3. Ödemeyi tamamla
$ch = curl_init('https://apitest.paynkolay.com.tr/marketplace/v1/payment/completePaymentExternal');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'referenceCode' => $referenceCode,
        'apiSecretKey' => getenv('API_SECRET_KEY'),
    ]),
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);

if (($result['success'] ?? false) && ($result['responseCode'] ?? '') === '2') {
    // Siparişi onayla
} else {
    // Hata: $result['message'] / $result['responseMessage']
}

UpdateDeliveryDate

Teslimat bazlı valör (valorCalculationType = "D") profiliyle çalışan satıcı işlemleri için teslim tarihini bildirir; bildirilmeden satıcıya ödeme yapılmaz.

TESTPOST https://apitest.paynkolay.com.tr/marketplace/v1/transaction/update-delivery

PRODPOST https://api.paynkolay.com.tr/marketplace/v1/transaction/update-delivery

İstek — JSON
{
  "apiSecretKey": "sx_value",
  "sellerTransactionList": [
    { "refCode": "IKSIRPF471619", "deliveryDate": "18.12.2025", "sellerExternalId": "SELLER_001" },
    { "refCode": "IKSIRPF471619", "deliveryDate": "18.12.2025", "sellerExternalId": "SELLER_002" }
  ]
}

Kurallar: deliveryDate her işlem için yalnızca 1 kez girilebilir ve sonradan değiştirilemez; her zaman güncellemenin yapıldığı günün tarihi olmalıdır (dd.MM.yyyy). Sepette birden çok satıcı varsa her satıcının teslimatı ayrı liste elemanı olarak bildirilir. Güncellenemeyen işlemlerin referansları yanıtın message alanında döner.

Yanıt — JSON
{
  "success": false,
  "message": "Gönderdiğiniz refCode ve trxCode bilgilerine ait bir ödeme işlemi kaydı bulunamadı.!"
}

Uçtan Uca Örnek

Ödeme servislerini tek sınıfta toplayan çalışır Node.js örneği:

MarketplacePayment — Node.js (axios)
class MarketplacePayment {
  async processPayment(orderData) {
    try {
      // 1. Taksit seçeneklerini çek
      const installments = await this.fetchInstallments(
        orderData.cardNumber,
        orderData.amount
      );

      // 2. Stopaj hesapla
      const sellers = orderData.items.map(item => ({
        sellerExternalId: item.sellerId,
        trxAmount: item.price,
        withholdingTax: this.calculateWithholdingTax(item.priceWithoutVAT),
        sellerDiscountAmount: item.sellerDiscount || 0
      }));

      // 3. ApiKey hesapla
      const apiKey = this.calculateApiKey(
        orderData.orderId,
        orderData.amount,
        'TRY',
        'SALES'
      );

      // 4. Ödeme oluştur
      const payment = await this.createPayment({
        apiKey,
        apiSecretKey: this.apiSecretKey,
        bankCard: {
          cardHolder: orderData.cardHolder,
          cardNumber: orderData.cardNumber,
          cvv: orderData.cvv,
          expiryMonth: orderData.expiryMonth,
          expiryYear: orderData.expiryYear,
          isThreeD: true,
          registerCard: orderData.saveCard
        },
        installment: orderData.selectedInstallment,
        trxAmount: orderData.amount,
        trxCode: orderData.orderId,
        trxType: 'SALES',
        trxCurrency: 'TRY',
        callbackUrl: 'https://yoursite.com/payment-callback',
        sellerList: sellers,
        marketplaceCode: this.mpCode,
        customerCardInfo: {
          mpCustomerKey: orderData.customerId
        }
      });

      // 5. 3D form'u göster
      if (payment.data.form) {
        const htmlForm = Buffer.from(
          payment.data.form,
          'base64'
        ).toString('utf-8');
        return { type: '3D_FORM', html: htmlForm };
      }

      return { type: 'SUCCESS', data: payment.data };

    } catch (error) {
      console.error('Payment error:', error);
      throw error;
    }
  }

  calculateWithholdingTax(amountWithoutVAT) {
    return amountWithoutVAT * 0.01; // %1 stopaj
  }
}

Son güncelleme: 10 Eylül 2026

v8 · Versiyonlar