我正在开发一套Java工具,用于验证和使用信用卡。到目前为止,我得到了支持:
LUHN验证。
日期验证(简单过期)。
基于品牌(Visa,MasterCard等)的卡代码长度验证(CVV,CVC,CID)。
信用卡号码长度验证(基于品牌)。
BIN / IIN验证(针对有效数字的数据库)。
隐藏数字(425010 * * * * * * 1234)
为了使工具集更加完整,我想根据不同的卡品牌创建一个信用卡随机数生成器。此功能(希望)可以使我的测试用例更可靠。
基本上,我希望能够生成以下数字:
LUHN有效
根据品牌前缀
根据BIN / IIN前缀号
对于BIN / IIN有效卡号,我打算从数据库中查找随机BIN / IIN号码(根据当然的品牌),然后使用Random
追加剩余的数字。显然,这在大多数情况下都不会有效,我将不得不增加其中一个数字,直到它通过LUHN验证。
我似乎无法想到更好的方法。也许有人可以建议一些更聪明的东西......?
期待您的建议!提前致谢! :)
答案 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);
}