C# Kredi Kartı Numarası Kontrolü

Herkese merhaba, C# yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda C# ile kredi kartı doğrulama işlemini anlatacağım. Hadi başlayalım !
Table of Contents
Kart Numarası Yapısı
Kredi kartları üzerinde bulunan kart numarası 16 haneden oluşmakta ve kart numaraları rastgele bir şekilde değil, bir matematiksel işleme göre oluşturulmakta. Yani 16 tane sayı rastgele bir şekilde yerleştirilmiyor, bir kurala göre yerleştiriliyor. Kart numarasının ilk 2 hanesi kartın kullanılacağı sektörü temsil ediyor. İlk hanesi 1 yada 2 olanlar hava yolları kartları, 3 olanlar eğlence ve seyahat kartları, 4 ve 5 olanlar finans ve bankacılık sektörü kartları, 6 ticari ve bankaların verdiği kartlar, 7 olanlar petrol sektörü kartları ve 8 olanlar ise telekomünikasyon sektörü kartları olarak kullanılır. Bankalardan aldığınız kartların kart numaraları 4 veya 5 ile başlar ve 4 ile başlaması VISA ailesi kartı, 5 olması Mastercard ailesi kartı olduğunu ifade eder. Kart numarasının lk 6 yada 8 hanesi kartı aldığınız bankanın VISA yada Mastercard tarafından verilen BIN numarasıdır. Ayrıca kart numarasının 7 ile 15. haneleri arasındaki 9 basamaklı sayı sizin bankada kayıtlı müşteri numaranızdır.
Luhn Algoritması İşlem Adımları
Kart numarası içerisinde böyle bilgileri bulabiliriz fakat her numarada doğru değildir. Bu yüzden kart numarası doğrulama yöntemleri kullanılır ve bunlardan en çok bilineni Luhn Algoritması’dır. Luhn Algoritması’nında belirli bir kuralı vardır ve kural şu şekildedir;
- Çift hanelerde bulunan tüm sayılar toplanır,
- Tek hanede olanlar önce 2 ile çarpılır.
- Çarpım sonucu 10’dan büyükse basamakları toplanır ve tüm sonuçlar toplanır,
- 1 ve 2. adımdaki toplam sonuçları da toplanır ve 10’a bölümünden kalanına bakılır. 10’a bölümünden kalan sıfır ise kart numarası geçerlidir, aksi halde geçersizdir.
Daha iyi anlaşılması için şöyle bir görselle örneklendirelim;

