Merhabalar,
Bir ödeme sistemi, tahsilat sistemi, e-ticaret sistemi vb gibi uygulamalar geliştirirken, çokça kredi kartı numarasını bir ön doğrulamadan geçirme ihtiyacı duyuyoruz. Duymalıyız da. Bir web yazılımcısı olarak asla kullanıcıdan aldığımız, kullanıcının girdiği verilere güvenmemeliyiz. Bu veriler çoğu zaman, zararlı içerikler içeriyor olabilir. Ya da hiç düşünmediğimiz bir istisnaya sebebiyet verebilir. Bu gibi durumlarla karşılaşmamak adına verileri doğrulayıp, kullanmalıyız.
Kredi kartı numarası Luhn adı verilen bir algoritma ile oluşturulur. 4 ile başlarsa Visa, 5 ile başlarsa MasterCard türündedir.
Luhn Algoritmasını matematiksel olarak açıklayalım.
1234 1234 1234 1234 şeklinde 16 haneli bir kredi kartımız olsun.
TÇTÇ TÇTÇ TÇTÇ TÇTÇ diyelim yani;
1,3,5,7,9,11,13,15 sırada bulunan rakamlara T diyelim.
2,4,6,8,10,12,14,16. sırada bulunan rakamlarada Ç diyelim.
İlk olarak tüm Ç’leri toplayalım;
2+4+2+4+2+4+2+4=24
Tüm T’leri de ayrı ayrı 2 ile çarpıp, topluyoruz.
(1×2)+(3×2)+(1×2)+(3×2)+(1×2)+(3×2)+(1×2)+(3×2)=24
Şimdi ilk sonuç ile 2. sonucu toplayalım.
Yani 24+24=48.
Şimdi 48’in mod10’nu alalım. Yani 10’a bölüp kalanına bakalım. Geçerli bir kredi kartı için işlem sonucunun 0 olması gerekli. Yani 10’a tam bölünmeli.
Görüldüğü gibi 48’in Mod10’nu 8 olduğu için bu kredi kartı geçersizdir.
İşin hikayesini tamamladık. Şimdi bunu PHP ile yapalım. Yehuu :).
function isValid($num) { $num = preg_replace('/[^\d]/', '', $num); $sum = ''; for ($i = strlen($num) - 1; $i >= 0; -- $i) { $sum .= $i & 1 ? $num[$i] : $num[$i] * 2; } return array_sum(str_split($sum)) % 10 === 0; }
Olur da canımız Javascript kullanmak isterse de :);
function isValid(number) { var num = number.replace(/[^\d]/, ''); var str = ''; for (var i = num.length - 1; i >= 0; -- i) { str += i & 1 ? num[i] : (parseInt(num[i]) * 2).toString(); } var sum = str.split('').reduce(function(prev, current) { return prev + parseInt(current); }, 0); return sum % 10 === 0; };
Sorularınız olursa yorum yazmaktan çekinmeyiniz. İyi çalışmalar.