如何区分支付卡(例如信用卡/借记卡)号码和非支付卡号码?

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*,因此任何以 5152535455 开头的卡都是万事达卡,但以56 不是。 (它实际上是一张 Maestro 卡,它是 MasterCard 的子品牌,但它在技术上仍然是独立的——一个是借记卡,另一个是贷记卡。)公共 BIN 上无法识别的任何东西几乎肯定是会员卡。

这可以是一个数据库表,但不一定是 - 您可以轻松地将其硬编码到您的应用程序中。但一定要让它可调。万事达卡将在即将到来的 10 月开始引入以 2 开头的卡号……如果您无法修改您的应用以支持该卡号,您将会惹恼用户。

This table on Wikipedia 具有所有主要的 BIN 范围。还有at least one company 销售的 API 比***更详细,并且比***保持最新。

【讨论】:

以上是关于如何区分支付卡(例如信用卡/借记卡)号码和非支付卡号码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中使用 Braintree 实现支付应用

信用卡/借记卡的 Paypal 支付网关

支付流程的测试点

如何在不使用任何支付网关的情况下验证信用卡?

卡支付 使用 PayPal 安卓

如何在不登录Paypal的情况下使用信用卡支付