Определить тип кредитной карты по номеру? - PullRequest
67 голосов
/ 20 августа 2009

Можно ли определить тип кредитной карты исключительно по номеру кредитной карты?

Это рекомендуется, или мы всегда должны спрашивать клиента о типе кредитной карты, которую они используют?

Я прогуглил об этом и нашел этот алгоритм: http://cuinl.tripod.com/Tips/o-1.htm, это надежно?

Ответы [ 15 ]

2 голосов
/ 24 октября 2009

Вот быстрый грязный способ автоматически определить тип карты и показать ее пользователю, пока он печатает.

Это значит а) пользователь не должен выбирать его и б) они не будут тратить время на поиск выпадающего списка, который не существует.

Очень простая версия jQuery для Amex, Visa и Mastercard. если вам нужны карты других типов, вы можете взять

 $('[id$=CreditCardNumber]').assertOne().keyup(function(){

        // rules taken from http://en.wikipedia.org/wiki/Credit_card_number#cite_note-GenCardFeatures-0
        var value = $(this).val();

        $('#ccCardType').removeClass("unknown");
        if ((/^4/).test(value)) {
            $('#ccCardType').html("Visa");
            return;
        }
        if ((/^5[1-5]/).test(value)) {
           $('#ccCardType').html("Mastercard");
           return;
        }
        if ((/^3[47]/).test(value)) {
           $('#ccCardType').html("Mastercard");
           return;
        }
        $('#ccCardType').html("Enter card number above");
        $('#ccCardType').addClass("unknown");
     });

Это jQuery для этого (ASP.NET MVC):

  Card number: <%= Html.TextBox("PaymentDetails.CreditCardDetails.CreditCardNumber")%>
  Card Type: <span id="ccCardType" class="unknown">Enter card number above</span>

У меня есть правило css для .unknown для отображения серого текста.

1 голос
/ 04 октября 2014

Лично у меня нет проблем с выбором типа карты в первую очередь. Но есть два аспекта ввода номера кредитной карты, которые на мой взгляд проблематичны.

Худшее - невозможность ввести пробелы между группами чисел. Включение пробелов, напечатанных на физических карточках, значительно облегчит пользователю сканирование цифр, чтобы убедиться, что они правильно ввели информацию. Каждый раз, когда я сталкиваюсь с этим вездесущим недостатком, я чувствую, что меня заталкивают в каменный век, когда пользовательский ввод не может быть отфильтрован для удаления ненужных символов.

Вторым является необходимость при размещении заказа по телефону, чтобы послушать поставщика, повторившего номер карты обратно к вам. Все, что на самом деле нужно получателю кредитной карты, - это пользовательский интерфейс, который дает им доступ к схеме контрольных цифр, которая проверяет действительность номера копии. В соответствии с этим алгоритмом первые 15 (или сколько угодно) цифр вычисляют последнюю цифру, и ее «обмануть» практически невозможно. Для того, чтобы «пропустить» толстое число с пальцами, требуется как минимум две взаимно отменяющие ошибки из 15 цифр. Если алгоритм не страдает дефектом непропорционально одурачивания путем транспонирования смежных чисел (общая ошибка ввода), в чем я сомневаюсь, за исключением того, что он более надежен, чем любая двойная проверка человека.

1 голос
/ 13 сентября 2009

Если все принимаемые вами кредитные карты имеют одинаковые свойства, просто дайте пользователю ввести номер карты и другие свойства (срок действия, CVV и т. Д.). Однако для некоторых типов карт требуются разные поля (например, дата начала или номер выпуска для карт UK Maestro). В этих случаях у вас должны быть все поля, что вводит пользователя в заблуждение, или какой-то Javascript, чтобы скрывать / показывать соответствующие поля, снова делая пользователя немного странным (поля исчезают / появляются, когда они вводят номер кредитной карты) , В этих случаях я рекомендую сначала спросить тип карты.

1 голос
/ 20 августа 2009

Эта реализация в Python должна работать для AmEx, Discover, Master Card, Visa:

def cardType(number):
    number = str(number)
    cardtype = "Invalid"
    if len(number) == 15:
        if number[:2] == "34" or number[:2] == "37":
            cardtype = "American Express"
    if len(number) == 13:
        if number[:1] == "4":
            cardtype = "Visa"
    if len(number) == 16:
        if number[:4] == "6011":
            cardtype = "Discover"
        if int(number[:2]) >= 51 and int(number[:2]) <= 55:
            cardtype = "Master Card"
        if number[:1] == "4":
            cardtype = "Visa"
    return cardtype
0 голосов
/ 09 февраля 2019

https://binlist.net/ предлагает бесплатный API. Вам нужно только ввести первые 6 или 8 цифр номера карты, то есть идентификационные номера эмитента (IIN), ранее известные как идентификационный номер банка (BIN).

curl -H "Accept-Version: 3" "https://lookup.binlist.net/45717360"

(перекрестный ответ на более конкретный вопрос: Как определить разницу между дебетовой и кредитной картой )

...