Skip to content

Secure Ödeme (Pay Smart 3D) ​

3D güvenli ödeme almak için bu API kullanılır. Kullanıcı, banka doğrulama sayfasına yönlendirilir ve SMS koduyla ödeme doğrulanır. Ödeme başarılı ise return_url'e başarısız ise cancel_url'e gidilir. İlgili response mesajı query params içerisinde döner.

İstek Bilgileri ​

  • Metot: POST (HTML form gönderimi olmalıdır, AJAX kullanılmamalıdır)
  • URL: https://staging.halkode.com.tr/ccpayment/api/paySmart3D
  • CANLI URL: https://app.halkode.com.tr/ccpayment/api/paySmart3D
  • Yetkilendirme: Bearer {token} Token Alma servisinden alınan değer

İstek Parametreleri (Body) ​

ParametreTipKoşulAçıklama
cc_holder_namestringZorunluKart sahibinin adı soyadı.
cc_nostringZorunluMaskelenmiş kart numarası (Örn: 123456******1234).
expiry_monthstringZorunluİki haneli ay (Örn: 08).
expiry_yearstringZorunluDört haneli yıl (Örn: 2028).
cvvstringZorunluKartın arkasındaki güvenlik kodu.
totaldoubleZorunluToplam tutar (Nokta ile ayrılmalı).
installments_numberintegerZorunluTaksit Tutarı
currency_codestringZorunluPara birimi kodu (Örn: TRY).
merchant_keystringZorunluÜye işyeri anahtarınız.
invoice_idstringZorunluSizin tarafınızdaki tekil sipariş ID.
invoice_descriptionstringBoş BırakılabilirSizin tarafınızdaki tekil sipariş ID.
hash_keystringZorunluGüvenlik imzası.
namestringZorunluİsim
surnamestringZorunluSoyisim
itemsarrayZorunluÜrün Sepeti
return_urlstringZorunluÖdeme başarılı ise dönüş yapılacak URL (HTML formatında olmalıdır)
cancel_urlstringZorunluÖdeme başarısız ise dönüş yapılacak URL (HTML formatında olmalıdır)
transaction_typestringOpsiyoneltransaction_type == "Auth" ise işlem tutarı karttan anında düşülür. transaction_type == "PreAuth" ise işlem tutarı karttan daha sonra düşülecektir. Default değeri "Auth"
payment_completed_bystringOpsiyonelpayment_completed_by == "app" ise işlem tutarı anında gerçekleşecektir. payment_completed_by == "Merchant" ise işlem tutarı üye iş yeri onayından sonra gerçekleşecektir. Default değeri app’dir.

Hash-Key Oluşturma ​

Hash Key, istek parametrelerinde yer alan invoice_id, merchant_key,currency_code,installments_number,total değerleri ve size ait benzersiz app_secret değerini kullanarak oluşturulması gereken benzersiz bir anahtardır. Aşağıda hash_key oluşturma yöntemi verilmiştir.

PHP Örnek Kodu
PHP
public static function hashGenerator($currency_code,$merchant_key,$invoice_id,$app_secret,$total,$installments_number)
{
       
  $data = $total . '|' . $installmentsNumber . '|' . $currency_code . '|' . $merchant_key . '|' . $invoice_id;
  $iv = substr(sha1(mt_rand()), 0, 16);
  $password = sha1($app_secret);
  $salt = substr(sha1(mt_rand()), 0, 4);
  $saltWithPassword = hash('sha256', $password . $salt);
  $encrypted = openssl_encrypt(
      $data, 'aes-256-cbc', $saltWithPassword, 0, $iv
  );
  $msg_encrypted_bundle = $iv . ':' . $salt . ':' . $encrypted;
  $msg_encrypted_bundle = str_replace('/', '__', $msg_encrypted_bundle);
  return response()->json(['Hash Key' =>$msg_encrypted_bundle ]);
}

Örnek İstek (Request) ​

json
{

    "cc_holder_name":"John Dao",
    "cc_no":"4155141122223339",
    "expiry_month":"12",
    "expiry_year":"2028",
    "cvv":"555",
    "currency_code":"TRY",
    "installments_number": 1,
    "invoice_id":"111112324115312",
    "invoice_description":" INVOICE TEST DESCRIPTION",
    "total":22.00,
    "items": [
        {
            "name": "Item3",
            "price": 22,
            "quantity": 1,
            "description": "item3 description"
        }
    ],
    "name" : "John",
    "surname" : "Dao",
    "merchant_key":"$2y$10$...",
    "hash_key" : "hesaplanan hash ",
    "return_url": "http://merchant-domain.com/success", // html sayfa olmalıdır
    "cancel_url": "http://merchant-domain.com/error", // html sayfa olmalıdır
    "payment_completed_by": "app", // Opsiyonel 
    "transaction_type": "Auth" // Opsiyonel 

}

