API Dokümanı - Taksit Bilgisi Paynkolay'a Ait
Bu API’nin kullanımında önce taksitler çağırılır. Taksitleri çağırmak için sx, amount, cardNumber, hosturl, iscardvalid değişkenleri “https://paynkolaytest.nkolayislem.com.tr/Vpos/Payment/PaymentInstallments” adresine Body’de form-data olarak POST edilir.
Sadece BIN numarası ile (kartın ilk 8 hanesi ile) taksit sorgulamak için iscardvalid parametresi “false” olarak gönderilmeli, ya da hiç gönderilmemelidir.
Postman collection’ını indirmek için tıklayınız. Örnek kodları Postman Code sinppet’inde görebilirsiniz.

PaymentInstallments servisinden gelen EncodedValue tutar bilgisi AUTHORIZATION_AMOUNT ve taksit bilgisi INSTALLMENT diğer değişkenlerle birlikte Payment Servis’ine Body’de form-data olarak POST edilir. (EncodedValue, installmentNo, amount, sx, clientRefCode, successUrl, failUrl, amount, installmentNo, cardHolderName, month, year, cvv, cardNumber, EncodedValue, use3D, transactionType, hosturl, rnd, hashData, environment).
- Payment Servis linki: “https://paynkolaytest.nkolayislem.com.tr/Vpos/Payment/Payment” İlgili tüm değişkenleri Postman collection’ından görebilirsiniz.

