İlginizi Çekebilir
  1. Ana Sayfa
  2. C Sharp

C# Kredi Kartı Doğrulama – Luhn Algoritması

C# Kredi Kartı Doğrulama – Luhn Algoritması
+ - 3

Merhabalar, C# Kredi Kartı Doğrulama – Luhn Algoritması dersi ile C# Eğitim Setime devam ediyorum. Bu dersimizde Luhn algoritmasını kullanarak Kredi Kartı numarasının geçerli bir numara olup olmadığının kontrolünü yapacağız.

C# Kredi Kartı Doğrulama – Luhn Algoritması

Luhn Algoritması Nedir?

Luhn Algoritması‘nın temeli 1950’lere kadar dayanmaktadır.  Hans Peter Luhn ve IBM ortak çalışmaları ile 1954 yılında geliştirilen bu algoritma aynı zamanda Luhn Check yada Mod10 Check olarak da bilinmektedir.

Luhn algoritmasına göre hesaplama şu şekildedir;

  1. Kart numarası 16 karakter olmalıdır
  2. Karakterlerin hepsi sayı olmalıdır.
  3. Çift hanelerde yer alan rakamların hepsi toplanır.
  4. Tek hanelerde yer alan rakamlar önce iki ile çarpılır. Çarpımın sonucu 10’dan büyük ise sayının basamakları toplanır. Tüm sonuçlar toplanır.
  5. İki toplam sonucu birbirleri ile tekrar toplanır. Bu toplamın MOD10’u 0 ise yani 10 tam olarak bölünüyor ise bu kredi kart numarası geçerli bir numaradır..

Aşağıda, internette araştırma yaparken bulduğum bir resmi sizlerle paylaşıyorum. Bu görseli inceleyerek yukarıdaki adımları daha net algılayabilirsiniz. Bu görselde hatalı bir kart numarası üzerinde yapılan işlemler görülmektedir.

C# Kredi Kartı Doğrulama - Luhn Algoritması

Şimdi kodlarımızı yazmaya geçelim.

 

C# Luhn Algoritması

Şartları kontrol ettiğimizde bize gerekli olan kontroller;

  1. Girilen kart numarası 16 karakter olmalı
  2. Girilen tüm karakterler rakam olmalı

 

Öncelikle girilen kart numarasını özel karakterlerden temizleyen bir metot yazacağız. İkinci olarak yukarıda verdiğim 2 maddeyi kontrol edecek metotları yazacağız. Son olarak da bir sayının basamaklarını toplama işlemini yapacak bir metot yazacağız. Bu işlemleri metotlara ayırmamızın sebebi hem bu metotları başka işlemler için de kullanılabilir kılmak hem de kodları daha anlaşılır kılmak içindir. Aksi takdirde kodlar çok karışık görünecektir.

Kart no temizleme

        string KartNoTemizle(string text)
        {
            text = text.Replace("-", "").Replace(" ", "").Replace("(", "").Replace(")", "").Replace("_", "");
            return text;
        }

Ben burada tre (“-“), boşluk (” “), parantezler ( “(” , “)” )  ve alt tre ( “-” ) karakterlerinin ayraçlar olarak kullanılabilir karakterler olarak gördüğümden en başta temizlemek istedim. Yoksa sorun değil var ise temizlenecekler.

Ana kontrolü yapan metodumuzda kullanacağız.

 

Kart no uzunluk kontrolü

bool KartNoUzunlukKontrol(string kartno)
        {
            if (kartno.Length == 16)
                return true;
            else
                return false;
        }

Burada, girilen (temizlendikten sonra) kart numarasının karakter sınırına uyup uymadığını kontrol ediyoruz.

 

Sayısal değer kontrolü

        bool SayisalDegerKontrol(string deger)
        {
            foreach (char chr in deger)
            {
                if (!Char.IsNumber(chr)) return false;
            }
            return true;
        }

Burada girilen (temizlendikten sonra) kart numarasındaki karakterlerin sayısal değer olup olmadığını kontrol ediyoruz.

 

Sayının basamaklarını toplama

        int SayiBasamaklariTopla(int sayi)
        {
            int toplam = 0;
            while (sayi > 0)
            {
                toplam += sayi % 10;
                sayi /= 10;
            }
            return toplam;
        }

Sayının basamaklarını toplayan metodumuz.

Bize gerekli olan tüm metotları verdikten sonra yukarıdaki kontrolleri yapacak olan ana metodumuzu verelim.

