בדיקת תקינות מספר כרטיס אשראי

‏ • 28 במאי, 2004

הקדמה

כל מנהל אתר המאפשר רכישות מכוונות נאלץ לקבל כרטיסי אשראי ולבצע פעולות דרושות.
אך כיצד נזהה אם כרטיס האשראי שלפנינו הוא כרטיס אשראי אמיתי, או סתם מספר שהקליד ילד בן 10 בזמנו הפנוי בין משחקי היוגי-הו עם חבריו?
כאן עוזרת לנו נוסחה בשם LUHN.
LUHNזוהי נוסחה לאימות כרטיסי אשראי שפיתח המדען Hans Peter LUHN בשנות ה60.

הנוסחה

יש לנו מספר מסוים, נניח 123456.
אנו מתחילים לספור מהספרה הכי ימינית, כופלים אותה ב1, הספרה שאחריו ב2, אחריה ב1, ואחריה שוב ב2.
1*2 + 2*1 + 3*2 + 4*1 + 5*2 + 6*1.
שימו לב, כאשר לאחר מכפלה יוצא לנו מספר דו ספרתי, עלינו לחבר את ספרותיו.
ז"א, במקום 5*2=10 אנחו נחבר 1+0
ז"א שאנו נקבל 2+2+6+4+1+0+6
אם נחבר את כל המספרים , נקבל 23.
לאחר מכן עלינו לחלק את 23 ב10, אם השארית של החלוקה שווה ל0 אזי כרטיס האשראי אמיתי.

הקוד

בכדי ליישם את הנוסחה, כתבתי את הפונקציה הבאה, תשתשמו בה איך וכמה שתרצו.










1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48  








<%
dim result, c, cr
cr = "1111"
CheckCC(cr)

Function CheckCC(card)
    if card = "" then
        Response.write "Please insert a Creditcard <br>"
        Exit Function
    end if

    if isNumeric(card) = false then
        Response.write "The inserted Creditcard isn't a number <br>"
        Exit Function
    end if

    if Left(cr,1) = 0 OR Right(cr,1) = 0 then
        Response.write "Credit cards can not END or BEGIN with 0 <br>"
        Exit Function
    end if

    dim result
    check = "one"
    for i = 1 to Len(card)
        if check = "one" then
            c = cint((mid(card,i,1))*2)
            check = "two"
        else
            c = cint(mid(card,i,1))
            check = "one"
        end if
        if c => 10 then
            tmp = cstr(c)
            result = result + cint(cstr(left(tmp,1)))
            result = result + cint(cstr(right(tmp,1)))
        else
            result = result + c
        end if
    next

    if result mod 10 = 0 then result = "good"
    if result = "good" then
        Response.write "Good cc"
    else
        Response.write "bad cc"
    end if
end function
%>



ההסבר












1
2
3
4
5  








<%
dim result, c, cr
cr = "11111"
CheckCC(cr)
%>


הגדרת משתנים. המשתנה cr הוא מס הכ"א. קוראים לפונקציה CheckCC ומעבירים אליה את הכ"א כפרמטר.










1
2
3
4
5
6
7  








<%
Function CheckCC(card)
    if card = "" then
     response.write "Please insert a Creditcard <br>"
     Exit Function
    end if
%>


פתיחת הפונקציה, בדיקה האם יש ערך בכ"א, אם לא. רושמים הודעת שגיאה ויוצאים מהפונקציה.










1
2
3
4
5
6  








<%
if isNumeric(card) = false then
   response.write "The inserted Creditcard isn't a number <br>"
   Exit Function
end if
%>


בדיקה האם המשתנה card הוא מספר, אם לא – מציגים שגיאה ויוצאים מהפונקציה.










1
2
3
4
5
6  








<%
if Left(cr,1) = 0 OR Right(cr,1) = 0 then
   response.write "Credit cards can not END or BEGIN with 0 <br>"
   Exit Function
end if
%>


התנאי הזה נועד על מנת למנוע מהמשתמש להקליד רק אפסים ובזאת לעקוף את הפונקציה.
אם תשימו לב, אם נרשום כ"א כזה: 00000, הפונקציה תתיחס למספר כאל מספר אמיתי מכיוון שאם נחלק 0 ב 10 השארית תיהיה 0 (משמע: כ"א טוב).










1
2
3
4
5
6
7  








<%
check = "one"
for i = 1 to Len(card)
    if check = "one" then
    c = cint((mid(card,i,1))*2)
    check = "two"
%>


לפני ריצת הלולאה מגדירים את המשתנה check כ "one", ערך one מסמל כפל ב2.
מאחר ורק התחלנו את הלולאה, המספר הראשון יוכפל ב2.
אחרי שנכפיל את המספר הראשון, נגדיר את המשתנה check כ two.










1
2
3
4
5
6
7  








<%
else
    c = cint(mid(card,i,1))
    check = "one"
end if

%>


אם הcheck לא שווה ל one, אז כופלים את המספר ב1.
מה שעשינו כאן זה בעצם כפל ב2, של כל הקפיצות ב2.










1
2
3
4
5
6
7
8
9
10  








<%
      if c => 10 then
        tmp = cstr(c)
        result = result + cint(cstr(left(tmp,1)))
        result = result + cint(cstr(right(tmp,1)))
    else
     result = result + c
    end if
next
%>


את תוצאת הכפל הכנסו למשתנה c, פה אנו בודקים אם c גדול או שווה ל 10 (כלומר c הוא מספר דו ספרתי) אם כן, אנו מחברים לתוצאה את הספרה הראשונה בc, ולאחר מכן את השניה.
אם c הוא מספר חד ספרתי, אז מחברים אותו רגיל.










1
2
3
4
5
6
7
8
9  








<%
      if result mod 10 = 0 then result = "good"
    if result = "good" then
     response.write "Good cc"
    else
     response.write "bad cc"
    end if
end function
%>


אם נחלק את result ב 10 והשארית תיהיה 0 נדפיס שהכ"א טוב. אם לא, נדפיס שגיאה.

זהו עד כה, מקווה שהמאמר שימושי.

תגיות: , , , , ,

תגובות בפייסבוק