fake_credit_card
Version:
Fake Credit Card Number Generator - http://creditcardvalidator.org
240 lines (206 loc) • 7.13 kB
JavaScript
/* jshint esversion:8 */
const fakeCreditCard = (() => {
const _flags = {
ELO: "elo",
JCB: "jcb",
AMEX: "amex",
VISA: "visa",
DINERS: "diners",
MASTER: "master",
VOYAGER: "voyager",
ENROUTE: "enroute",
DISCOVER: "discover",
UNIONPAY: "unionpay",
HIPERCARD: "hipercard",
HIPERCARD_LG: "hipercard_lg"
};
let _pseudoRandom = Math.random;
let howMany = null;
const scheme = (() => {
let lst = {};
Object.keys(_flags).forEach(key => {
switch (key) {
case _flags.MASTER.toUpperCase():
lst[key] = {
prefixList: ["51", "52", "53", "54", "55"],
digitCount: 16
};
break;
case _flags.VISA.toUpperCase():
lst[key] = {
prefixList: ["4539", "4556", "4916", "4532", "4929", "40240071", "4485", "4716", "4"],
digitCount: 16
};
break;
case _flags.AMEX.toUpperCase():
lst[key] = {
prefixList: ["34", "37"],
digitCount: 15
};
break;
case _flags.DINERS.toUpperCase():
lst[key] = {
prefixList: ["300", "301", "302", "303", "36", "38"],
digitCount: 14
};
break;
case _flags.DISCOVER.toUpperCase():
lst[key] = {
prefixList: ["6011"],
digitCount: 16
};
break;
case _flags.UNIONPAY.toUpperCase():
lst[key] = {
prefixList: ["622305", "622698", "621483", "622202"],
digitCount: 16
};
break;
case _flags.ENROUTE.toUpperCase():
lst[key] = {
prefixList: ["2014", "2149"],
digitCount: 16
};
break;
case _flags.JCB.toUpperCase():
lst[key] = {
prefixList: ["35"],
digitCount: 16
};
break;
case _flags.VOYAGER.toUpperCase():
lst[key] = {
prefixList: ["8699"],
digitCount: 16
};
break;
case _flags.HIPERCARD.toUpperCase():
lst[key] = {
prefixList: ["606282"],
digitCount: 16
};
break;
case _flags.HIPERCARD_LG.toUpperCase():
lst[key] = {
prefixList: ["606282", "3841"],
digitCount: 16
};
break;
case _flags.ELO.toUpperCase():
lst[key] = {
prefixList: (function(){
list = ["5067","6277","6363","6550"];
for(var i=5090; i<=5099; i++) {
list.push(i + "");
}
for(i=6500; i<=6509; i++){
list.push(i + "");
}
for(i=6516; i<=6517; i++){
list.push(i + "");
}
return list.sort();
}()),
digitCount: 16
};
break;
}
});
return lst;
})();
const strrev = (str) => {
return str.split("").reverse().join("");
};
const completed_number = (prefix, length) => {
let ccnumber = prefix;
while (ccnumber.length < (length - 1)) {
ccnumber += Math.floor(_pseudoRandom() * 10);
}
let reversedCCnumberString = strrev(ccnumber);
let reversedCCnumber = [];
for (let i = 0; i < reversedCCnumberString.length; i++) {
reversedCCnumber[i] = parseInt(reversedCCnumberString.charAt(i));
}
let sum = 0;
let pos = 0;
while (pos < length - 1) {
let odd = reversedCCnumber[pos] * 2;
if (odd > 9) {
odd -= 9;
}
sum += odd;
if (pos != (length - 2)) {
sum += reversedCCnumber[pos + 1];
}
pos += 2;
}
let checkdigit = ((Math.floor(sum / 10) + 1) * 10 - sum) % 10;
ccnumber += checkdigit;
return ccnumber;
};
const credit_card_number = (prefixList, length, howMany) => {
let result = [];
for (let i = 0; i < howMany; i++) {
let randomArrayIndex = Math.floor(_pseudoRandom() * prefixList.length);
let ccnumber = prefixList[randomArrayIndex];
result.push(completed_number(ccnumber, length));
}
return result;
};
const generate = (flag, howMany, randomGen) => {
_pseudoRandom = randomGen || _pseudoRandom;
let amount = howMany || 1;
if (Object.keys(_flags).indexOf(flag) >= 0) {
return credit_card_number(
scheme[flag].prefixList,
scheme[flag].digitCount,
amount
);
}
throw {
exception: "flag not found",
flag: flag
};
};
const getCards = (flag) => {
let list = [];
generate(flag, howMany).forEach(card => {
list.push({
number: card
});
});
return list;
};
const getExpiration = (flag) => {
return getCards(flag).filter(number => {
number.expiration = Math.round(Math.random() * 11 + 1) + "/" + parseInt(new Date().getFullYear() * 1 + (Math.round(Math.random() * 7)));
return true;
});
};
const getCvv = (flag) => {
return getExpiration(flag).filter(number => {
number.cvv = Math.round(Math.random() * 899) + 100;
return true;
});
};
const _getCards = (flag) => {
flag = flag.toUpperCase();
return {
withCvv: getCvv(flag),
cardNumber: getCards(flag),
withExpiration: getExpiration(flag)
};
};
const _setHowMany = (many) => {
howMany = many;
return {
flag: _getCards
};
};
return {
flags: _flags,
howMany: _setHowMany,
flag: _getCards
};
})();
module.exports = fakeCreditCard;