Başarılı Yanıt ​

html
<form id="the-form" method="post" action="https://staging.halkode.com.tr/ccpayment/sr/redirect-to-bank">
  <input type="hidden" name="invoice_id" value="169262955487156" />
  <input type="hidden" name="amount" value="1.00" />
  <input type="hidden" name="client_id" value="31083" />
  <input type="hidden" name="return_url" value="https://staging.halkode.com.tr/ccpayment/payment/dummy_return_url?brand_order_id=169262955487156" />
</form>
<script type="text/javascript">
  window.onload = function() {
    document.getElementById("the-form").action = "";
    document.getElementById("the-form").submit();
  }
</script>
  • Başarılı yanıt aldığımız durumda ilgili banka sayfası HTML formatında döner.

Örnek Banka Sayfası

Örnek Banka Sayfası

3D Ödeme Sonuç süreci ​

3D Secure ödeme akışında, kullanıcı banka doğrulama sayfasındaki (OTP) işlemini tamamladıktan sonra sistem otomatik olarak üye işyerinin belirttiği return_url adresine yönlendirme yapar.

1. Yönlendirme ve Veri Aktarımı

Önemli Not

3D Secure doğrulaması tamamlandığında, işlem sonucu ve detayları GET metodu kullanılarak Query String (URL Parametreleri) yapısında return_url adresinize iletilir.

Örnek Dönüş URL Yapısı: http://merchant-domain.com/success?order_no=1626...&invoice_id=deneme123&status_code=100&status_description=Payment+Successfully+Completed&payment_status=1&hash_key=...

2. Dönüş Parametreleri

return_url adresine gelen tüm parametreler ve açıklamaları aşağıdadır:

ParametreAçıklama
status_codeİşlem sonuç kodu (Başarılı işlem için: 100).
status_descriptionİşlemin durumunu açıklayan metin.
order_noHalkÖde sistemindeki tekil işlem numarası.
invoice_idSizin tarafınızdan gönderilen sipariş/fatura ID.
payment_statusÖdeme durumu (1: Başarılı, 0: Başarısız).
transaction_typeİşlem tipi (Örn: Auth veya PreAuth).
payment_methodÖdeme yöntemi (1: Kredi Kartı).
credit_card_noMaskelenmiş kart numarası (Örn: 658761****9656).
auth_codeBankadan dönen onay kodu.
merchant_commissionİşlemden kesilen üye işyeri komisyon tutarı.
user_commissionSon kullanıcıya yansıtılan komisyon tutarı.
md_status3D Secure doğrulama durumu.
hash_keyYanıtın güvenliğini doğrulamak için üretilen imza.

3. Ödeme Başarısız Senaryosu (OTP Doğrulanamadı)

Önemli Not

3D Secure doğrulaması tamamlanmadığında veya işlem sonucu hatalı olduğunda işlem sonucu ve detayları GET metodu kullanılarak Query String (URL Parametreleri) yapısında cancel_url adresinize iletilir.

Örnek Dönüş URL Yapısı: http://merchant-domain.com/error?order_no=VP17736419522411358&order_id=VP17736419522411358&invoice_id=tksprod202603061436deneo&status_code=41&status_description=transaction+failed

Başarısız Yanıt ​

json

{
    "status_code": 41,
    "status_description": "Gecersiz hesap numarasi.",
    "data": {
        "order_no": "VP17733132019692187",
        "order_id": "VP17733132019692187",
        "invoice_id": "Abcd1245671",
        "credit_card_no": "413226****0003",
        "transaction_type": "Auth",
        "payment_status": 0,
        "payment_method": 1,
        "error_code": "14",
        "error": "Gecersiz hesap numarasi.",
        "auth_code": null,
        "merchant_commission": 0.66,
        "user_commission": 0,
        "merchant_commission_percentage": 2.99,
        "merchant_commission_fixed": 0,
        "hash_key": "342fa9539f23ea16:5981:n8A4HxE2rGyk2RHp6J+L8M6PSOF1fnAzsGv4ybylad90oC6c5KjOxXKtI__RAjQmb",
        "original_bank_error_code": "14",
        "original_bank_error_description": "Gecersiz hesap numarasi."
    }
}

