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

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

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

anonymous

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

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

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)

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

KatStat.ru - Топ рейтинг сайтов bodr.pp.ua Бодрый топ рейтинг мобильных WAP сайтов
Топ рейтинг сайтов! Статистика посещаемости сайтов Stata.Me Топ рейтинг для твоего сайта YoTop.Net stats24.ru-лучший топ рейтинг мобильных сайтов Webts.ru - Топ рейтинг сайтов Top.Mail.Ru GiStaT.RU - Рейтинг мобильных сайтов Mobiseo.RU - Рейтинг мобильных сайтов TOPPES.RU - Топ рейтинг сайтов firestat.ru Добавить сайт в интернете для рекламы
Верх