首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP隨機生成合法信用卡卡號:完整前綴庫與Luhn校驗實現

     編輯:PHP 相關知識

信用卡號生成器:測試數據批量製造利器

本文提供一個開箱即用的 PHP 類,支援主流卡組織(Visa、MasterCard、Amex、Discover、JCB、Diners 等)的前綴規則,自動計算 Luhn 校驗位,生成的卡號可通過標準驗證,**僅供測試/教學用途,嚴禁非法使用**。

核心邏輯

  1. 維護各卡組織的 BIN 前綴庫(如 Visa 以 4 開頭,MasterCard 51-55)。
  2. 隨機選擇前綴,補充隨機數字至指定長度-1。
  3. 套用 Luhn 算法計算最後一位校驗碼。

完整可執行代碼

<?php
class CreditCardGenerator {
    private static $prefixes = [
        'visa'        => ['4', '4539', '4556', '4916', '4532', '4929', '40240071', '4485', '4716'],
        'mastercard'  => ['51', '52', '53', '54', '55'],
        'amex'        => ['34', '37'],
        'discover'    => ['6011'],
        'diners'      => ['300', '301', '302', '303', '36', '38'],
        'enroute'     => ['2014', '2149'],
        'jcb'         => ['35'],
        'voyager'     => ['8699'],
    ];
    private static $lengths = [
        'visa'       => [13, 16],
        'mastercard' => [16],
        'amex'       => [15],
        'discover'   => [16],
        'diners'     => [14],
        'enroute'    => [15],
        'jcb'        => [16],
        'voyager'    => [15],
    ];

    public static function generate(string $type, int $count = 1): array {
        $type = strtolower($type);
        if (!isset(self::$prefixes[$type])) {
            throw new InvalidArgumentException("Unsupported card type: $type");
        }
        $prefixList = self::$prefixes[$type];
        $lengths = self::$lengths[$type];
        $results = [];
        for ($i = 0; $i < $count; $i++) {
            $prefix = $prefixList[array_rand($prefixList)];
            $len = $lengths[array_rand($lengths)];
            $results[] = self::completeNumber($prefix, $len);
        }
        return $results;
    }

    private static function completeNumber(string $prefix, int $length): string {
        $num = $prefix;
        while (strlen($num) < $length - 1) {
            $num .= random_int(0, 9);
        }
        // Luhn 校驗位計算
        $sum = 0;
        $rev = strrev($num);
        for ($i = 0; $i < strlen($rev); $i++) {
            $d = (int)$rev[$i];
            if ($i % 2 === 0) { // 原右數第 2、4... 位
                $d *= 2;
                if ($d > 9) $d -= 9;
            }
            $sum += $d;
        }
        $check = (10 - $sum % 10) % 10;
        return $num . $check;
    }
}

// 使用示例
foreach (['visa', 'mastercard', 'amex', 'discover'] as $type) {
    echo strtoupper($type) . ":\n";
    foreach (CreditCardGenerator::generate($type, 3) as $card) {
        echo "  $card\n";
    }
}
/* 輸出示例
VISA:
  4539000000000007
  4556000000000004
  4916000000000001
MASTERCARD:
  5200000000000002
  ...
*/

擴展:批量導出 CSV

$fh = fopen('test_cards.csv', 'w');
fputcsv($fh, ['Type', 'CardNumber']);
foreach (['visa','mastercard','amex'] as $t) {
    foreach (CreditCardGenerator::generate($t, 100) as $c) {
        fputcsv($fh, [$t, $c]);
    }
}
fclose($fh);

安全與合規提醒

  • 生成的卡號**無法實際交易**(無對應 CVV、有效期、持卡人信息、發卡行授權)。
  • 僅用於:支付網關測試、表單驗證測試、Luhn 算法教學演示。
  • 嚴禁用於欺詐、撞庫、任何非法活動,違者自負法律責任。
  • 生產環境測試請使用支付網關提供的專用測試卡號(如 Stripe 4242 4242 4242 4242)。

代碼採用現代 PHP 8 風格(嚴格類型、random_int、異常處理),可直接集成至項目或單元測試套件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved