İçeriğe geç

Ödeme İşlemleri

Pazaryeri ödeme sistemi ile son kullanıcılardan kart ile ödeme alabilir, bu ödemeleri satıcılara ve pazaryerine komisyonlarına göre dağıtabilirsiniz.

Bu sayfada aşağıdaki işlemleri öğreneceksiniz:

  • Ödeme oluşturma (3D ve 3D’siz)
  • Ödeme durumu sorgulama
  • Saklı kart listesi çekme
  • Taksit bilgilerini çekme
  • Komisyon güncelleme

Yeni bir ödeme işlemi başlatır. Hem 3D Secure hem de 3D’siz işlemler için kullanılır.

TEST:

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

PROD:

POST 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",
"commissionRate": null,
"commissionAmount": null,
"mpCost": null,
"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
}
}
ParametreTipZorunluAçıklama
apiKeyStringHash hesaplama ile oluşturulan anahtar
apiSecretKeyStringSX değeri
trxCurrencyStringPara birimi kodu (TRY, USD, EUR)
trxAmountBigDecimalToplam işlem tutarı
trxCodeStringİşlem takip kodu (kendi referansınız)
trxTypeStringİşlem tipi: SALES
callbackUrlString3D sonucu post edilecek URL
marketplaceCodeStringPazaryeri kodu
ParametreTipZorunluAçıklama
cardHolderString✅*Kart üzerindeki isim (Saklı kart için opsiyonel)
cardNumberString✅*Kart numarası (Saklı kart için opsiyonel)
cvvString✅*CVV kodu (Saklı kart için opsiyonel)
expiryMonthString✅*Son kullanma ayı (Saklı kart için opsiyonel)
expiryYearString✅*Son kullanma yılı (Saklı kart için opsiyonel)
isThreeDBoolean3D Secure kullanılsın mı?
registerCardBooleanKart saklanacak mı? (Sadece 3D’li işlemlerde)
ParametreTipZorunluAçıklama
installmentIntegerTaksit sayısı (1 = tek çekim)
isFetchInstallmentsBooleanTaksit bilgisi Pay N Kolay’dan çekilecek mi?
encodedValueStringFetchPaymentInstallments’dan gelen encoded değer
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ı
ParametreTipZorunluAçıklama
shippingCostBigDecimalKargo ücreti
otherAmountBigDecimalDiğer ücretler
mpDiscountAmountBigDecimalPazaryeri indirim tutarı
totalDiscountAmountBigDecimalToplam indirim tutarı
Müşteri Kart Bilgileri (customerCardInfo)
Section titled “Müşteri Kart Bilgileri (customerCardInfo)”
ParametreTipZorunluAçıklama
mpCustomerKeyString✅*Müşteri kimliği (TCKN/Cep/Pasaport) - Kart saklama için zorunlu
cardAliasStringKart takma adı (saklama için)
cardTranIdStringSaklı kart ID’si (saklı kart ile ödeme için)
cardTokenStringSaklı kart token’ı (saklı kart ile ödeme için)
{
"data": {
"refCode": "REF123456789",
"trxCode": "ORDER_12345",
"form": "PGh0bWw+...3D HTML Form Base64..."
},
"success": true,
"responseCode": "200",
"responseMessage": "SUCCESS"
}
ParametreTipAçıklama
refCodeStringPay N Kolay referans kodu
trxCodeStringSizin gönderdiğiniz işlem kodu
formStringBase64 encoded HTML form (3D işlemlerde dolu)
sequenceDiagram
participant Client as Müşteri Tarayıcı
participant Your as Sizin Sunucu
participant PNK as Pay N Kolay
participant Bank as Banka 3D
Client->>Your: Ödeme Formu Gönder
Your->>PNK: CreatePayment (isThreeD=true)
PNK->>Your: form (Base64 HTML)
Your->>Your: Base64 Decode
Your->>Client: HTML Form Render
Client->>Bank: 3D Doğrulama
Bank->>Client: SMS/OTP
Client->>Bank: Kod Gir
Bank->>Your: callbackUrl'e POST
Your->>Your: Hash Doğrula
Your->>Client: Sonuç Sayfası
// Yanıttaki form'u decode et
const response = await createPayment(paymentData);
if (response.success && response.data.form) {
// Base64 decode
const htmlForm = Buffer.from(response.data.form, 'base64').toString('utf-8');
// HTML'i müşteriye göster
res.send(htmlForm);
}

