3D Secure ile Ödeme İşlemi

C# Örneği
// API isteğinin yapılacağı endpoint linki
var api_url = "https://yourdomain.com/api/live";

// API hesabına ait güvenlik anahtarı
var secret_key = "İmzaPos panelinden aldığınız güvenlik anahtarı";

// Parametreler
var parameters = new Dictionary<string, string>
{
// İmzaPos panelinden aldığınız bayi kodu
    { "merchant", "Bayi kodunuz" },
    { "mode", "pay3d" },
    { "price", "25,55" },
    { "card_holder", "İsim soyad" },
    { "card_number", "1111222233334444" },
    { "card_month", "05" },
    { "card_year", "2024" },

    { "customer_ip", "192.168.1.0" },
    { "product_name", "Ürün veya hizmet adı" },
    { "callback", "https://yourdomain.com/return3d" },

    { "customer_firstname", "İsim" },
    { "customer_lastname", "Soyad" },
    { "customer_email", "[email protected]" },
    { "customer_phone", "+905554443322" },
};

// Parametreler başlıklarına göre alfabetik olarak sıralanır
var sortedParameters = parameters.OrderBy(k => k.Key);

// Parametreler birleştirilir.
var joinParameters = string.Join("ip", sortedParameters.Select(v=> v.Value));

// Parametreler hash'lenir.
var hashedParameters = ComputeSha256Hash(joinParameters + secret_key);

parameters.Add("hash", hashedParameters);

try
{
            var client = new HttpClient();
            var content = new FormUrlEncodedContent(parameters);
            var response = await client.PostAsync(api_url, content);

            // Değer alınır
            var responseString = await response.Content.ReadAsStringAsync();
}
catch (Exception)
{
            // Hata oluştu
    throw;
}

// SHA256 Metodu
static string ComputeSha256Hash(string rawData)
{
    using (SHA256 sha256Hash = SHA256.Create())
    {
            var bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));

            var builder = new StringBuilder();
            for (int i = 0; i < bytes.Length; i++)
            builder.Append(bytes[i].ToString("x2"));
                    
        return builder.ToString();
    }
}

3D Secure ile yapılan işlemlerde ek olarak callback parametresi de gönderilmelidir. İşlem tamamlanmadan önce banka ön ödeme ekranı açılır ve sms onayı istenir. Onay verildiğinde callback için verilen url'e yönlendirme yapılır.

Taksitli işlemler için installment parametresi gönderilmelidir. Eğer bu değer gönderilirse hangi bankadan taksit yapılacağının anlaşılması için bank parametresinin ve hangi pos ile işlem yapılacağının anlaşılması için pos bilgilerinin de gönderilmesi gerekir. Bu bilgileri nasıl alacağınızı öğrenmek için linkteki sayfayı inceleyebilirsiniz.

3D Secure işleminin adımları şu şekildedir:

- Ödeme işlemine ek olarak callback parametresi girilir. Bu alana girilen değer sms onayı sonrası dönülecek olan sayfanın url'i dir.

- Bilgiler gönderildiğinde eğer sorun yoksa banka ön onay sayfasının html'i geri dönüş parametresi olarak iletilir.

- Dönen html sayfayı tarayıcınıza html olarak yazdırmanız gereklidir. Bu sayede banka ön onay sayfası görünür ve kullanıcı işlemine devam eder.

- Eğer doğrulama şifresi hatasız bir biçimde girilirse response mesajını json formatında callback üzerinden alırsınız.

- 3D işlemi doğru sonuçlanmazsa html yerine dönüş değeri olarak JSON formatında veri alırsınız.

Parametreler

