• Добро пожаловать в сообщество My.Net.Ru

    Мы очень рады, что Вы посетили наш форум WAP|WEB мастеров! Мы сможем помочь Вам с решением ваших вопросов. Пожалуйста, пройдите регистрацию, она занимает не более одной минуты и у вас появится возможность:
      Просматривать документации и техническую информацию
      Скачивать шаблоны и скрипты
      Задавать вопросы и получать на них ответы
      Предоставлять услуги или искать исполнителя
      Отключить назойливую рекламу

PHP Алгоритм определения типа банковской карты

anonymous

Создатель
Команда форума
Божество форума
Сообщения
635
Реакции
152
Баллы
63
Может кому пригодиться в проекте.Например для системы оплат итд.

Есть три части для проверки номера карты:

PATTERN - соответствует шаблону эмитентов (например, VISA/Mastercard/etc.)

CHECKSUM - действительно ли это контрольная сумма (например, не только 13 случайных чисел после "34", чтобы сделать ее номером карты AMEX)

ДЕЙСТВИТЕЛЬНО СУЩЕСТВУЕТ - у него фактически есть связанная учетная запись (вы вряд ли получите это без учетной записи продавца).

шаблон

Префикс MASTERCARD = 51-55, длина = 16 (контрольная сумма Mod10)

Префикс VISA = 4, длина = 13 или 16 (Mod10)

Префикс AMEX = 34 или 37, длина = 15 (Mod10)

Diners Club/Carte Prefix = 300-305, 36 или 38, Length = 14 (Mod10)

Префикс Discover = 6011,622126-622925,644-649,65, Length = 16, (Mod10)

и т.д.. (подробный список префиксов)

Контрольная сумма

Большинство карт используют алгоритм Луна для контрольных сумм:



Вот и сама функция
PHP:
function check_cc($cc, $extra_check = false){
    $cards = array(
        "visa" => "(4\d{12}(?:\d{3})?)",
        "amex" => "(3[47]\d{13})",
        "jcb" => "(35[2-8][89]\d\d\d{10})",
        "maestro" => "((?:5020|5038|6304|6579|6761)\d{12}(?:\d\d)?)",
        "solo" => "((?:6334|6767)\d{12}(?:\d\d)?\d?)",
        "mastercard" => "(5[1-5]\d{14})",
        "switch" => "(?:(?:(?:4903|4905|4911|4936|6333|6759)\d{12})|(?:(?:564182|633110)\d{10})(\d\d)?\d?)",
    );
    $names = array("Visa", "American Express", "JCB", "Maestro", "Solo", "Mastercard", "Switch");
    $matches = array();
    $pattern = "#^(?:".implode("|", $cards).")$#";
    $result = preg_match($pattern, str_replace(" ", "", $cc), $matches);
    if($extra_check && $result > 0){
        $result = (validatecard($cc))?1:0;
    }
    return ($result>0)?$names[sizeof($matches)-2]:false;
}
Пример вывода
PHP:
$cards = array(
    "4111 1111 1111 1111",
);

foreach($cards as $c){
    $check = check_cc($c, true);
    if($check!==false)
        echo $c." - ".$check;
    else
        echo "$c - Not a match";
    echo "<br/>";
}
Выведет нам 4111 1111 1111 1111 - Visa
 

Тему смотрели (Всего: 0)

Тема долгое время не просматривалась.

BodrTop.Ru - Топ рейтинг сайтов Top.Mail.Ru Statok.net
Верх