Para Validar tarjetas

Rentao Valdivieso
© Copyrights 1998 by FoxPress, All rights reserved
FoxPress, Julio 1998

Con la moda de Internet y las compras por la Web, se está poniendo muy de moda el asunto de la seguridad. Normalmente sólo se mira la seguridad del que pone la tarjeta para que nadie vea sus números y no la pueda usar.

Pero a los programadores los que nos suelen pedir esa seguridad serían los tenderos virtuales y uno de los aspectos en los que más recalcan es que se compruebe la validez de los números de las tarjetas que se introducen antes de entregar el producto. Lo ideal sería que se estuviera conectado a la red de los bancos pero esto muchas veces no es posible (principalmente por culpa de los bancos) y la única validación que se puede hacer es comprobar que los números de la tarjeta corresponden a una tarjeta real.

Bien, pero entremos en materia, para entender mejor el método usaremos el número correcto (pero ficticio)4013 2002 0977 4812, al que me referiré a lo largo de todo el texto.

Para comprobar si una tarjeta de crédito es válida, usaremos este sencillo algoritmo:

 * Los cuatro primeros números indican el banco al cual pertenece la tarjeta.
   En nuestro ejemplo: Pertenece al banco 4013 (Bank of Baltimore).

El primer número identifica a la tarjeta:
    si es un 3 la tarjeta es American Express
    si es un 4 la tarjeta es Visa
    si es un 5 la tarjeta es MasterCard
    si es un 6 la tarjeta es Discover

En nuestro ejemplo: 4, tarjeta Visa.

Ahora nos centraremos en todos los números que ocupan una posición impar en el número de la tarjeta:

Procederemos de la manera siguiente: a cada uno de estos números se le multiplica por dos. Si el número resultante es menor que nueve, se deja tal cual. En caso contrario, se le resta nueve

   
En nuestro ejemplo:
     4 * 2 = 8, como es menor que nueve, lo apuntamos y seguimos.
     0, ocupa posición par, por lo que continuamos
     1 * 2 = 2, <9, se apunta y sigue
     3, posición par
     2 * 2 = 4, se apunta
     0, posición par
     0 * 2 = 0, seguimos
     2, posición par
     0 * 2 = 0, seguimos
     9, posición. par
     7 * 2 = 14, mayor que nueve. Se restan 9: 14 -         
           9 = 5, se apunta
     7, posición par
     4 * 2 = 8
     8, posición. par
     1 * 2 = 2
     2, posición par

Con lo que obtenemos 8023 4002 0957 8822

Se suman entre sí todas las cifras del nuevo número obtenido.

En nuestro ejemplo:

     8+0+2+3+4+0+0+2+0+9+5+7+8+8+2+2 = 60

¡Y ya esta! Si el número resultante es múltiplo de 10 (X Mod 10=0) y a la vez menor o igual a 150, es un número de tarjeta válido.

En nuestro ejemplo: 60 Mod 10 = 0 & 60 < 150,
con lo que 4013 2002 0977 4812 es un número de Visa válido, perteneciente al Bank of Baltimore (Cod. 4013).

Con esta información ya podríamos crearnos un programita que nos valide las tarjetas VISA como el siguiente:

Parameter lcvisa
lcVisa = strtran(lcvisa,' ','')
lcVisa = strtran(lcvisa,'-','')
lcVisa = padr(lcVisa,16,' ')
lcValidar = ''
For n = 1 to 15 Step 2
	lnNum = Int(Val(Substr(lcVisa,n,1)) * 2)
	Do Case
		Case lnNum < 9
			lcValidar = lcValidar + ;
Substr(Str(lnNum,2),2,1)
		Case lnNum > 9	
			lcValidar = lcValidar + ;
   Substr(Str(lnNum-9,2), 2, 1)
	EndCase
	lcValidar = lcValidar + ;
substr(lcvisa,n+1,1)
EndFor
lnValido = 0
For n = 1 to len(lcValidar)
	lnValido = lnValido + ;
Val(substr(lcValidar,n,1))
EndFor
If Mod(lnValido,10) = 0 And lnValido < 150
	lcValidar = Val(substr(lcVisa,1,1))
Else
	lcValidar = 784		
EndIf	
If lcvalidar # 784
	lValido = .t.
Else	
	lvalido = .F.
EndIf