银行卡 / 信用卡号校验
开发使用 Luhn 校验和验证卡号并识别发卡品牌(Visa、Mastercard、Amex、UnionPay、Discover)。完全在浏览器本地运行。
不获取远程 URL;请直接粘贴你的 JSON。
- 品牌
- Luhn 校验
- 长度
本页内容
什么是银行卡号校验器?#
支付卡号(即 PAN,Primary Account Number)并不是一串随机数字。它的前若干位是 BIN 前缀,标识发卡方(Visa 以 4 开头,Mastercard 以 51–55 或 2221–2720 开头,以此类推);它的总长度落在该品牌特有的一个窄区间里;它的最后一位是校验位,按某种算法算出来,使整串数字满足 Luhn 校验。一个校验器要做的,就是把这三层信号拆开,告诉你某一串数字是不是格式合法——而不是告诉你这是一张真实发行、当前可用、能扣到钱的卡。
本页做的就是这件事,而且完全在你的浏览器里完成。输入或粘贴一串数字,它会根据 BIN 前缀识别品牌、把数字格式化成易读的 4 位一组、跑一遍 Luhn 校验,并按该品牌的实际长度规则核对位数。你会在这些场景用到它:做收银台表单时(我的字段级校验和真实的 BIN 规则对得上吗?)、想搞懂 Luhn 是怎么工作时、或者要核对一段测试数据时。
切勿输入真实卡号。 请使用支付网关公布的测试卡号(test PAN),或者你自己为学习而生成的数字。本工具全程本地运行、不传输任何数据,但把任何 PAN 都当作敏感信息对待,永远是对的。
如何使用#
- 先看输入框上方的 隐私说明——它确认你输入的数字不会离开浏览器。
- 在 卡号 字段里输入或粘贴。空格、连字符、点号、字母都会被自动剥离;你把
4111-1111 1111.1111直接粘进去,会被读成4111111111111111。 - 点 示例(Sample)载入一张常见的 Visa 测试卡号,或点 清空(Clear)重置。
- 阅读结果卡片:
- 判定(verdict)行说明这串数字是否格式合法。
- 品牌徽标 显示识别出的发卡方(Visa、Mastercard、American Express、Discover、UnionPay),或匹配不到任何 BIN 前缀时显示「未知」。
- 分组(grouped)把数字按 4 位一组展示,方便复制。
- 下面三行检查分别报告 品牌、Luhn(通过 / 未通过)和 长度(合规 / 越界),让你看清哪一条规则没过,而不是只甩给你一个干瘪的「无效」。
主要特性#
- 从零实现的 Luhn 校验。 就是卡号从上世纪 60 年代起一直在用的那套算法:从右往左遍历,每隔一位乘 2,求和,再判断能否被 10 整除。末尾那位校验位的存在,保证了任何单个数字的输错都一定会被查出。
- 五种品牌的 BIN 前缀识别。 Visa、Mastercard、American Express、Discover、UnionPay,按优先级顺序匹配,避免以
6开头的品牌(Discover 的 6011/65 与 UnionPay 的 62)互相冲突。 - 按品牌核对长度。 Amex 是 15 位;Visa 是 13 或 16 位;Discover 和 UnionPay 可以是 16 到 19 位。应用的是所识别品牌对应的长度规则,前缀未知时退回到通用的 12–19 位区间。
- 对各种语种数字安全。 阿拉伯-印度数字(٤١١١)、波斯语数字、天城文数字、孟加拉语数字、全角数字(123)都会在校验前被转写成 ASCII 0–9,所以同一张 PAN 不论用户用什么输入法、什么语种环境,校验结果都一致。
- 4 位一组的显示格式。 16 位 PAN 变成
4111 1111 1111 1111;15 位 Amex 变成熟悉的3782 8224 6310 005(4-4-4-3)。 - 严格本地。 没有后端,也没有任何网络请求。PAN 在内存里处理,并在同一次按键里渲染进结果卡片。
实战示例#
点 示例 载入经典的 Visa 测试卡号,或者输入 4111 1111 1111 1111。结果卡片读数:
verdict Valid
brand Visa
grouped 4111 1111 1111 1111
Luhn pass
length ok (16 digits)
再试一张 American Express 测试卡号,故意带点别扭的空格——粘贴 3782 822463 10005。工具剥掉空格,从 37 前缀识别出 Amex,并按 Amex 自己的分组方式重新排版:
verdict Valid
brand American Express
grouped 3782 8224 6310 005
Luhn pass
length ok (15 digits)
最后,把 Visa 卡号的某一位改成 4111 1111 1111 1112。品牌和长度依然没问题,但 Luhn 这回过不了——工具会明确告诉你,而不是把「是哪条检查挂了」藏起来:
verdict Invalid
brand Visa
grouped 4111 1111 1111 1112
Luhn fail
length ok (16 digits)
在调试表单时,这种区分很有价值:Luhn 挂了通常意味着输错了某一位;长度挂了则意味着品牌不对,或者粘贴时被截断了。
常见问题#
显示「合法」就代表这卡真的能用吗?#
不是。「合法」只表示这串数字格式正确——它的前缀能对应到已知品牌、长度符合该品牌、并且通过 Luhn 校验。它完全不说明这张卡是否发行过、是否仍在有效期内、是否有余额。请把它当成格式检查来看待,就像你校验一个邮箱地址的形状,并不知道这个收件箱是否真实存在。
为什么 Luhn 能抓住每一次单个数字的输错?#
因为校验和会让相隔的数字轮流乘 2:改动其中一位,会让总和偏移一个永远不是 10 的倍数的量;而交换相邻两位数字带来的总和变化,Luhn 同样能察觉(只有极窄的例外)。它当初被设计出来,正是为了抓住人在键盘上最容易犯的那类输录错误。
我粘贴的数字是非拉丁字符的,还能用吗?#
能。校验器在做任何事之前,会先把阿拉伯-印度、波斯、天城文、孟加拉、全角数字字形转写成 ASCII,所以 ٤١١١ 会被当作 4111 处理。这让校验在各种语种和输入法下保持一致,而「分组」展示里也始终用 ASCII 数字。
支持哪些卡品牌?#
Visa、Mastercard、American Express、Discover、UnionPay,按各自公开的 BIN 前缀范围识别。前缀匹配不到这五种(比如以 1 或 9 开头)的数字会报「未知」品牌;但只要长度落在通用 12–19 位区间、且通过 Luhn,它仍然会被判为格式合法——只是不属于这五种已建模品牌之一。