我正在尝试设置基于标准检查参数的信用卡号码,但我发现许多英国卡(Maestro / Visa Debit / Barclaycard Connect)的起始号码不符合其他卡验证脚本正则表达式;
即Maestro (Switch)卡仍然存在,并且以4开头,使用大量的在线正则表达式会导致Visa信用卡被选中。
有没有人知道存储这些注册开始代码的资源?
标签
任何寻找英国信用卡验证表(BIN表)的人
http://www.barclaycard.co.uk/business/documents/pdfs/bin_rules.pdf
发布于 2009-08-27 07:03:55
这是rules regarding credit card formatting and validation。
注意:交换卡实际上是借记卡,而不是信用卡,因此有不同的验证规则。事实上,开关卡通常在号码中嵌入帐号。可能有一个校验和算法来解决这个问题,但我还没有看到它(现在)。
发布于 2009-08-27 07:05:36
您不能依赖正则表达式来验证卡号。您需要一个最近的卡片验证表,其中包括范围和范围到类型映射的长度。您的支付网关提供商应该能够为您提供最新的验证表。
您通常可以依赖Luhn进行is -this- number虚构类型的验证,但为了通过网关的可靠性测试,您需要验证用户是否输入了该号码的写入卡类型,如果提供商需要开始日期,则必须输入开始日期,等等……
下面是一个用C#编写的Luhn示例:
public static bool IsLuhnValid(string cardNumber) {
if (string.IsNullOrEmpty(cardNumber))
return false;
Int64 cardNumberAsBigInt;
if (!Int64.TryParse(cardNumber, out cardNumberAsBigInt) || (cardNumberAsBigInt == 0))
return false;
int indicator = 1;
int firstNumberToAdd = 0;
int secondNumberToAdd = 0;
for (int i = cardNumber.Length - 1; i >= 0; i--) {
int currentNumber = int.Parse(cardNumber[i].ToString());
if (indicator == 1) {
firstNumberToAdd += currentNumber;
indicator = 0;
}
else {
int doubleCurrentNumber = currentNumber + currentNumber;
if (doubleCurrentNumber >= 10) {
int num1 = Convert.ToInt32(doubleCurrentNumber.ToString().Substring(0, 1));
int num2 = Convert.ToInt32(doubleCurrentNumber.ToString().Substring(1, 1));
secondNumberToAdd += num1 + num2;
}
else {
secondNumberToAdd += doubleCurrentNumber;
}
indicator = 1;
}
}
return ((firstNumberToAdd + secondNumberToAdd) % 10 == 0);
}
发布于 2009-08-27 07:03:08
我不知道注册的启动代码,但我有一个脚本可以很好地用于cc验证(它的javascript):Determine credit card type by number?
它经过了严格的测试,并与相当多的事务一起使用,因此它应该处理所有特殊情况(如果您将其更改为regexp,您可以共享它吗?)
https://stackoverflow.com/questions/1341648
复制