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

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

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

anonymous

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

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

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)

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

bodr.net.ru Бодрый топ рейтинг мобильных WAP сайтов KatStat.ru - Топ рейтинг сайтов
Top.Mail.Ru dinowap.ru zontop.ru wabtop.ru - Рейтинг и статистика мобильных сайтов vetop.ru statop.ru - Топ рейтинг сайтов Добавить сайт в интернете для рекламы
Сверху