3D işlem tamamlandığında callbackUrl adresinize aşağıdaki veriler POST edilir:

app.post('/payment-callback', (req, res) => {
const {
trxCode,
trxAmount,
authAmount,
commissionRate,
authCode,
bankMessage,
installment,
responseMessage,
referenceCode,
currencyCode,
hash,
responseCode,
commissionAmount,
timestamp,
issuerBankCode,
installmentFeeRate,
installmentFeeAmount,
cardType,
paymentSystem
} = req.body;
// Hash doğrula
const calculatedHash = calculateCallbackHash({
timestamp,
referenceCode,
trxCode,
authAmount,
responseCode
}, apiSecretKey);
if (calculatedHash !== hash) {
return res.status(400).send('Invalid hash');
}
// Başarılı ödeme
if (responseCode === '00' || responseCode === '0000') {
// Siparişi onayla
updateOrderStatus(trxCode, 'PAID');
} else {
// Hata durumu
updateOrderStatus(trxCode, 'FAILED');
}
res.status(200).send('OK');
});

Ödeme işleminin durumunu sorgular.

TEST:

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

PROD:

POST https://api.paynkolay.com.tr/marketplace/v1/payment/status
{
"refCode": "REF123456789",
"trxCode": "ORDER_12345"
}
{
"data": [
{
"trxStatus": "SUCCESS",
"trxCode": "ORDER_12345",
"refCode": "REF123456789",
"trxType": "SALES",
"trxAmount": 150.00,
"trxCurrency": "TRY"
}
],
"success": true,
"responseCode": "200",
"responseMessage": "SUCCESS"
}
KodAçıklama
SUCCESSBaşarılı işlem
PENDINGİşlem devam ediyor
FAILEDBaşarısız işlem
CANCELLEDİptal edilmiş
REFUNDEDİade yapılmış

Müşteriye ait saklı kartları listeler.

TEST:

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

PROD:

POST https://api.paynkolay.com.tr/marketplace/v1/payment/storedCardList
{
"mpCode": "MP12345",
"apiSecretKey": "sx_value",
"mpCustomerKey": "12345678901",
"apiKey": "calculated_api_key"
}
{
"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"
}
// Önce saklı kartları çek
const cards = await getStoredCardList({
mpCode: 'MP12345',
apiSecretKey: 'sx',
mpCustomerKey: '12345678901',
apiKey: calculateApiKey()
});
// Kullanıcıya kartları göster, seçim yaptır
const selectedCard = cards.data.storedCardList[0];
// Saklı kart ile ödeme
await createPayment({
// ... diğer parametreler
bankCard: {
isThreeD: true,
registerCard: false
// Kart bilgileri GÖNDERİLMEZ
},
customerCardInfo: {
mpCustomerKey: '12345678901',
cardTranId: selectedCard.cardTranId, // VEYA
cardToken: selectedCard.cardToken
}
});

Taksit seçeneklerini Pay N Kolay’dan çeker.

TEST:

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

PROD:

POST https://api.paynkolay.com.tr/marketplace/v1/payment/fetchInstallments
{
"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
{
"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"
}
// 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
});

Ödeme işleminin komisyon bilgilerini günceller. Sadece işlem günü içinde kullanılabilir.

TEST:

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

PROD:

POST 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
}
]
}
{
"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"
}
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();
// 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
}
}

Ödeme işlemlerini öğrendikten sonra:

  1. Ödeme Değişiklikleri - İptal, iade işlemleri
  2. Masterpass Entegrasyonu - Alternatif ödeme yöntemleri
  3. Raporlama - İşlem raporları