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
{
"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
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
| apiKey | String | ✅ | Hash ile üretilen anahtar — bkz. Hash Hesaplama |
| apiSecretKey | String | ✅ | SX değeri |
| trxCurrency | String | ✅ | Para birimi (TRY, USD, EUR) |
| trxAmount | BigDecimal | ✅ | Toplam işlem tutarı |
| trxCode | String | ✅ | İşlem takip kodu (kendi referansınız) |
| trxType | String | ✅ | İşlem tipi: SALES |
| callbackUrl | String | ✅ | 3D sonucunun POST edileceği URL; autoComplete=false ise tamamlamayı yapacak kendi servisiniz |
| marketplaceCode | String | ✅ | Pazaryeri kodu |
Kart Bilgileri — bankCard
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
| cardHolder | String | ✅* | Kart üzerindeki isim (saklı kartta opsiyonel) |
| cardNumber | String | ✅* | Kart numarası (saklı kartta opsiyonel) |
| cvv | String | ✅* | CVV (saklı kartta opsiyonel) |
| expiryMonth / expiryYear | String | ✅* | Son kullanma ay/yıl (saklı kartta opsiyonel) |
| isThreeD | Boolean | ✅ | 3D Secure kullanılsın mı? |
| registerCard | Boolean | ✅ | Kart saklansın mı? (yalnızca 3D'li işlemlerde) |
Taksit Bilgileri
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
| installment | Integer | ✅ | Taksit sayısı (1 = tek çekim) |
| isFetchInstallments | Boolean | ✅ | Taksit bilgisi Paynkolay'dan mı çekilecek? |
| encodedValue | String | ❌ | FetchPaymentInstallments'tan dönen encoded değer |
Satıcı Listesi — sellerList
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
| sellerExternalId | String | ✅ | Satıcının external ID'si |
| trxAmount | BigDecimal | ✅ | Satıcıya ait işlem tutarı |
| commissionRate | BigDecimal | ❌ | Özel komisyon oranı (profil dışında) |
| commissionAmount | BigDecimal | ❌ | Hesaplanmış komisyon tutarı |
| mpCost | BigDecimal | ❌ | İşlem ücreti |
| withholdingTax | BigDecimal | ❌ | Stopaj tutarı |
| sellerDiscountAmount | BigDecimal | ❌ | Satı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ı
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
| shippingCost / otherAmount | BigDecimal | ❌ | Kargo ve diğer ücretler |
| mpDiscountAmount / totalDiscountAmount | BigDecimal | ❌ | Pazaryeri ve toplam indirim tutarları |
| customerCardInfo.mpCustomerKey | String | ✅* | Müşteri kimliği (TCKN/cep/pasaport) — kart saklama için zorunlu |
| customerCardInfo.cardAlias | String | ❌ | Kart takma adı (saklama için) |
| customerCardInfo.cardTranId / cardToken | String | ❌ | Saklı kart ile ödeme için kimlik/token |
Yanıt
{
"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ışı
- 1CreatePayment gönderin
isThreeD=trueile isteği yapın; yanıtta Base64 form döner. - 2Formu render edinBase64'ü çözüp HTML'i müşterinin tarayıcısına basın.
- 3Banka doğrulamasıMüşteri banka 3D ekranında SMS/OTP kodunu girer.
- 4Callback alınBanka sonucu
callbackUrladresinize POST eder. - 5Hash'i doğrulayınGelen veriyi callback hash formülüyle doğrulayın.
- 6Sonucu işleyin
responseCode200/2 ise siparişi onaylayın, değilse reddedin.
// 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
{
"refCode": "REF123456789",
"trxCode": "ORDER_12345"
}refCode veya trxCode'dan en az birini göndermeniz yeterlidir.
{
"data": [
{
"trxStatus": "SUCCESS",
"trxCode": "ORDER_12345",
"refCode": "REF123456789",
"trxType": "SALES",
"trxAmount": 150.00,
"trxCurrency": "TRY"
}
],
"success": true,
"responseCode": "200",
"responseMessage": "SUCCESS"
}| Durum | Açıklama |
|---|---|
| SUCCESS | Başarılı işlem |
| PENDING | İşlem devam ediyor |
| FAILED | Baş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
{
"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.
{
"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:
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
{
"mpCode": "MP12345",
"apiSecretKey": "sx_value",
"cardNumber": "45467112",
"amount": 1000.00,
"isCardValid": false
}| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
| mpCode | String | ✅ | Pazaryeri kodu |
| apiSecretKey | String | ✅ | SX değeri |
| cardNumber | String | ✅ | Kart numarasının ilk 6-8 hanesi veya tamamı |
| amount | BigDecimal | ✅ | İşlem tutarı |
| isCardValid | Boolean | ❌ | true ise kart geçerliliği kontrol edilir |
{
"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.
// 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
{
"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.
{
"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.
| autoComplete | Davranış |
|---|---|
| true | Varsayı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.
- 1CreatePayment
callbackUrlolarak kendi servisinizi verin. - 2Callback POSTForm sonucu
REFERENCE_CODEdahil servisinize POST edilir. - 3Kayıt oluşturunİşlemi kendi veritabanınıza yazın.
- 4ValidasyonKendi iş mantığı kontrollerinizi çalıştırın.
- 5CompletePaymentExternal
referenceCode+ satış SX ile tamamlayın. - 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.
{
"referenceCode": "qv6UkBD2m1Ora+tS6UHTW36hm0s4+0RG1pUsoAF6xBuM3cW8ZbIupXOYVpUW6983ZXKzL4qXdE01MEwD+ObnAnA6pOg=",
"apiSecretKey": "sx_value"
}| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
| referenceCode | String | ✅ | Callback'te REFERENCE_CODE alanında gelen Base64 değer — değiştirilmeden gönderilir, tek kullanımlıktır |
| apiSecretKey | String | ✅ | Satış 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.
{
"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
{
"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.
{
"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:
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