Regex 英国商户信用卡验证资源

Regex 英国商户信用卡验证资源,regex,validation,credit-card,Regex,Validation,Credit Card,我试图根据标准检查参数设置信用卡号,但我发现许多英国卡(Maestro/Visa借记卡/Barclaycard Connect)的起始号码不符合其他卡验证脚本正则表达式 也就是说,Maestro(Switch)卡仍然存在,并且以4开头,在线使用大量regexes,这将导致选择Visa信用卡 有人知道这些注册的起始代码存储在哪里的资源吗 助教 寻找英国信用卡验证表(BIN表)的任何人 我不知道注册的开始代码,但我得到了一个适合cc验证的脚本(它的javascript): 这是经过严格测试的,并用于

我试图根据标准检查参数设置信用卡号,但我发现许多英国卡(Maestro/Visa借记卡/Barclaycard Connect)的起始号码不符合其他卡验证脚本正则表达式

也就是说,Maestro(Switch)卡仍然存在,并且以4开头,在线使用大量regexes,这将导致选择Visa信用卡

有人知道这些注册的起始代码存储在哪里的资源吗

助教

寻找英国信用卡验证表(BIN表)的任何人

我不知道注册的开始代码,但我得到了一个适合cc验证的脚本(它的javascript):

这是经过严格测试的,并用于相当多的事务,因此它应该考虑所有特殊情况(如果您将其更改为regexp,您可以共享它吗?

以下是示例


注意:交换卡实际上是借记卡而不是信用卡,因此有不同的验证规则。事实上,交换卡通常在号码中嵌入帐号。这可能有一个校验和算法,但我还没有看到它。

你不能依靠正则表达式来验证卡号。您需要一个最新的卡验证表,该表包括范围的长度和范围到类型的映射。您的支付网关提供商应该能够为您提供最新的验证表

您通常可以依靠Luhn进行验证,但为了通过网关的责任测试,您需要验证用户是否输入了该号码的写卡类型,如果提供商要求输入开始日期,则必须输入该日期,等等

下面是C#中的一个例子:


作为前兆选择,Its上的BIN(银行识别号)资源;像google checkout一样,你输入你的号码,它会预先选择卡片类型;正如我们使用的Web服务,目前每个会话只接受一次呼叫(不要问),我们必须在发送信息之前进行尽可能多的验证;Visa Electron是Visa借记卡,起始编号不再匹配。显然,如果包含借记卡,你就不能简单地与4(糟糕透顶)相匹配:opYep所有Maestro卡都是借记卡;从第7位开始,它包含帐户代码。可能需要一个数据验证表。在BIN表上做得很好。这正是我一直在寻找的。谢谢,找到有用的信息进行验证是一场噩梦:o)
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);
}