Parametre Zorunlu Açıklama
mode Zorunlu string Değer Pay3d olarak gönderilmelidir.
merchant Zorunlu string İmzaPos paneli üzerinden aldığınız bayi kodu alanını bu bölüme yazmalısınız.
price Zorunlu string Ödeme tutarını string olarak ve ondalık basamağı virgül ile ayırarak göndermelisiniz ör: 25,55 veya 25,00
currency Opsiyonel string İşlemin yapılacağı para birimi gönderilmezse TRY kabul edilir. Desteklenen para birimleri: TRY/USD/EUR
installment Opsiyonel integer Taksit sayısı bu bölüme girilmeli. 1'den yüksek değer girilirse taksitli işlem kabul edilir.
bank Opsiyonel integer Bu değer opsiyonel olmakla birlikte sadece taksitli işlemler yapıldığında zorunlu hale gelir. İşlemin hangi banka üzerinden yapılacağını kodunu girerek iletebilirsiniz. Kodu nasıl alacağınızı öğrenmek için linkteki sayfayı ziyaret edebilirsiniz.
pos Opsiyonel integer Bu değer opsiyonel olmakla birlikte sadece taksitli işlemler yapıldığında zorunlu hale gelir. İşlemin hangi pos üzerinden yapılacağını kodunu girerek iletebilirsiniz. Kodu nasıl alacağınızı öğrenmek için linkteki sayfayı ziyaret edebilirsiniz.
lang Opsiyonel string Bu değer varsayılan olarak tr'dir. Eğer cevabı farklı bir dilde almak istiyorsanız bu bölüme dil kodunu yazmalısınız. Desteklenenler: tr
customer_ip Zorunlu string İşlem yapan müşterinin IP adresini bu bölümde iletmelisiniz.
callback Zorunlu string 3D secure işlemi sonucunda dönülecek sayfanın adresi.
product_name Zorunlu string Bu bölüme eğer ödeme bir ürün için yapılıyorsa ürün adı, hizmet ise hizmet adını yazmalısınız.
card_holder Zorunlu string Kredi kartı üzerinde yazan isim soyisim
card_number Zorunlu string Kredi kartı numarası
card_month Zorunlu string Kart son kullanım tarihi ay değeri. ör: 08
card_year Zorunlu string Kart son kullanım tarihi yıl değeri. ör: 2024
card_ccv Zorunlu integer Kartın güvenlik numarası CCV
customer_firstname Zorunlu string İşlemi yapan kullanıcının ismi
customer_lastname Zorunlu string İşlemi yapan kullanıcının soy ismi
customer_email Zorunlu string İşlemi yapan kullanıcının e-posta adresi
customer_phone Zorunlu string İşlemi yapan kullanıcının telefon numarası
customer_tc Opsiyonel string İşlemi yapan kullanıcının tc kimlik numarası
custom_data Opsiyonel string Bu bölüme yazdığınız değer API cevabında size geri gönderilecektir.
trx_id Opsiyonel string Yapılan ödeme işlemini daha sonra sorgulamak için sadece bu işleme özel bir değer gönderebilirsiniz.
hash Zorunlu hash İşlemi yapan API kullanıcısının tespiti için bu parametrenin gönderilmesi zorunludur. Güvenlik için gönderilen tüm parametrelerin sha256 formatında hash'lenmesi gerekmektedir.

Hash (Güvenlik kodu) Üretilmesi

Hash bilgisi gönderilen bilgileri teyit amaçlı alınan şifrelenmiş bir değerdir. Gönderilen parametrelerin belli bir format üzerinde birleşmesi sonucu bu değer üretilir. Oluşturulan değer İmzaPos tarafında aynı işlemler yapıldığında üretilen değer ile aynı olmalıdır.
Bu değeri oluşturmak için izlenecek adımlar şu şekildedir:
1- Zorunlu tüm parametreler ve ek olarak opsiyonel eklenene parametrelerin gönderimi sağlanır
2- Parametreler isimlerine göre alfabetik olarak sıralanıp bir string değer olarak birleştirilir.
3- Her parametre arasına "ip" harfleri yazılır
4- Oluşturulan string değer sha256 hash formatına dönüştürülür.
5- İstek yapılan endpoint'in "hash" parametresinde bu değer gönderilir.