为有效信用卡生成随机数的好方法是什么?

时间:2012-07-20 13:13:17

标签: java credit-card

我正在开发一套Java工具,用于验证和使用信用卡。到目前为止,我得到了支持:

  • LUHN验证。

  • 日期验证(简单过期)。

  • 基于品牌(Visa,MasterCard等)的卡代码长度验证(CVV,CVC,CID)。

  • 信用卡号码长度验证(基于品牌)。

  • BIN / IIN验证(针对有效数字的数据库)。

  • 隐藏数字(425010 * * * * * * 1234)

为了使工具集更加完整,我想根据不同的卡品牌创建一个信用卡随机数生成器。此功能(希望)可以使我的测试用例更可靠。

基本上,我希望能够生成以下数字:

  • LUHN有效

  • 根据品牌前缀

  • 有效
  • 根据BIN / IIN前缀号

  • 有效

对于BIN / IIN有效卡号,我打算从数据库中查找随机BIN / IIN号码(根据当然的品牌),然后使用Random追加剩余的数字。显然,这在大多数情况下都不会有效,我将不得不增加其中一个数字,直到它通过LUHN验证。

我似乎无法想到更好的方法。也许有人可以建议一些更聪明的东西......?

期待您的建议!提前致谢! :)

3 个答案:

答案 0 :(得分:4)

不久前,我创作了一个名为 MockNeat 的图书馆。其中一项功能是允许开发人员生成不同的有效信用卡号。

检查此方法:creditCards()

将1000张信用卡AMEX和万事达卡写入文件以供日后使用的简短示例:

 MockNeat m = MockNeat.threadLocal();
    final Path path = Paths.get("cc.txt");

// Write in a file 1000 credit cards AMEX and Mastercard:
 m.creditCards()
            .types(MASTERCARD, AMERICAN_EXPRESS)
            .list(1000)
            .consume(list -> {
                try { Files.write(path, list, CREATE, WRITE); }
                catch (IOException e) { e.printStackTrace(); }
            });

答案 1 :(得分:2)

  

此功能将(希望)使我的测试用例更可靠。

我不相信。根据我的经验,在单元测试中使用随机数据并不是一个好主意,因为你永远不知道你是否已经涵盖了所有重要案例......和错误。

我建议您手动创建测试信用卡号码,并注意它们涵盖了所有需要测试的案例。

答案 2 :(得分:1)

这里有一些 Groovy 来生成 LUHN 有效信用卡.. 我相信你可以用你自己的语言重写它:

cardPrepend = "400141"
cardLength = "16"

random = new Random()
myString = ""

    (cardLength.toInteger() - cardPrepend.length()).times{
        randomNumber = random.nextInt(9)
        myString = myString + randomNumber.toString()  
    }

    myString = cardPrepend + myString

    myStringMinusLastDigit = myString.substring(0, myString.length()-1)
    mod10Digit = getMod10Digit(myStringMinusLastDigit)
    myString = myStringMinusLastDigit + mod10Digit

    return  """${myString}"""  


//-------------------------------------------------------------------------
def getMod10Digit(String number) {
    int weight = 2;
    int sum    = 0;
    for (int i = number.length() - 1; i >= 0; i--) {
        int digit = weight * Integer.parseInt(number.substring(i,i+1));
        sum = sum + (digit / 10) + (digit % 10);
        weight = (weight == 2) ? 1: 2;
    }
 
    
    return ((10 - (sum % 10)) % 10);
    }