Kod Örnekleri ​

PHP Örnek Kodu
PHP

<?php

function sendRequest( $data, $token) {
    $baseUrl = "https://staging.halkode.com.tr/ccpayment/api/paySmart3D"
    $url = $baseUrl . $endpoint;
    
    $ch = curl_init($url);
    $payload = json_encode($data);
    
    $headers = [
        'Content-Type: application/json',
        'Accept: application/json',
        'Authorization: Bearer ' . $token
    ];
    
   
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    return json_decode($response, true);
}

//Token get token servisinden alınır. 

$authData = [
    "cc_holder_name":"John Dao",
    "cc_no":"4155141122223339",
    "expiry_month":"12",
    "expiry_year":"20",
    "cvv":"555",
    "currency_code":"TRY",
    "installments_number": 1,
    "invoice_id":"111112324115312",
    "invoice_description":" INVOICE TEST DESCRIPTION",
    "total":22.00,
    "items": [
        {
            "name": "Item3",
            "price": 22,
            "quantity": 1,
            "description": "item3 description"
        }
    ],
    "name" : "John",
    "surname" : "Dao",
    "merchant_key":"$2y$10$...",
    "hash_key" : "hesaplanan hash "
];

$authResult = sendRequest($authData,$token);
print_r($authResult);
?>
C# /.NET Örnek Kodu
C#

using System.Text;
using System.Text.Json;
using System.Net.Http.Headers;

public class HalkodeClient
{
    private static readonly HttpClient client = new HttpClient();

    public async Task<string> PaySmart3D(object paymentData, string token)
    {
        var url = "https://staging.halkode.com.tr/ccpayment/api/paySmart3D";
        
        var json = JsonSerializer.Serialize(paymentData);
        var content = new StringContent(json, Encoding.UTF8, "application/json");

        client.DefaultRequestHeaders.Clear();
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var response = await client.PostAsync(url, content);
        return await response.Content.ReadAsStringAsync();
    }
}

// Örnek Kullanım
var paymentData = new {
    cc_holder_name = "Test kart",
    cc_no = "444444******4444",
    expiry_month = "12",
    expiry_year = "2024",
    cvv = "555",
    currency_code = "TRY",
    installments_number = 1,
    invoice_id = "Abcd1245671",
    invoice_description = "INVOICE TEST DESCRIPTION",
    total = 22.00,
    items = new[] {
        new { name = "Item3", price = 22, quantity = 1, description = "item3 description" }
    },
    name = "John",
    surname = "Dao",
    merchant_key = "$2y$10$WxwG144ioxqD77COQCNV0...",
    hash_key = "d02ee95a43f3a1a2:d52a:EwVzFl..."
};

var halkode = new HalkodeClient();
var result = await halkode.PaySmart3D(paymentData, "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9...");
JavaScript / NodeJs Örnek Kodu
JavaScript

const axios = require('axios');

async function paySmart3D(paymentData, token) {
    try {
        const config = {
            method: 'post',
            url: 'https://staging.halkode.com.tr/ccpayment/api/paySmart3D',
            headers: { 
                'Content-Type': 'application/json', 
                'Accept': 'application/json',
                'Authorization': 'Bearer ' + token
            },
            data: paymentData
        };

        const response = await axios(config);
        return response.data;
    } catch (error) {
        console.error('Hata:', error.response ? error.response.data : error.message);
    }
}

const paymentData = {
    "cc_holder_name": "Test kart",
    "cc_no": "444444******4444",
    "expiry_month": "12",
    "expiry_year": "2024",
    "cvv": "555",
    "currency_code": "TRY",
    "installments_number": 1,
    "invoice_id": "Abcd1245671",
    "invoice_description": "INVOICE TEST DESCRIPTION",
    "total": 22.00,
    "items": [
        {
            "name": "Item3",
            "price": 22,
            "quantity": 1,
            "description": "item3 description"
        }
    ],
    "name": "John",
    "surname": "Dao",
    "merchant_key": "$2y$10$WxwG144ioxqD77COQCNV0...",
    "hash_key": "d02ee95a43f3a1a2:d52a:EwVzFl..."
};

paySmart3D(paymentData, "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9...").then(console.log);