- İşlem 3D değilse bu aşamada ödeme alınır. İşlem sonlanır.
Response Dönüş Parametreleri Payment servisine POST edildiğinde, 3D true ise 3D formu gelecektir. Bu formu şu şekilde ekranda çalıştırabilirsiniz:
<?php
// --- Helper Function ---function getClientIpAddress(): string{ $headers = [ 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR' ];
foreach ($headers as $header) { if (isset($_SERVER[$header])) { $ipList = explode(',', $_SERVER[$header]); $ip = trim($ipList[0]); if (filter_var($ip, FILTER_VALIDATE_IP)) { return $ip; } } } return 'UNKNOWN';}
// --- Configuration & Data Preparation ---
// 1. Credentials & URLs$sx = "118591467|bScbGDYCtPf7SS1N6PQ6/+58rFhW1WpsWINqvkJFaJlu6bMH2tgPKDQtjeA5vClpzJP24uA0vx7OX53cP3SgUspa4EvYix+1C3aXe++8glUvu9Oyyj3v300p5NP7ro/9K57Zcw==";$merchantSecretKey = "_YckdxUbv4vrnMUZ6VQsr";$customerKey = "";$successUrl = "https://paynkolay.com.tr/test/success";$failUrl = "https://paynkolay.com.tr/test/fail";
// 2. Transaction Data$amount = "6.00";$clientRefCode = "789456|AB76";$rnd = date("d-m-Y H:i:s");$cardHolderIP = getClientIpAddress();$merchantCustomerNo="1234567890";
// 3. Hash Calculation$hashstr = $sx . "|" . $clientRefCode . "|" . $amount . "|" . $successUrl . "|" . $failUrl . "|" . $rnd . "|" . $customerKey . "|" . $merchantSecretKey;
$hash = mb_convert_encoding($hashstr, 'UTF-8');$hashedBytes = hash("sha512", $hash, true);$hashDataV2 = base64_encode($hashedBytes);
// --- Step 1: Query Installments ---
$curl = curl_init();
curl_setopt_array($curl, array( CURLOPT_URL => 'https://paynkolaytest.nkolayislem.com.tr/Vpos/Payment/PaymentInstallments', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'sx' => $sx, 'amount' => $amount, 'cardNumber' => '4546711234567894', 'hosturl' => 'https://yoursite.com', 'iscardvalid' => 'false' ),));
$response = curl_exec($curl);$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);curl_close($curl);
$encodedValue = null;$selectedInstallmentCount = null;
if ($httpCode == 200) { $installmentData = json_decode($response, true);
// CHANGED: Access the first item in the PAYMENT_BANK_LIST array // We use [0] to get the first installment option ("Tek Çekim" / Installment: 1) $firstOption = $installmentData['PAYMENT_BANK_LIST'][0] ?? null;
if ($firstOption) { $encodedValue = $firstOption['EncodedValue'] ?? null; $selectedInstallmentCount = $firstOption['INSTALLMENT'] ?? '1'; // Default to 1 if missing } else { echo "Error: PAYMENT_BANK_LIST is empty or invalid.\n"; }
} else { echo "Error retrieving installments. HTTP Code: $httpCode. Response: " . htmlspecialchars($response) . "\n";}
// --- Step 2: Make Payment ---
if (isset($encodedValue)) { $paymentCurl = curl_init();
curl_setopt_array($paymentCurl, array( CURLOPT_URL => 'https://paynkolaytest.nkolayislem.com.tr/Vpos/Payment/Payment', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'EncodedValue' => $encodedValue, 'installmentNo' => $selectedInstallmentCount, // Dynamically set from the selected option 'amount' => $amount, 'sx' => $sx, 'clientRefCode' => $clientRefCode, 'successUrl' => $successUrl, 'failUrl' => $failUrl, 'cardHolderName' => 'John Doe', 'month' => '12', 'year' => '2026', 'cvv' => '123', 'cardNumber' => '4546711234567894', 'use3D' => 'true', 'transactionType' => 'SALES', 'cardHolderIP' => $cardHolderIP, 'rnd' => $rnd, 'hashDatav2' => $hashDataV2, 'environment' => 'API', 'merchantCustomerNo' => $merchantCustomerNo ), ));
$paymentResponse = curl_exec($paymentCurl); $paymentHttpCode = curl_getinfo($paymentCurl, CURLINFO_HTTP_CODE); curl_close($paymentCurl);
if ($paymentHttpCode == 200) { // Decode JSON response $json = json_decode($paymentResponse, true); if (isset($json['BANK_REQUEST_MESSAGE'])) { echo $json['BANK_REQUEST_MESSAGE']; } else { echo "BANK_REQUEST_MESSAGE not found in response.\n"; } } else { echo "Error in payment. HTTP Code: $paymentHttpCode. Response: " . htmlspecialchars($paymentResponse) . "\n"; }}?>using Microsoft.AspNetCore.Mvc;using System.Security.Cryptography;using System.Text;using System.Text.Json;using System.Text.Json.Nodes;using System.Net; // Required for IPAddress
namespace dotNET_apiv0.Controllers{ [ApiController] [Route("[controller]")] public class PaymentController : ControllerBase { private readonly IHttpClientFactory _httpClientFactory;
public PaymentController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; }
[HttpGet("process")] public async Task<IActionResult> ProcessPayment() { // --- Helper: Get IP Address using your custom method --- string clientIp = GetClientIpAddress();
// --- Configuration --- string sx = "118591467|bScbGDYCtPf7SS1N6PQ6/+58rFhW1WpsWINqvkJFaJlu6bMH2tgPKDQtjeA5vClpzJP24uA0vx7OX53cP3SgUspa4EvYix+1C3aXe++8glUvu9Oyyj3v300p5NP7ro/9K57Zcw=="; string merchantSecretKey = "_YckdxUbv4vrnMUZ6VQsr"; string customerKey = ""; string successUrl = "https://paynkolay.com.tr/test/success"; string failUrl = "https://paynkolay.com.tr/test/fail";
// --- Transaction Data --- string amount = "6.00"; string clientRefCode = "789456|AB76"; string rnd = DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss"); string merchantCustomerNo = "1234567890";
// --- Hash Calculation --- string hashStr = $"{sx}|{clientRefCode}|{amount}|{successUrl}|{failUrl}|{rnd}|{customerKey}|{merchantSecretKey}"; string hashDataV2;
using (SHA512 sha512 = SHA512.Create()) { byte[] bytes = Encoding.UTF8.GetBytes(hashStr); byte[] hashBytes = sha512.ComputeHash(bytes); hashDataV2 = Convert.ToBase64String(hashBytes); }
// Create HTTP Client var client = _httpClientFactory.CreateClient();
// --- Step 1: Query Installments --- var installmentContent = new MultipartFormDataContent { { new StringContent(sx), "sx" }, { new StringContent(amount), "amount" }, { new StringContent("4546711234567894"), "cardNumber" }, { new StringContent("https://yoursite.com"), "hosturl" }, { new StringContent("false"), "iscardvalid" } };
var installmentRes = await client.PostAsync("https://paynkolaytest.nkolayislem.com.tr/Vpos/Payment/PaymentInstallments", installmentContent); string installmentBody = await installmentRes.Content.ReadAsStringAsync();
string? encodedValue = null; string selectedInstallmentCount = "1";
if (installmentRes.IsSuccessStatusCode) { var jsonNode = JsonNode.Parse(installmentBody); var paymentBankList = jsonNode?["PAYMENT_BANK_LIST"]?.AsArray(); var firstOption = paymentBankList?.FirstOrDefault();
if (firstOption != null) { var encodedNode = firstOption["EncodedValue"]; if (encodedNode != null && encodedNode.GetValueKind() != JsonValueKind.Null) { encodedValue = encodedNode.GetValue<string>(); }
var installmentNode = firstOption["INSTALLMENT"]; if (installmentNode != null && installmentNode.GetValueKind() != JsonValueKind.Null) { selectedInstallmentCount = installmentNode.ToString(); } } else { return Content("Error: PAYMENT_BANK_LIST is empty or invalid.", "text/plain"); } } else { return Content($"Error retrieving installments. HTTP Code: {installmentRes.StatusCode}. Response: {installmentBody}", "text/plain"); }
// --- Step 2: Make Payment --- if (!string.IsNullOrEmpty(encodedValue)) { var paymentContent = new MultipartFormDataContent { { new StringContent(encodedValue), "EncodedValue" }, { new StringContent(selectedInstallmentCount), "installmentNo" }, { new StringContent(amount), "amount" }, { new StringContent(sx), "sx" }, { new StringContent(clientRefCode), "clientRefCode" }, { new StringContent(successUrl), "successUrl" }, { new StringContent(failUrl), "failUrl" }, { new StringContent("Tuna Çınar"), "cardHolderName" }, { new StringContent("12"), "month" }, { new StringContent("2026"), "year" }, { new StringContent("000"), "cvv" }, { new StringContent("4546711234567894"), "cardNumber" }, { new StringContent("true"), "use3D" }, { new StringContent("SALES"), "transactionType" }, { new StringContent(clientIp), "cardHolderIP" }, // Uses the new helper method result { new StringContent(rnd), "rnd" }, { new StringContent(hashDataV2), "hashDatav2" }, { new StringContent("API"), "environment" }, { new StringContent(merchantCustomerNo), "merchantCustomerNo" } };
var paymentRes = await client.PostAsync("https://paynkolaytest.nkolayislem.com.tr/Vpos/Payment/Payment", paymentContent); string paymentBody = await paymentRes.Content.ReadAsStringAsync();
if (paymentRes.IsSuccessStatusCode) { var paymentJson = JsonNode.Parse(paymentBody); string? bankMessage = paymentJson?["BANK_REQUEST_MESSAGE"]?.ToString();
if (!string.IsNullOrEmpty(bankMessage)) { return Content(bankMessage, "text/html", Encoding.UTF8); }
return Content($"BANK_REQUEST_MESSAGE not found. Full Response: {paymentBody}", "text/plain"); }
return Content($"Error in payment. HTTP Code: {paymentRes.StatusCode}. Response: {paymentBody}", "text/plain"); }
return Content("EncodedValue could not be retrieved from the bank (it was null). Payment step skipped.", "text/plain"); }
/// <summary> /// Gets the client's IP address by checking various headers, similar to the PHP example. /// This is more reliable when the application is behind a proxy or load balancer. /// </summary> /// <returns>The client's IP address as a string, or "UNKNOWN".</returns> private string GetClientIpAddress() { var headers = new[] { "Client-IP", "X-Forwarded-For", "X-Forwarded", "X-Cluster-Client-IP", "Forwarded-For", "Forwarded" };
foreach (var header in headers) { var ipHeaderValue = HttpContext.Request.Headers[header].FirstOrDefault();
if (!string.IsNullOrEmpty(ipHeaderValue)) { var ipList = ipHeaderValue.Split(',').Select(ip => ip.Trim()); var firstIp = ipList.FirstOrDefault();
if (firstIp != null && IPAddress.TryParse(firstIp, out _)) { return firstIp; } } }
var remoteIp = HttpContext.Connection.RemoteIpAddress; if (remoteIp != null) { // Map to IPv4 to ensure format like 127.0.0.1 instead of ::ffff:127.0.0.1 return remoteIp.MapToIPv4().ToString(); }
return "UNKNOWN"; } }}import requestsimport jsonimport time
def main(): # Step 1: Query Installments installment_url = "https://paynkolaytest.nkolayislem.com.tr/Vpos/Payment/PaymentInstallments"
installment_data = { 'sx': '118591467|bScbGDYCtPf7SS1N6PQ6/+58rFhW1WpsWINqvkJFaJlu6bMH2tgPKDQtjeA5vClpzJP24uA0vx7OX53cP3SgUspa4EvYix+1C3aXe++8glUvu9Oyyj3v300p5NP7ro/9K57Zcw==', 'amount': '6.00', 'cardNumber': '4546711234567894', 'hosturl': 'https://yoursite.com', 'iscardvalid': 'false' # Use false to query with BIN only }
try: installment_response = requests.post(installment_url, data=installment_data)
if installment_response.status_code == 200: installment_result = installment_response.json() encoded_value = installment_result['EncodedValue'] print("Installments retrieved successfully") print(f"EncodedValue: {encoded_value}")
# Step 2: Make Payment with EncodedValue payment_url = "https://paynkolaytest.nkolayislem.com.tr/Vpos/Payment/Payment"
payment_data = { 'EncodedValue': encoded_value, 'installmentNo': '2', 'amount': '6.00', 'sx': '118591467|bScbGDYCtPf7SS1N6PQ6/+58rFhW1WpsWINqvkJFaJlu6bMH2tgPKDQtjeA5vClpzJP24uA0vx7OX53cP3SgUspa4EvYix+1C3aXe++8glUvu9Oyyj3v300p5NP7ro/9K57Zcw==', 'clientRefCode': '789456|AB76', 'successUrl': 'https://paynkolay.com.tr/test/success', 'failUrl': 'https://paynkolay.com.tr/test/fail', 'cardHolderName': 'John Doe', 'month': '12', 'year': '2026', 'cvv': '123', 'cardNumber': '4546711234567894', 'use3D': 'true', 'transactionType': 'SALES', 'cardHolderIP': '185.125.190.58', 'rnd': str(int(time.time())), # Random value for security 'hashDatav2': 'VM9LfJtJTjUesvqq9HQqCkuD6fYn+mhrn0WV5UCPU30VcI4BYRPzbhOs3EBDTCuwvndVsAEsqLFEClqZ3SbbIw==', 'environment': 'TEST' }
payment_response = requests.post(payment_url, data=payment_data)
if payment_response.status_code == 200: print("Payment request sent successfully") print(f"Response: {payment_response.text}")
# If use3D is true, the response will contain HTML form for 3D secure if '<form' in payment_response.text: print("3D Secure form received. Display this form to user:") with open('3d_form.html', 'w', encoding='utf-8') as f: f.write(payment_response.text) else: print(f"Error in payment: {payment_response.text}")
else: print(f"Error retrieving installments: {installment_response.text}")
except requests.exceptions.RequestException as e: print(f"Request exception: {e}") except json.JSONDecodeError as e: print(f"JSON decode error: {e}") except Exception as e: print(f"Exception: {e}")
if __name__ == "__main__": main()const axios = require('axios');const qs = require('querystring');const fs = require('fs');
async function main() { try { // Step 1: Query Installments const installmentUrl = 'https://paynkolaytest.nkolayislem.com.tr/Vpos/Payment/PaymentInstallments';
const installmentData = { 'sx': '118591467|bScbGDYCtPf7SS1N6PQ6/+58rFhW1WpsWINqvkJFaJlu6bMH2tgPKDQtjeA5vClpzJP24uA0vx7OX53cP3SgUspa4EvYix+1C3aXe++8glUvu9Oyyj3v300p5NP7ro/9K57Zcw==', 'amount': '6.00', 'cardNumber': '4546711234567894', 'hosturl': 'https://yoursite.com', 'iscardvalid': 'false' // Use false to query with BIN only };
const installmentResponse = await axios.post(installmentUrl, qs.stringify(installmentData), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
if (installmentResponse.status === 200) { const installmentResult = installmentResponse.data; const encodedValue = installmentResult.EncodedValue; console.log('Installments retrieved successfully'); console.log(`EncodedValue: ${encodedValue}`);
// Step 2: Make Payment with EncodedValue const paymentUrl = 'https://paynkolaytest.nkolayislem.com.tr/Vpos/Payment/Payment';
const paymentData = { 'EncodedValue': encodedValue, 'installmentNo': '2', 'amount': '6.00', 'sx': '118591467|bScbGDYCtPf7SS1N6PQ6/+58rFhW1WpsWINqvkJFaJlu6bMH2tgPKDQtjeA5vClpzJP24uA0vx7OX53cP3SgUspa4EvYix+1C3aXe++8glUvu9Oyyj3v300p5NP7ro/9K57Zcw==', 'clientRefCode': '789456|AB76', 'successUrl': 'https://paynkolay.com.tr/test/success', 'failUrl': 'https://paynkolay.com.tr/test/fail', 'cardHolderName': 'John Doe', 'month': '12', 'year': '2026', 'cvv': '123', 'cardNumber': '4546711234567894', 'use3D': 'true', 'transactionType': 'SALES', 'cardHolderIP': '185.125.190.58', 'rnd': Math.floor(Date.now() / 1000).toString(), // Random value for security 'hashDatav2': 'VM9LfJtJTjUesvqq9HQqCkuD6fYn+mhrn0WV5UCPU30VcI4BYRPzbhOs3EBDTCuwvndVsAEsqLFEClqZ3SbbIw==', 'environment': 'TEST' };
const paymentResponse = await axios.post(paymentUrl, qs.stringify(paymentData), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
if (paymentResponse.status === 200) { console.log('Payment request sent successfully'); console.log(`Response: ${paymentResponse.data}`);
// If use3D is true, the response will contain HTML form for 3D secure if (paymentResponse.data.includes('<form')) { console.log('3D Secure form received. Display this form to user:'); fs.writeFileSync('3d_form.html', paymentResponse.data); } } else { console.log(`Error in payment: ${paymentResponse.data}`); }
} else { console.log(`Error retrieving installments: ${installmentResponse.data}`); }
} catch (error) { if (error.response) { console.log(`HTTP Error ${error.response.status}: ${error.response.data}`); } else { console.log(`Exception: ${error.message}`); } }}
main();
- Gelen 3D formu ekrana basıldığında ilgili bankanın 3D secure penceresi açılır ve burada 3D secure şifresi girilmesi beklenir.