如何区分支付卡(例如信用卡/借记卡)号码和非支付卡号码?
Posted
技术标签:
【中文标题】如何区分支付卡(例如信用卡/借记卡)号码和非支付卡号码?【英文标题】:How to differentiate between Payment card (e.g. Credit/Debit cards) number and Non-Payment cards numbers? 【发布时间】:2017-02-07 10:27:21 【问题描述】:我正在开发一个移动支付应用程序。用户可以将他的所有卡添加到应用程序中,包括支付卡(例如信用卡/借记卡/现金卡)和非支付卡(赚取积分的会员卡)。
在添加卡片时,我想区分这两种类型的卡片,并希望在应用内的单独列表中显示它们。
虽然 Luhn 算法可以,但即使是非支付卡也碰巧按照 Luhn 算法计算校验位。
请建议是否有任何其他机制可以实用地区分这两种类型的卡片。
谢谢
【问题讨论】:
我建议让您的应用程序用户根据需要对卡片进行分组,或者使用正则表达式来快速分析常见范围的卡片编号。有很多现成的例子,只是谷歌。通常的正则表达式不是 100% 正确的。由于此类表的大小和永久更新,对 Card BIN 表的支持将更加复杂。 除了上面的评论之外,ISO/IEC 7812 是大多数支付卡的标准,因此您可以相当确定支付卡号从 4/5/6 开始.不过,这些范围内可能有一些会员卡,特别是在 6 范围内。此外,一些发卡机构(其中之一是 JCB)完全遵循不同的标准(JCB 卡以 3 开头)。总而言之——让用户自己整理吧! @PaulG - 实际上,7812 适用于 所有 信用卡,包括 JCB。 This table 具有所有主要的 BIN 范围(前几位数字)。值得注意的是,美国运通卡也是以 3 开头,但根据第二位数字很容易与 JCB 区分开来。 github.com/card-io/card.io-android-SDK CardIO 实现根据前 4 位区分卡。可能有帮助 【参考方案1】:正如@iso8583-info-support 在他们的comment 中所暗示的那样,唯一的好方法是BIN 范围查找。 BIN 是卡片的前几位数字(从技术上讲,最多为 6 个),在一定范围内发给发卡机构。例如,Visa“拥有”4*
,因此任何以4
开头的卡都是 Visa 卡。万事达卡“拥有”2221*-2720*
和 51*-55*
,因此任何以 51
、52
、53
、54
或 55
开头的卡都是万事达卡,但以56
不是。 (它实际上是一张 Maestro 卡,它是 MasterCard 的子品牌,但它在技术上仍然是独立的——一个是借记卡,另一个是贷记卡。)公共 BIN 上无法识别的任何东西几乎肯定是会员卡。
这可以是一个数据库表,但不一定是 - 您可以轻松地将其硬编码到您的应用程序中。但一定要让它可调。万事达卡将在即将到来的 10 月开始引入以 2 开头的卡号……如果您无法修改您的应用以支持该卡号,您将会惹恼用户。
This table on Wikipedia 具有所有主要的 BIN 范围。还有at least one company 销售的 API 比***更详细,并且比***保持最新。
【讨论】:
以上是关于如何区分支付卡(例如信用卡/借记卡)号码和非支付卡号码?的主要内容,如果未能解决你的问题,请参考以下文章