הקדמה
כל מנהל אתר המאפשר רכישות מכוונות נאלץ לקבל כרטיסי אשראי ולבצע פעולות דרושות.
אך כיצד נזהה אם כרטיס האשראי שלפנינו הוא כרטיס אשראי אמיתי, או סתם מספר שהקליד ילד בן 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 %> |
|
|
ההסבר
|
<% dim result, c, cr cr = "11111" CheckCC(cr) %> |
|
|
הגדרת משתנים. המשתנה cr הוא מס הכ"א. קוראים לפונקציה CheckCC ומעבירים אליה את הכ"א כפרמטר.
|
<% 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 %> |
|
|
בדיקה האם המשתנה card הוא מספר, אם לא – מציגים שגיאה ויוצאים מהפונקציה.
|
<% 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 (משמע: כ"א טוב).
|
<% 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.
|
<% else c = cint(mid(card,i,1)) check = "one" end if
%> |
|
|
אם הcheck לא שווה ל one, אז כופלים את המספר ב1.
מה שעשינו כאן זה בעצם כפל ב2, של כל הקפיצות ב2.
|
<% 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 הוא מספר חד ספרתי, אז מחברים אותו רגיל.
|
<% 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 נדפיס שהכ"א טוב. אם לא, נדפיס שגיאה.
זהו עד כה, מקווה שהמאמר שימושי.
תגובות בפייסבוק