8

私は、クレジットカードを検証して操作するための一連のツールをJavaで開発しています。これまでのところ、私は以下をサポートしています。

  • LUHN検証。

  • 日付の検証(単純な有効期限)。

  • ブランド(Visa、MasterCardなど)に基づくカードコードの長さの検証(CVV、CVC、CID)。

  • クレジットカード番号の長さの検証(ブランドに基づく)。

  • BIN / IIN検証(有効な番号のデータベースに対して)。

  • 数字を隠す(425010 * * * * * * 1234)

ツールセットをもう少し完全にするために、さまざまなカードブランドに基づいてクレジットカード乱数ジェネレーターを作成したいと思います。この機能により、(うまくいけば)私のテストケースの信頼性が少し高まります。

基本的に、次のような数値を生成できるようにしたいと思います。

  • LUHNは有効です

  • ブランドプレフィックスに基づいて有効

  • BIN/IINプレフィックス番号に基づいて有効

BIN / IINの有効なカード番号については、データベースからランダムなBIN / IIN番号を検索し(もちろんブランドに基づいて)、残りの数字を。を使用して追加することを考えていますRandom。明らかに、それはほとんどの場合有効ではなく、LUHN検証に合格するまで数字の1つをインクリメントする必要があります。

これ以上の方法は考えられないようです。おそらく誰かがもう少し賢い何かを提案するかもしれません...?

あなたの提案を楽しみにしています!前もって感謝します!:)

4

3 に答える 3

4

少し前に、 MockNeatというライブラリを作成しました。機能の1つは、開発者がさまざまな有効なクレジットカード番号を生成できるようにすることです。

このメソッドを確認してください: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 に答える