A library for determining credit card type
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 15 天前 | ||
| 2 个月前 | ||
| 2 天前 | ||
| 2 个月前 | ||
| 11 年前 | ||
| 6 年前 | ||
| 2 个月前 | ||
| 5 年前 | ||
| 6 个月前 | ||
| 5 年前 | ||
| 2 天前 | ||
| 15 天前 | ||
| 8 年前 | ||
| 2 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 5 年前 |
Credit Card Type

Credit Card Type 提供了一个实用的工具方法,可通过完整卡号或部分卡号来判断信用卡类型。它并非验证库,而是一个较小的组件,用于帮助您构建自己的验证或 UI 库。
该库专为输入时实时检测(支持部分卡号)而设计,采用 CommonJS 编写,因此您可以在 Node、io.js 和 浏览器 中使用。
下载
如需通过 npm 安装:
npm install credit-card-type
示例
var creditCardType = require("credit-card-type");
// The card number provided should be normalized prior to usage here.
var visaCards = creditCardType("4111");
console.log(visaCards[0].type); // 'visa'
var ambiguousCards = creditCardType("6");
console.log(ambiguousCards.length); // 6
console.log(ambiguousCards[0].niceType); // 'Discover'
console.log(ambiguousCards[1].niceType); // 'UnionPay'
console.log(ambiguousCards[2].niceType); // 'Maestro'
API
creditCardType(number: String)
creditCardType 会返回一个对象数组,每个对象包含以下数据:
| 键名 | 类型 | 描述 |
|---|---|---|
niceType |
String |
卡片品牌的易读表示形式。 - Visa- Mastercard- American Express- Diners Club- Discover- JCB- UnionPay- Maestro- Mir- Elo- Hiper- Hipercard- Verve- Naranja- Troy |
type |
String |
卡片品牌的代码友好表示形式(适用于 CSS 中的类名)。可能的值列表请参考下文的卡片类型“常量”。 - visa- mastercard- american-express- diners-club- discover- jcb- unionpay- maestro- mir- elo- hiper- hipercard- verve- naranja- troy |
gaps |
Array |
卡片号码字符串表示形式中间隔的预期索引位置。例如,Visa 卡 4111 1111 1111 1111 在第 4、8 和 12 位有预期的空格。这对于设置自定义格式规则很有用。 |
lengths |
Array |
卡片号码的预期长度数组(不包含空格和 / 字符)。 |
code |
Object |
已确定卡片的安全码相关信息。了解更多关于代码对象的内容,请见下文。 |
如果未找到任何卡片类型,则返回空数组。
注意:提供的卡号应提前进行标准化处理。卡号字符串不应包含任何非整数值(例如,不包含字母或特殊字符)。
creditCardType.getTypeInfo(type: String)
getTypeInfo 会返回一个与指定 type 对应的单一对象(结构与 creditCardType 相同),如果指定的 type 无效或未知,则返回 undefined。
卡类型“常量”
为每种支持的卡类型提供了命名变量:
AMERICAN_EXPRESSDINERS_CLUBDISCOVERELOHIPERCARDHIPERJCBMAESTROMASTERCARDMIRUNIONPAYVISAVERVENARANJATROY
code
不同的卡品牌对其安全码有不同的命名方式,长度也各不相同。
| 品牌 | 名称 | 长度 |
|---|---|---|
Visa |
CVV |
3 |
Mastercard |
CVC |
3 |
American Express |
CID |
4 |
Diners Club |
CVV |
3 |
Discover |
CID |
3 |
JCB |
CVV |
3 |
UnionPay |
CVN |
3 |
Maestro |
CVC |
3 |
Mir |
CVP2 |
3 |
Elo |
CVE |
3 |
Hiper |
CVC |
3 |
Hipercard |
CVC |
4 |
Verve |
CVV |
3 |
Naranja |
CVV |
3 |
Troy |
CVV |
3 |
Visa 卡的完整响应如下所示:
{
"niceType": "Visa",
"type": "visa",
"gaps": [4, 8, 12],
"lengths": [16],
"code": { "name": "CVV", "size": 3 }
}
高级用法
CommonJS:
var creditCardType = require("credit-card-type");
var getTypeInfo = require("credit-card-type").getTypeInfo;
var CardType = require("credit-card-type").types;
ES6:
import creditCardType, {
getTypeInfo,
types as CardType,
} from "credit-card-type";
筛选
creditCardType(cardNumber).filter(function (card) {
return card.type === CardType.MASTERCARD || card.type === CardType.VISA;
});
模式检测
每种卡类型都有一个 patterns 属性,该属性是一个包含数字和数字范围(由两个值组成的数组表示,即最小值和最大值)的数组。
如果模式是一个数字,模块会将其与卡号进行比较。对于长度短于模式的卡号,部分匹配也视为匹配。例如,给定模式 123,则卡号 1、12、123、1234 均会匹配,而 2、13 和 124 则不会。
如果模式是一个数字数组,则会检查卡号是否在这些数字的范围内。同样,也接受部分匹配。例如,给定范围 [100, 123],则卡号 1、10、100、12、120、123 均会匹配,而 2、13 和 124 则不会。
在检测时,模块会遍历每种卡类型的 patterns 数组,若发生匹配,则将该卡类型添加到结果数组中。
当出现多个匹配时,如果完整匹配了某个模式,则优先选择具有更强模式的卡类型。例如,Visa 卡匹配任何以 4 开头的卡号,但有些 Elo 卡也以 4 开头。401178 就是一个例子。因此,对于卡号 4、40、401、4011、40117,模块会报告该卡可能是 Visa 卡或 Elo 卡。一旦卡号变为 401178,模块会识别出与 Elo BIN 的完全匹配,此时模块会报告该卡只能是 Elo 卡。
添加卡类型
您可以使用 addCard 添加模块不支持的其他卡品牌。传入配置对象即可。
creditCardType.addCard({
niceType: "NewCard",
type: "new-card",
patterns: [2345, 2376],
gaps: [4, 8, 12],
lengths: [16],
code: {
name: "CVV",
size: 3,
},
});
如果添加的卡片已存在于模块中,它将覆盖原有卡片。
creditCardType.addCard({
niceType: "Visa with Custom Nice Type",
type: creditCardType.types.VISA,
patterns: [41111, [44, 47]],
gaps: [4, 8, 12],
lengths: [13, 16, 19], // add support for old, deprecated 13 digit visas
code: {
name: "CVV",
size: 3,
},
});
添加新卡会将它们置于测试优先级的底部。优先级由数组决定。默认情况下,优先级如下:
[
creditCardType.types.VISA,
creditCardType.types.MASTERCARD,
creditCardType.types.AMERICAN_EXPRESS,
creditCardType.types.DINERS_CLUB,
creditCardType.types.DISCOVER,
creditCardType.types.TROY,
creditCardType.types.JCB,
creditCardType.types.UNIONPAY,
creditCardType.types.NARANJA,
creditCardType.types.VERVE,
creditCardType.types.MAESTRO,
creditCardType.types.ELO,
creditCardType.types.MIR,
creditCardType.types.HIPER,
creditCardType.types.HIPERCARD,
];
您可以使用 changeOrder 调整顺序。作为第二个参数传入的数字表示卡片在数组中的插入位置。越靠近数组开头,优先级越高。
creditCardType.changeOrder("my-new-card", 0); // give custom card type the highest priority
creditCardType.changeOrder("my-new-card", 3); // give it a priority at position 3 in the test order array
你也可以使用 removeCard 删除卡片。
creditCardType.removeCard(creditCardType.types.VISA);
如果您需要重置已创建的修改,只需调用 resetModifications:
creditCardType.resetModifications();
更新卡类型
您可以使用 updateCard 更新卡。传入卡类型和配置对象。任何未指定的属性都将从原始卡对象继承。
creditCardType.updateCard(creditCardType.types.VISA, {
niceType: "Fancy Visa",
lengths: [11, 16],
});
var visa = creditCardType.getTypeInfo(creditCardType.types.VISA);
// overwritten properties
visa.niceType; // 'Fancy Visa'
visa.length; // [11, 16]
// unchanged properties
visa.gaps; // [4, 8, 12]
visa.code.name; // 'CVV'
如果您需要重置已创建的修改,只需调用 resetModifications:
creditCardType.resetModifications();
美观的卡号格式
function prettyCardNumber(cardNumber, cardType) {
var card = getTypeInfo(cardType);
if (card) {
var offsets = [].concat(0, card.gaps, cardNumber.length);
var components = [];
for (var i = 0; offsets[i] < cardNumber.length; i++) {
var start = offsets[i];
var end = Math.min(offsets[i + 1], cardNumber.length);
components.push(cardNumber.substring(start, end));
}
return components.join(" ");
}
return cardNumber;
}
prettyCardNumber("xxxxxxxxxx343", CardType.AMERICAN_EXPRESS); // 'xxxx xxxxxx 343'
开发
我们使用 nvm 来管理 node 版本,但你并非必须使用。请将下方所有 nvm 相关引用替换为你选择的工具。
nvm install
npm install
执行 npm install 时将安装所有测试依赖项,测试套件可通过 npm test 执行。