2009-08-20 3 views
66

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

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

Об этом я нашел googled и нашел этот алгоритм: http://cuinl.tripod.com/Tips/o-1.htm, это надежный?

Thanks

+0

+1 - всегда задавался вопросом, как пятно карты Регистрационная форма работы Paypal. –

+2

Возможный дубликат [Как вы определяете тип кредитной карты на основе номера?] (Http://stackoverflow.com/questions/72768/how-do-you-detect-credit-card-type-based-on-number) –

ответ

32

Да, сайт, о котором вы указали, верен. Многие сайты, в т.ч. Google Checkout Я считаю, полагаюсь на автоматическое обнаружение типа карты. Это удобно, делает UI менее загроможденным (на один меньше поля ввода) и экономит время. Преуспевать!

+9

+1 Вероятно, единственная причина предоставления раскрывающегося списка для типа карты - это средство проверки ошибок. –

+3

раскрывающийся список или список значков по-прежнему полезен - поскольку он позволяет вам узнать, какие типы карт принимает компания, прежде чем вводить их, например, некоторые могут не принимать amex, diners, maestro и т. Д. –

7

Я вполне уверен, что по крайней мере для MasterCard, Visa, Discover и American Express это точно. Я никогда не работал с кем-то другим.

Смотрите самое дно этой страницы: http://www.merchantplus.com/resources/pages/credit-card-logos-and-test-numbers/

Кроме того, это может быть полезным для вас» http://www.beachnet.com/~hstiles/cardtype.html

Это довольно интересно: http://en.wikipedia.org/wiki/Bank_card_number

+1

http: //www.barclaycardbusiness. co.uk/docs/binranges.pdf имеет диапазоны BIN для карточек, из британского банка, поэтому он будет точным. – gbjbaanb

+0

Обновленный url для комментария @ gbjbaanb: http://www.barclaycard.co.uk/business/documents/pdfs/bin_rules.pdf – Tao

21

Я слышал одну причину (даже если вы можете это выяснить), чтобы они знали список принятых вами кредитных карт.

+6

+1 Знание того, какие карты принимаются, всегда хорошая идея. – MitMaro

+0

Кроме того, это хорошая вещь, чтобы иметь возможность проверить. –

+20

Интересная причина, но я не согласен с ней. Вы можете легко * показать * пользователю, какие карты вы принимаете с маленькими значками или текстом, не заставляя их выполнять какую-либо дополнительную работу. – EMP

5

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

/** 
* checks a given string for a valid credit card 
* @returns: 
* -1 invalid 
*  1 mastercard 
*  2 visa 
*  3 amex 
*  4 diners club 
*  5 discover 
*  6 enRoute 
*  7 jcb 
*/ 
function checkCC(val) { 
    String.prototype.startsWith = function (str) { 
     return (this.match("^" + str) == str) 
    } 

    Array.prototype.has=function(v,i){ 
     for (var j=0;j<this.length;j++){ 
      if (this[j]==v) return (!i ? true : j); 
     } 
     return false; 
    } 

    // get rid of all non-numbers (space etc) 
    val = val.replace(/[^0-9]/g, ""); 

    // now get digits 
    var d = new Array(); 
    var a = 0; 
    var len = 0; 
    var cval = val; 
    while (cval != 0) { 
     d[a] = cval%10; 
     cval -= d[a]; 
     cval /= 10; 
     a++; 
     len++; 
    } 

    if (len < 13) 
     return -1; 

    var cType = -1; 

    // mastercard 
    if (val.startsWith("5")) { 
     if (len != 16) 
      return -1; 
     cType = 1; 
    } else 
    // visa 
    if (val.startsWith("4")) { 
     if (len != 16 && len != 13) 
      return -1; 
     cType = 2; 
    } else 
    // amex 
    if (val.startsWith("34") || val.startsWith("37")) { 
     if (len != 15) 
      return -1; 
     cType = 3; 
    } else 
    // diners 
    if (val.startsWith("36") || val.startsWith("38") || val.startsWith("300") || val.startsWith("301") || val.startsWith("302") || val.startsWith("303") || val.startsWith("304") || val.startsWith("305")) { 
     if (len != 14) 
     return -1; 
     cType = 4; 
    } else 
    // discover 
    if (val.startsWith("6011")) { 
     if (len != 15 && len != 16) 
      return -1; 
     cType = 5; 
    } else 
    // enRoute 
    if (val.startsWith("2014") || val.startsWith("2149")) { 
     if (len != 15 && len != 16) 
      return -1; 
     // any digit check 
     return 6; 
    } else 
    // jcb 
    if (val.startsWith("3")) { 
     if (len != 16) 
     return -1; 
     cType = 7; 
    } else 
    // jcb 
    if (val.startsWith("2131") || val.startsWith("1800")) {           

     if (len != 15) 
     return -1; 
     cType = 7; 
    } else 
    return - 1; 
    // invalid cc company 

    // lets do some calculation 
    var sum = 0; 
    var i; 
    for (i = 1; i < len; i += 2) { 
     var s = d[i] * 2; 
     sum += s % 10; 
     sum += (s - s%10) /10; 
    } 

    for (i = 0; i < len; i += 2) 
     sum += d[i]; 

    // musst be %10 
    if (sum%10 != 0) 
     return - 1; 

    return cType; 
} 
+0

как устаревший? Благодарю. – Henry

+0

был моим плохим ... я просто вспомнил, что использовал эту функцию и вынужден обновлять какое-то исключение из-за жалоб клиентов (некоторые действительные cC# не прошли), но это было фактически из-за проверки длины – Niko

+0

Большинство карт имеют длину 16 # (Великобритания) Maestro может быть до 19, поэтому проверки длины становятся PITA. –

4

Wikipedia содержит список самых префикс для карточек. Некоторые карточки отсутствуют в указанной вами ссылке. Также представляется, что ссылка, которую вы предоставили, действительна.

Одна из причин, по которой требуется задать тип карты, для дополнительной проверки, сравните то, что предоставил пользователь против числа.

10

Как потребитель, я ненавижу сначала выбирать карту. Я хочу просто начать вводить номер.

Этот вопрос обсуждается в статье Wroblewski Web Form Design на стр. 153-154. Он находится в разделе «Удаление вопросов» главы «Ненужные входы». Приведенный пример - Paypal, в котором указывается тип карты, когда вы ввели свой номер.

+0

И что произойдет, если они не согласятся с Amex (как это часто бывает)? Вы перечисляете карточки, которые не принимаете? –

+6

Paypal имеет графические изображения для всех разрешенных типов карт, показанных, но призванных. Когда вы вводите номер, соответствующая карта становится ярче до полной интенсивности. – Nosredna

1

Эта реализация в 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

Кредитные карты arent слишком плохи, поскольку они следуют набору правил; у нас есть карты Maestro, которые вызывают все проблемы, поскольку они используют те же самые стартовые коды, что и производители кредитных карт, и имеют более 16 цифр. –

1

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

2

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

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

Очень простая версия 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, чтобы отобразить неактивна текст.

3

Это версия PHP того же алгоритма упоминается в 1-й пост

<?php 
function CreditCardType($CardNo) 
{ 
/* 
'*CARD TYPES   *PREFIX   *WIDTH 
'American Express  34, 37   15 
'Diners Club   300 to 305, 36 14 
'Carte Blanche   38    14 
'Discover    6011    16 
'EnRoute    2014, 2149  15 
'JCB     3     16 
'JCB     2131, 1800  15 
'Master Card   51 to 55   16 
'Visa     4     13, 16 
*/  
//Just in case nothing is found 
$CreditCardType = "Unknown"; 

//Remove all spaces and dashes from the passed string 
$CardNo = str_replace("-", "",str_replace(" ", "",$CardNo)); 

//Check that the minimum length of the string isn't less 
//than fourteen characters and -is- numeric 
If(strlen($CardNo) < 14 || !is_numeric($CardNo)) 
    return false; 

//Check the first two digits first 
switch(substr($CardNo,0, 2)) 
{ 
    Case 34: Case 37: 
     $CreditCardType = "American Express"; 
     break; 
    Case 36: 
     $CreditCardType = "Diners Club"; 
     break; 
    Case 38: 
     $CreditCardType = "Carte Blanche"; 
     break; 
    Case 51: Case 52: Case 53: Case 54: Case 55: 
     $CreditCardType = "Master Card"; 
     break; 
} 

//None of the above - so check the 
if($CreditCardType == "Unknown") 
{ 
    //first four digits collectively 
    switch(substr($CardNo,0, 4)) 
    { 
     Case 2014:Case 2149: 
      $CreditCardType = "EnRoute"; 
      break; 
     Case 2131:Case 1800: 
      $CreditCardType = "JCB"; 
      break; 
     Case 6011: 
      $CreditCardType = "Discover"; 
      break; 
    } 
} 

//None of the above - so check the 
if($CreditCardType == "Unknown") 
{ 
    //first three digits collectively 
    if(substr($CardNo,0, 3) >= 300 && substr($CardNo,0, 3) <= 305) 
    { 
     $CreditCardType = "American Diners Club"; 
    } 
} 

//None of the above - 
if($CreditCardType == "Unknown") 
{ 
    //So simply check the first digit 
    switch(substr($CardNo,0, 1)) 
    { 
     Case 3: 
      $CreditCardType = "JCB"; 
      break; 
     Case 4: 
      $CreditCardType = "Visa"; 
      break; 
    } 
} 

return $CreditCardType; 
} 
?> 
3

Введенный код связан имеет список в неполной BIN/диапазон для Discover, опускает клуб Diner (который в настоящее время принадлежит Обнаружить так или иначе) , перечисляет типы карт, которые больше не существуют, и их следует складывать в другие типы (enRoute, Carte Blanche) и игнорирует все более важный тип корзины Maestro International.

Как подтверждено в @Alex, можно определить тип карты из номера BIN, и многие компании делают это, но делают это последовательно и правильно, не тривиально: бренды карт постоянно меняются, а отслеживание вещей становится более сложным, поскольку вы пытаетесь обрабатывать региональные дебетовые карты (Laser in Ireland, Maestro в Европе и т. д.). Я не нашел бесплатную и поддерживаемую (правильную) часть кода или алгоритма для этого везде.

Как @MitMaro poined из, Wikipedia contains a high-level list of card identifiers, а также a more-specific list of BIN numbers and ranges, что хорошее начало, и, как gbjbaanb прокомментировал Barclays has a publically-published list (но это, кажется, не включают в себя Discover по какой-то причине - по-видимому, они не обрабатывают на Discover сеть?)

Как ни крути, правильный алгоритм/метод/функция идентификации карты требует работы для поддержания, поэтому, если ваша процедура обнаружения не является критической/информационной (например, предложение Simon_Weaver), ИЛИ вы я буду рекомендовать вам пропустить автоматическое обнаружение.

1

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

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

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

2

Stripe предоставил это фантастическое javascript библиотека для обнаружения схемы карты. Позвольте мне добавить несколько фрагментов кода и показать вам, как его использовать.

Во-первых Включите его на веб-странице, как

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.payment/1.2.3/jquery.payment.js " ></script> 

Во-вторых использовать функцию cardType для определения схемы карты.

$(document).ready(function() {    
      var type = $.payment.cardType("4242 4242 4242 4242"); //test card number 
      console.log(type);         
}); 

Вот ссылки для ссылок на другие примеры и демонстрации.

  1. Stripe blog for jquery.payment.js
  2. Github repository
Смежные вопросы