8

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

  • LUHN 验证。

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

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

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

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

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

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

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

  • LUHN 有效

  • 基于品牌前缀有效

  • 基于 BIN/IIN 前缀号码有效

对于 BIN/IIN 有效卡号,我正在考虑从数据库中查找一个随机 BIN/IIN 号码(当然基于品牌),然后使用Random. 显然,这在大多数情况下都是无效的,我将不得不增加一个数字,直到它通过 LUHN 验证。

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

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

4

3 回答 3

4

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

检查此方法:creditCards()

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

 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(); }
            });
于 2017-03-29T07:07:36.860 回答
2

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

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

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

于 2012-07-20T15:02:58.540 回答
2

这里有一些 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);
    }
于 2021-05-24T21:26:27.227 回答