BİLGİ: Yukarıdaki metotları ayrı ayrı vermiş olmamızın en büyük faydası, örneğin sayısal değer kontrolünü başka bir yerde de kullanabiliriz. Ya da sayının basamaklarını toplama metodunu başka bir işlem için de kullanabiliriz.  Metotlara dikkat ederseniz, her metodun aldığı parametrenin ismini kendi işlemine göre yazdım. Bu da benim bu metotları başka yerlerde de kullanabileceğimin bir ifadesi olarak görülebilir.

Lunh Algoritması 

        bool Kredi_Kart_Lunh_Algoritmasi(string kartno)
        {
            kartno = KartNoTemizle(kartno); // kart numarasını temizledik.

            if (KartNoUzunlukKontrol(kartno) == false) // uzunluğu kontrol ettik
                return false;
            else if (SayisalDegerKontrol(kartno) == false) // sayısal değerleri kontrol ettik
                return false;
            else
            {
                int ciftlerin_toplami = 0;
                int teklerin_toplami = 0;
                for (int i = 0; i < kartno.Length; i++)
                {
                    int eleman = Convert.ToInt32(kartno[i].ToString());
                    if (i % 2 == 0)
                        ciftlerin_toplami += SayiBasamaklariTopla(eleman * 2);
                    else
                        teklerin_toplami += eleman;
                }
                int sonuc = (teklerin_toplami + ciftlerin_toplami) % 10;
                if (sonuc == 0)
                    return true;
                else
                    return false;
            }
        }

Yukarıdaki metodumuz şartları kontrol eden ve hesaplamaları yapan metodumuzdur.

  • İlk olarak girilen kart numarasını temizledik.
  • Temizlenen kart numarasının karakter sayısını kontrol ettik.
  • Temizlenen kart numarasının sadece sayısal değerler içerdiğinden emin olduk.
  • Hesaplamaları yaptıktan sonra sonucu hesapladık.
  • Toplamların MOD10’u sıfır ise kart numarası geçerli 0 değil ise geçersizdir anlamında true ve false gönderdik.

Tüm kontrollerimizi yaptık. Ben burada şartlara göre geri dönüş yapmadım. Örneğin karakter sayısı tutmadı ise, “Karakter sayısı geçersiz” ya da sayısal olmayan değer içeriyor ise “Sayısal olmayan karakterler var” gibi uyarı mesajları çıkarmadım.

Şimdi Kontrol Et butonumuzun click eventine aşağıdaki kodları yazalım.

        private void btn_kontrol_Click(object sender, EventArgs e)
        {
            if (Kredi_Kart_Lunh_Algoritmasi(txt_card_no.Text) == true)
                lbl_sonuc.Text = "Kart No Geçerli";
            else
                lbl_sonuc.Text = "Kart No Geçersiz";
        }

Burada ana metodumuzu kullandık. Ana metodumuzdan, herhangi bir şarta uyulmadığı takdirde “False” değeri döneceğinden “Kart No Geçersiz” mesajını alacağız. Sadece tüm şartlara uyulduğu takdirde “True” sonucu döneceğinden bir şüphemiz olmayacak.

Ben kendi kredi kartım ile denediğimde “Kart No Geçerli” mesajını aldım. Sizlerde deneyip görebilirsiniz.


C# Kredi Kartı Doğrulama – Luhn Algoritması, yazımda bu kadardı arkadaşlar. Diğer yazılarımızda görüşmek üzere…

C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.

Derslerime özel olarak hazırladığım Github Projeme bağlantıya tıklayarak ulaşabilirsiniz… Bu dersimde Github projemde yerini almıştır.

Sağlıcakla ve takipte kalın. ?

Bu yazıya tepkiniz ne oldu?

Yazar Hakkında

Lise Ağ Sistemleri ve Yönetimi bölümü, üniversite Bilgisayar Programcılığı bölümü Ön Lisans, Yönetim Bilişim Sistemleri Lisans öğrenimi aldım. Askerlik görevimi tamamladım. Uzmanlık alanım; C# ve SQL Programlama dilleri ile müşteri odaklı, kullanıcı dostu ERP ve CRM gibi sistemleri geliştirmektir. Ayrıca şuanda PHP ve MYSQL alanında projeler geliştirmekteyim. C++, Phyton, Xamarin, MVC gibi konuları öğrenmek ve kendimi geliştirme çabası içerisindeyim. Discord için: https://discord.gg/FBxZeHu9

Değerli yorumlarınızı bekliyorum. :)

Yorumlar (3)

  1. 2 sene önce

    Kart temizliğini regex replace ile yapsan daha iyi olur ve kod fazlalığı yok olur.

    Regex.Replace(Price.ToString(), “[^0-9]”, “”)

    Güzel anlatım olmuş.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.