2009-08-20 52 views
66

信用卡類型可以僅從信用卡號碼中確定嗎?按號碼確定信用卡類型?

這是建議還是總是詢問客戶他們正在使用的信用卡類型?

我用google搜索了一下,發現這個算法:http://cuinl.tripod.com/Tips/o-1.htm,這樣可靠嗎?

感謝

+0

+1 - 總是想知道PayPal的圓滑卡參賽作品形式。 – 2010-10-09 01:29:13

+2

可能的重複[你如何檢測基於數字的信用卡類型?](http://stackoverflow.com/questions/72768/how-do-you-detect-credit-card-type-based-on-number) – 2014-04-19 07:36:43

回答

32

是的,你提到的網站是正確的。許多網站,包括Google Checkout我相信,依靠卡片類型的自動檢測。這很方便,使用戶界面更簡潔(少一個輸入框)並節省時間。前進!

+9

+1可能是爲卡類型提供下拉框的唯一原因是作爲錯誤檢查的手段。 – 2009-09-13 07:50:48

+3

下拉列表或圖標列表仍然有用 - 因爲它允許您在輸入之前查看公司接受的卡類型 - 例如,某些卡可能不接受美國運通卡,食客,大師等。 – 2012-12-17 03:55:01

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 2009-08-20 19:19:25

+0

@ gbjbaanb的評論更新後的網址:http://www.barclaycard.co.uk/business/documents/pdfs/bin_rules.pdf – Tao 2012-07-09 11:53:16

21

我聽說有個很好的理由讓他們選擇(即使你可以弄明白),以便他們知道你接受的信用卡清單

+6

+1瞭解接受什麼卡總是一個好主意。 – MitMaro 2009-08-20 19:14:39

+0

此外,能夠檢查的只是一件好事。 – 2009-08-20 19:18:18

+20

有趣的理由,但我不同意它。您可以輕鬆地*顯示*用戶使用小圖標或文字接受哪些卡片,而不會讓他們做任何額外的工作。 – EMP 2010-06-09 00:12:12

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 2009-08-20 19:14:21

+0

是我的壞...我只記得使用該功能,並不得不更新一些例外,因爲客戶抱怨(一些有效的cc#沒有通過) - 但這實際上是由於長度檢查 – Niko 2009-08-20 19:58:19

+0

大多數卡的長度是16# (英國)Maestro可以達到19,所以長度檢查將成爲PITA。 – 2009-08-28 10:37:04

4

Wikipedia包含了大部分卡的前綴列表。您發佈的鏈接中缺少一些卡片。它也顯示您提供的鏈接是有效的。

要求卡類型的一個原因是額外的驗證,比較用戶提供的數字。

10

作爲消費者,我討厭先選擇一張卡。我想開始輸入數字。

此問題在第153-154頁的Wroblewski的Web Form Design中討論。它位於「不必要的輸入」一章的「移除問題」部分。給出的例子是Paypal,當你輸入你的號碼時,它會突出顯示卡的類型。

+0

如果他們不接受美國運通(如經常發生的情況)會發生什麼?你列出你不接受的卡片嗎? – 2009-08-20 19:29:55

+6

貝寶擁有所有允許顯示的卡類型的圖形表示,但是有幻影。當您輸入號碼時,匹配卡將亮起至全部亮度。 – Nosredna 2009-08-20 19:39:37

1

在Python這種實現方式應該美國運通,發現,萬事達,維薩工作:

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

信用卡不是太糟糕,因爲他們遵循一套規則;我們有Maestro卡,因爲他們使用與信用卡生產者相同的起始碼,並且擁有超過16位的數字,所以會引起所有問題。 – 2009-08-28 10:38:00

1

如果您接受所有信用卡具有相同的屬性,然後只是讓用戶輸入卡號等屬性(失效日期,CVV等)。但是,某些卡類型需要輸入不同的字段(例如英國大師卡的開始日期或發行編號)。在這些情況下,您必須擁有所有字段,從而令用戶感到困惑,或者某些Javascript隱藏/顯示相關字段,再次使用戶體驗有點奇怪(字段消失/出現,因爲他們輸入信用卡號碼) 。在這些情況下,我建議首先要求卡類型。

2

下面是一個快速骯髒的方式來自動確定卡的類型,並在用戶輸入時顯示給用戶。

這意味着 a)用戶不必選擇它和 b)他們不會浪費時間尋找不存在的下拉菜單。

Amex,Visa和Mastercard非常簡單的jQuery版本。 如果需要其他類型的卡,你可以採取

$('[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> 

我有.unknown以顯示變灰CSS規則文本。

3

這是第一後

<?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 /範圍列表的探索中提到的PHP版本同樣的算法,省去晚餐俱樂部(現在屬於發現無論如何) ,列出了不再存在的卡類型,並應將其摺疊成其他類型(enRoute,Carte Blanche),並忽略日益重要的Maestro International購物車類型。

正如@亞歷確認,可以從BIN號碼中確定卡的類型,許多公司都這樣做,但這樣做始終如一,正確不是微不足道的:卡品牌不斷變化,跟蹤事情變得更加複雜您嘗試處理區域借記卡(愛爾蘭的激光,歐洲的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(但它似乎並不包括探索出於某種原因 - 想必他們不會對發現處理網絡?)

看起來很平常,一個正確的卡片識別算法/方法/函數需要維護,所以除非你的檢測程序是非關鍵/信息性的(例如@ Simon_Weaver的建議),或者你爲了保持最新狀態,我建議您跳過自動檢測。

1

就我個人而言,我沒有問題先選擇卡片類型。但在我看來,信用卡號碼輸入有兩個方面是有問題的。

最糟糕的是無法輸入數字組之間的空格。包括打印在物理卡片上的空格將使得用戶進行掃描以確認他們已經正確輸入信息的數字變得非常容易。每當我遇到這種無處不在的缺陷時,我感覺我正在被推進到一個石器時代,當用戶輸入無法過濾以去除不必要的字符時。

第二是需要放置電話訂單時聽取供應商重複卡號給你。所有的信用卡收件人實際需要的是一個UI,使他們能夠訪問驗證碼方案,驗證cc號碼是否有效。根據這個算法,前15位(或者很多)數字計算最後一位數字 - 實際上不可能「愚弄」。對於胖手指編號爲「合格」,需要在15位數中至少有兩個相互抵消的錯誤。除非算法存在通過轉置相鄰數字(一種常見的入口錯誤)而被不適當地愚弄的缺陷,我懷疑它,除了它比任何人類雙重檢查更可靠。

2

條紋已經提供了這個奇妙的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