• User Attivo

    Validazione carte di credito in asp - Luhn formula

    I numeri di carta di credito vengono generati in maniera tale da soddisfare la Luhn formula.

    La Luhn formula (o formula di Luhn) si applica moltiplicando per 2 tutte le cifre in posizioni dispari e successivamente sommando singolarmente tutte le cife così ottenute. Se la loro somma è multiplo di 10 allora il numero è valido.

    È di conseguenza utile utilizzare questo tipo di controllo per una prima validazione della carta di credito utilizzata dall'utente. Questo tipo di controllo non è ovviamente completamente esaustivo. Ci sono altre variabili da prendere in considerazione, ad esempio la lunghezza del numero, che varia da tipo a tipo, la scadenza, la lunghezza del codice di controllo.

    Il controllo sulla liquidità e reale esistenza della carta non è possibile effettuarlo da codice senza il supporto di una banca.

    Ci sono numeri che soddisferebbero la luhn formula pur essendo palesemente inadeguati, tipo 4111111111111111 per Visa.

    Ad esempio per il numero 5632198745456126 la luhn formula si applica così:
    1+0+6+6+2+2+9+1+6+7+8+5+8+5+1+2+1+4+6 = 80

    (PS: vi giuro che ho scritto questo numero a caso eppure soddisfa la luhn formula... le probabilità erano quasi nulle, che mago! Provate voi :1:

    Ecco una funzione che applica la luhn formula:

    
    <%
    Function ValidCcNumber(ccnumber)
        ccnumber = cleanccnum(ccnumber)
        If ccnumber = "" then
            validccnumber = false
        Else
            iseven = false
            digits = ""
            For i = len(ccnumber) to 1 step -1
                If iseven then
                    digits = digits & cint(mid(ccnumber, i, 1))*2
                Else
                    digits = digits & cint(mid(ccnumber,i,1))
                End if
                iseven= (not iseven)
            Next
            checksum = 0
            For i = 1 to len(digits) Step 1
                checksum = checksum + cint(mid(digits, i, 1))
            Next
            validccnumber = ((checksum mod 10)=0)
        End if
    End function
    %>
    
    

    A questo controllo ne vanno affiancati altri che ora non ho tempo di commentare approfonditamente ma credo che si commentino da soli:

    Controllo delle prime cifre del numero:

    
    Function ValidCcType(ccnumber,cctype)
        ValidCcType = true
        If cctype = "Visa" then
            If CInt(cleanccnum(Left(ccnumber,1))) <> 4 then ValidCcType = false
        Elseif cctype = "MasterCard" then
            If not (CInt(cleanccnum(Left(ccnumber,2))) > 50 and CInt(cleanccnum(Left(ccnumber,2))) < 56) then ValidCcType = false
        
        Elseif cctype = "AmericanExpress" then
            If not CInt(cleanccnum(Left(ccnumber,2))) = 34 and not CInt(cleanccnum(Left(ccnumber,2))) = 37 then ValidCcType = false
        Elseif cctype = "DinersClubCarteBlanche" then
            If not (CInt(cleanccnum(Left(ccnumber,3))) > 299 and CInt(cleanccnum(Left(ccnumber,3))) < 306) and not CInt(cleanccnum(Left(ccnumber,2))) = 37 and not CInt(cleanccnum(Left(ccnumber,2))) = 36 and not CInt(cleanccnum(Left(ccnumber,2))) = 38 then ValidCcType = false
        Elseif cctype = "Discover" then
            If not CInt(cleanccnum(Left(ccnumber,2))) = 6011 then ValidCcType = false
        End if
    End function
    
    

    Controllo sulla lunghezza del numero:

    
    Function ValidCcLength(ccnumber,cctype)
        ValidCcLength = true
        If cctype = "Visa" then
            If Len(ccnumber) <> 16 and Len(ccnumber) <> 13 then ValidCcLength = false
        Elseif cctype = "MasterCard" then
            If Len(ccnumber) <> 16 then ValidCcLength = false
        Elseif cctype = "AmericanExpress" then
            If Len(ccnumber) <> 15 then ValidCcLength = false
        Elseif cctype = "DinersClubCarteBlanche" then
            If Len(ccnumber) <> 14 then ValidCcLength = false
        Elseif cctype = "Discover" then
            If Len(ccnumber) <> 16 then ValidCcLength = false
        End if
    End function
    
    

    Controllo sulla lunghezza del codice di controllo:

    
    Function ValidCvcLength(cvc_code,cctype)
        ValidCvcLength = true
        If cctype = "Visa" then
            If Len(cvc_code) <> 3 then ValidCvcLength = false
        Elseif cctype = "MasterCard" then
            If Len(cvc_code) <> 3 then ValidCvcLength = false
        Elseif cctype = "AmericanExpress" then
            If Len(cvc_code) <> 4 then ValidCvcLength = false
        Elseif cctype = "DinersClubCarteBlanche" then
            If Len(cvc_code) <> 3 then ValidCvcLength = false
        Elseif cctype = "Discover" then
            If Len(cvc_code) <> 3 then ValidCvcLength = false
        End if
    End function
    
    

    Quest'ultima funzione viene richiamata dalle altre per ripulire il numero da caratteri non numerici tipo spazi e trattini:

    
    Function cleanccnum(ccnumber)
        For i = 1 to len(ccnumber)
            If isnumeric (mid(ccnumber, i, 1)) then
                cleanccnum = cleanccnum & mid(ccnumber, i,1)
            End if
        Next
    End function
    
    

    Spero che questa pillola risulti utile... postate tranquillamente le vostre eventuali domande.

    Ciao 🙂


  • User Newbie

    ciao madai,

    scusa la mia ignoranza.... come faccio ad applicare queste funzioni?