如何根据号码检测信用卡类型?

时间:2020-03-05 18:56:04  来源:igfitidea点击:

我试图弄清楚如何仅基于其号码来检测信用卡的类型。有谁知道一种确定的,可靠的方法来找到它?

解决方案

回答

信用卡/借记卡号称为PAN或者主帐号。 PAN的前六位数字取自发卡行的IIN或者发卡行标识号(IIN以前称为BIN银行标识号,因此我们可能会在某些文档中看到该术语的引用)。这六位数字受国际标准ISO / IEC 7812的约束,可用于根据数字确定卡的类型。

不幸的是,实际的ISO / IEC 7812数据库没有公开可用,但是有非官方的列表,包括商业和免费列表,包括Wikipedia。

无论如何,要从数字中检测类型,可以使用以下正则表达式:原始表达式的来源

签证:^ 4 [0-9] {6,} $签证卡号以4开头。

万事达卡:^ 5 [1-5] [0-9] {5,} | 222 [1-9] [0-9] {3,} | 22 [3-9] [0-9] {4, } | 2 [3-6] [0-9] {5,} | 27 [01] [0-9] {4,} | 2720 [0-9] {3,} $在2016年之前,万事达卡号码开始从51到55的数字,但这只会检测万事达信用卡。还有其他使用万事达卡系统发行的卡,这些卡不属于此IIN范围。在2016年,他们将添加范围(222100-272099)之间的数字。

美国运通卡:^ 3 [47] [0-9] {5,} $美国运通卡号以34或者37开头。

Diners Club:^ 3(?:0 [0-5] | [68] [0-9])[0-9] {4,} $Diners Club卡号从300到305、36或者38开头。大来卡(Diners Club)卡以5开头并有16位数字。这些是Diners Club和万事达卡之间的合资企业,应像万事达卡一样进行处理。

发现:^ 6(?:011 | 5 [0-9] {2})[0-9] {3,} $发现卡号以6011或者65开头。

JCB:^(?: 2131 | 1800 | 35 [0-9] {3})[0-9] {3,} $JCB卡以2131、1800或者35开头。

不幸的是,有许多使用万事达卡系统处理的卡类型不在万事达卡的IIN范围内(数字以51 ... 55开头)。最重要的情况是Maestro卡,其中许多卡是从其他银行的IIN范围发行的,因此遍及整个数字空间。因此,最好假定我们所接受的任何非其他类型的卡都必须是万事达卡。

重要提示:卡号的长度会有所不同;例如,Visa过去曾发行过13位PAN的卡和16位PAN的卡。签证文件目前表明,它可能签发或者可能签发了12到19位之间的数字。因此,除了验证卡号的长度至少为7位(对于完整的IIN加一个校验位,应与Luhn算法预测的值相符)之外,我们不应检查卡号的长度。

另一个提示:在处理持卡人PAN之前,请从输入中除去所有空格和标点符号。为什么?因为通常更容易按组输入数字,类似于将数字显示在实际信用卡的正面(即

4444 4444 4444 4444

比正确输入容易得多

4444444444444444

责骂用户确实没有任何好处,因为他们输入了我们在此处不希望看到的字符。

这还意味着确保输入字段至少有24个字符的空间,否则输入空格的用户将没有空间。 ID建议我们使字段的宽度足够显示32个字符,最多允许64个字符;为扩展留出了足够的空间。

这是一个提供更多见解的图像:

更新(2014):如该答案的注释所述,校验和方法似乎不再是验证卡真实性的有效方法。

更新(2016):万事达卡将从Ach Payment开始实施新的BIN范围。

回答

信用卡的第一个数字可用于近似供应商:

  • 签证:49,44或者47
  • Visa电子:42、45、48、49
  • 万事达卡:51
  • 美国运通卡:34
  • 晚餐:30,36,38
  • JCB:35

回答

这是Codeproject上所有与CC相关的东西的完整Cor VB代码。

  • IsValidNumber
  • GetCardTypeFromNumber
  • GetCardTestNumber
  • 通过Luhn测试

这篇文章已经发表了两年,没有负面评论。

回答

看一下这个:

http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CC70060A01B

function isValidCreditCard(type, ccnum) {
/* Visa: length 16, prefix 4, dashes optional.
Mastercard: length 16, prefix 51-55, dashes optional.
Discover: length 16, prefix 6011, dashes optional.
American Express: length 15, prefix 34 or 37.
Diners: length 14, prefix 30, 36, or 38. */

  var re = new Regex({ "visa": "/^4\d{3}-?\d{4}-?\d{4}-?\d",
                       "mc": "/^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/",
                       "disc": "/^6011-?\d{4}-?\d{4}-?\d{4}$/",
                       "amex": "/^3[47]\d{13}$/",
                       "diners": "/^3[068]\d{12}$/"}[type.toLowerCase()])

   if (!re.test(ccnum)) return false;
   // Remove all dashes for the checksum checks to eliminate negative numbers
   ccnum = ccnum.split("-").join("");
   // Checksum ("Mod 10")
   // Add even digits in even length strings or odd digits in odd length strings.
   var checksum = 0;
   for (var i=(2-(ccnum.length % 2)); i<=ccnum.length; i+=2) {
      checksum += parseInt(ccnum.charAt(i-1));
   }
   // Analyze odd digits in even length strings or even digits in odd length strings.
   for (var i=(ccnum.length % 2) + 1; i<ccnum.length; i+=2) {
      var digit = parseInt(ccnum.charAt(i-1)) * 2;
      if (digit < 10) { checksum += digit; } else { checksum += (digit-9); }
   }
   if ((checksum % 10) == 0) return true; else return false;
}