UNPKG

creditcard-generator

Version:

Can generate valid credit card numbers for VISA, Amex, Mastercard, Diners, Discover, EnRoute, JCB, Voyager

203 lines (169 loc) 4.33 kB
var pseudoRandom = Math.random; var visaPrefixList = new Array( "4539", "4556", "4916", "4532", "4929", "40240071", "4485", "4716", "4" ); var mastercardPrefixList = new Array( "51", "52", "53", "54", "55" ); var amexPrefixList = new Array( "34", "37" ); var discoverPrefixList = new Array("6011"); var dinersPrefixList = new Array( "300", "301", "302", "303", "36", "38" ); var enRoutePrefixList = new Array( "2014", "2149" ); var jcbPrefixList = new Array( "35" ); var voyagerPrefixList = new Array("8699"); /** * Revert a String * @param {String} str * @return {String} */ function strrev(str) { if (!str) return ''; var revstr=''; for (var i = str.length-1; i>=0; i--) revstr+=str.charAt(i) return revstr; } /** * Complete a prefixed number-string * @param {String} prefix is the start of the CC number as a string, any number of digits * @param {Number} length is the length of the CC number to generate. Typically 13 or 16 * @return {String} */ function completed_number(prefix, length) { var ccnumber = prefix; // generate digits while ( ccnumber.length < (length - 1) ) { ccnumber += Math.floor(pseudoRandom()*10); } // reverse number and convert to int var reversedCCnumberString = strrev( ccnumber ); var reversedCCnumber = new Array(); for ( var i=0; i < reversedCCnumberString.length; i++ ) { reversedCCnumber[i] = parseInt( reversedCCnumberString.charAt(i) ); } // calculate sum var sum = 0; var pos = 0; while ( pos < length - 1 ) { var odd = reversedCCnumber[ pos ] * 2; if ( odd > 9 ) { odd -= 9; } sum += odd; if ( pos != (length - 2) ) { sum += reversedCCnumber[ pos +1 ]; } pos += 2; } // calculate check digit var checkdigit = (( Math.floor(sum/10) + 1) * 10 - sum) % 10; ccnumber += checkdigit; return ccnumber; } /** * Actually generate a credit card number * @param {[type]} prefixList [description] * @param {[type]} length [description] * @param {[type]} howMany [description] * @return {[type]} [description] */ function credit_card_number(prefixList, length, howMany) { var result = new Array(); for (var i = 0; i < howMany; i++) { var randomArrayIndex = Math.floor(pseudoRandom() * prefixList.length); var ccnumber = prefixList[ randomArrayIndex ]; result.push( completed_number(ccnumber, length) ); } return result; } /** * Supported Card Schemes * @type {Array} */ module.exports.Schemes = { "VISA": { prefixList: visaPrefixList, digitCount: 16 }, "MasterCard": { prefixList: mastercardPrefixList, digitCount: 16 }, "Amex": { prefixList: amexPrefixList, digitCount: 15 }, "Diners": { prefixList: dinersPrefixList, digitCount: 16 }, "Discover": { prefixList: discoverPrefixList, digitCount: 16 }, "EnRoute": { prefixList: enRoutePrefixList, digitCount: 16 }, "JCB": { prefixList: jcbPrefixList, digitCount: 16 }, "Voyager": { prefixList: voyagerPrefixList, digitCount: 16 } } /** * The entry-point function * @param {String} CardScheme The Card Scheme * @param {Number} [howMany] Defaults to 1 * @param {Number} [randomGen] Pseudo Random Generator. Must generate a random number between 0 an 1 * @return {String} */ module.exports.GenCC = function(CardScheme, howMany, randomGen){ pseudoRandom = randomGen || pseudoRandom; var amount = howMany || 1; // Try to get configs to the selected Scheme if (typeof module.exports.Schemes[CardScheme] != 'undefined') { return credit_card_number( module.exports.Schemes[CardScheme].prefixList, module.exports.Schemes[CardScheme].digitCount, amount ); } else { // Defaults to MasterCard return credit_card_number( module.exports.Schemes["MasterCard"].prefixList, module.exports.Schemes["MasterCard"].digitCount, amount ); } }