我试图弄清楚如何仅根据信用卡号码来检测信用卡的类型。有谁知道找到这个的明确,可靠的方法?
信用卡/借记卡号称为 PAN 或 主帐号 。PAN 的前六位数字取自属于发行银行的 IIN 或 发行人识别号 (IIN 以前称为 BIN - 银行识别号 - 因此您可能会在某些文件中看到对该术语的引用)。这六位数字受国际标准ISO/IEC 7812的约束,可用于根据数字确定卡的类型。
不幸的是,实际的 ISO/IEC 7812 数据库并未公开,但是,有非官方的列表,包括商业和免费的,包括在 Wikipedia 上。
无论如何,要从数字中检测类型,您可以使用如下所示的正则表达式:Credit for original expressions
Visa: ^4[0-9]{6,}$ Visa卡号以4开头。
^4[0-9]{6,}$
MasterCard: ^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 年之前,MasterCard 号码以数字 51 到 55 开头, 但这只会检测 MasterCard 信用卡 ;使用 MasterCard 系统发行的其他卡不属于此 IIN 范围。2016 年,他们将在 (222100-272099) 范围内添加数字。
^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,}$
美国运通: ^3[47][0-9]{5,}$美国运通卡号以 34 或 37 开头。
^3[47][0-9]{5,}$
Diners Club: ^3(?:0[0-5]|[68][0-9])[0-9]{4,}$ Diners Club 卡号以 300 到 305、36 或 38 开头。有些 Diners Club 卡以 5 开头,有 16 位数字。这些是大来卡和万事达卡的合资企业,应该像万事达卡一样处理。
^3(?:0[0-5]|[68][0-9])[0-9]{4,}$
Discover: ^6(?:011|5[0-9]{2})[0-9]{3,}$ Discover 卡号以 6011 或 65 开头。
^6(?:011|5[0-9]{2})[0-9]{3,}$
JCB: ^(?:2131|1800|35[0-9]{3})[0-9]{3,}$ JCB 卡以 2131、1800 或 35 开头。
^(?:2131|1800|35[0-9]{3})[0-9]{3,}$
不幸的是,万事达卡系统处理的许多卡类型不在万事达卡的 IIN 范围内(数字从 51…55 开始);最重要的案例是 Maestro 卡,其中许多是从其他银行的 IIN 范围发行的,因此遍布数字空间。因此, 最好假设任何不是您接受的其他类型的卡都必须是 MasterCard 。
重要提示 :卡号的长度确实不同;例如,Visa 过去曾发行具有 13 位 PAN 的卡和具有 16 位 PAN 的卡。Visa 的文件目前表明它可能发布或可能已经发布了 12 到 19 位数字之间的号码。 因此,您不应该检查卡号的长度,而是验证它至少有 7 位数字 (对于完整的 IIN 加上一个校验位,它应该与Luhn 算法预测的值匹配)。
进一步的提示: 在处理持卡人 PAN 之前,从输入中删除所有空格和标点符号 。为什么?因为按组输入数字通常 要 容易得多,类似于它们在实际信用卡正面的显示方式,即
4444 4444 4444 4444
比正确输入要容易得多
4444444444444444
责备用户确实没有任何好处,因为他们在这里输入了您意想不到的字符。
这也意味着确保您的输入字段 至少有 24 个字符的空间,否则输入空格的用户将用完空间。 我建议您使字段足够宽以显示 32 个字符并最多允许 64 个字符;这为扩展提供了充足的空间。