Luhn Algoritmasını bir fonksiyon içerisinde yapalım ve bu fonksiyonun şöyle bir gövdesi olsun;
bool KrediKartiKontrolu(string kartNumarasi) { }
Kart Numarası Uzunluğu Kontrolü
Fonksiyon içerisinde string tipte bir parametre aldık çünkü kart numarası 16 haneden oluşuyor fakat C# ile 16 basamaklı bir sayıyı integer veri tipi ile tutamayız. Bu yüzden string ile tuttuk. Ayrıca bir fonksiyon olarak yazdığımız için geriye bool değer döndürecek şekilde yaptık, bu sayede kredi kartı numarası doğru ise true, yanlış ise false döndürecek ve fonksiyonu çağırdığımız yerde de fonksiyonun döndürdüğü değeri kontrol edeceğiz. Öncelikle kart numarasının 16 haneden oluşup oluşmadığını kontrol edelim. 16 haneden oluşmuyorsa fonksiyondan false döndürelim.
if (kartNumarasi.Length != 16) return false;
Fonksiyonun Yazılması
Artık Luhn Algoritması’na geçebiliriz. Luhn Algoritması’nda çift hanede bulunan rakamlar toplanıyor, tek hanelerdeki 2 ile çarpılıp basamak değerleri toplanıyordu falan ya, yani kart numarasının tüm karakterlerini bizim ayrı ayrı gezmemiz gerekiyor. Her bir karakterde o karakter çift sırada ise direk toplayacak, tek sırada ise önce 2 ile çarpıp çarpım sonucu 9’dan büyükse basamaklarını topladıktan sonra toplama ekleyecek, 9’dan küçükse de direk çarpım sonucunu toplama ekleyeceğiz. Fakat çiftleri ve tekleri ayrı ayrı toplamamız gerektiği için çiftler için ayrı, tekler için ayrı bir değişken oluşturacak ve toplamları bu değişkenlerde tutacağız. Ayrıca hazır kart numaralarını teker teker geziyorken o anki karakterin sayısal olup olmadığına bakalım. Sonuçta toplama, çıkarma ve çarpma işlemleri yapacağız, karakterin sayısal olması gerekiyor. Kart numarasının hepsinin de sayı olması gerektiği kuralını da unutmayalım. Yani özetle bir döngü ile kart numarasını dönecek, her bir adımda karakterin 0-9 arasında bir sayı olup olmadığına bakacağız ve sayı değilse doğrudan fonksiyondan false döndüreceğiz. Sayı ise de tek hanede mi çift hanede mi ona bakacağız. Tek hanede ise tekler için oluşturduğumuz bir değişkende biriktireceğiz. Çift hanede ise önce 2 ile çarpacak ve çarpım 10’dan büyükse çarpımın sonucunun basamaklarını toplayıp çiftler için olan değişkende biriktireceğiz, 10’dan küçükse çarpım sonucunu çiftler için oluşturduğumuz değişkende biriktireceğiz. Son olarak teklerin toplamı ile çiftlerin toplamını toplayacak ve 10’a bölümünden kalan sıfır ise true, değilse false döndüreceğiz.
int tekToplam = 0, ciftToplam = 0;
for (int i = 0; i < kartNumarasi.Length; i++)
{
if (!char.IsNumber(kartNumarasi, i)) return false;
int karakter = Convert.ToInt32(kartNumarasi[i].ToString());
if (i % 2 == 0)
{
int carpi2 = karakter * 2;
if (carpi2 > 9)
{
int toplam = 0;
while (carpi2 > 0)
{
toplam += carpi2 % 10;
carpi2 /= 10;
}
ciftToplam += toplam;
}
else ciftToplam += carpi2;
}
else tekToplam += karakter;
}
return (tekToplam + ciftToplam) % 10 == 0;
Kullanıcıdan Kart Numarası Alıp Kontrol Etme
Fonksiyonumuz hazır olduğuna göre artık Main() fonksiyonu içerisinde kullanıcıdan kart numarasını alabilir ve Luhn Algoritması’ndan geçirebiliriz. Luhn Algoritması için yazdığımız KrediKartiKontrolu() fonksiyonu geriye true döndürürse kullanıcının girdiği kart numarasının geçerli, false döndürürse geçersiz olduğunu anlayabilir ve buna göre bir mesaj gösterebiliriz.
Console.Write("16 Haneli Kart Numarasını Giriniz: ");
string kartNumarasi = Console.ReadLine();
bool kartNumarasiGecerliMi = KrediKartiKontrolu(kartNumarasi);
if (kartNumarasiGecerliMi)
Console.WriteLine("Kart Numarası Geçerli");
else
Console.WriteLine("Kart Numarası Geçersiz");
Tüm Kodlar
C# ile Luhn Algoritması bu şekilde yazılmakta. Yazdığımız tüm kodları daha toplu olması için aşağıya bırakıyorum;
bool KrediKartiKontrolu(string kartNumarasi)
{
if (kartNumarasi.Length != 16) return false;
int tekToplam = 0, ciftToplam = 0;
for (int i = 0; i < kartNumarasi.Length; i++)
{
if (!char.IsNumber(kartNumarasi, i)) return false;
int karakter = Convert.ToInt32(kartNumarasi[i].ToString());
if (i % 2 == 0)
{
int carpi2 = karakter * 2;
if (carpi2 > 9)
{
int toplam = 0;
while (carpi2 > 0)
{
toplam += carpi2 % 10;
carpi2 /= 10;
}
ciftToplam += toplam;
}
else ciftToplam += carpi2;
}
else tekToplam += karakter;
}
return (tekToplam + ciftToplam) % 10 == 0;
}
static void Main()
{
Console.Write("16 Haneli Kart Numarasını Giriniz: ");
string kartNumarasi = Console.ReadLine();
bool kartNumarasiGecerliMi = KrediKartiKontrolu(kartNumarasi);
if (kartNumarasiGecerliMi)
Console.WriteLine("Kart Numarası Geçerli");
else
Console.WriteLine("Kart Numarası Geçersiz");
}
Tüm C# yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.