2009-08-20 15 views
66

क्या क्रेडिट कार्ड का प्रकार पूरी तरह से क्रेडिट कार्ड नंबर से निर्धारित किया जा सकता है?संख्या के आधार पर क्रेडिट कार्ड का प्रकार निर्धारित करें?

क्या यह सलाह दी जाती है या हमेशा क्लाइंट से पूछे जाने वाले क्रेडिट कार्ड के प्रकार से पूछें?

मैंने इसके बारे में googled और यह एल्गोरिदम पाया: http://cuinl.tripod.com/Tips/o-1.htm, यह विश्वसनीय है?

धन्यवाद

+0

+1 - हमेशा आश्चर्य कैसे Paypal के चालाक कार्ड प्रविष्टि प्रपत्र काम करता है। –

+2

संभावित डुप्लिकेट [आप नंबर पर आधारित क्रेडिट कार्ड प्रकार का पता कैसे लगाते हैं?] (Http://stackoverflow.com/questions/72768/how-do-you-detect-credit-card-type-based-on-number) –

उत्तर

32

हां, आपके द्वारा उल्लिखित साइट सही है। कई साइटों, सहित। Google Checkout मुझे विश्वास है, कार्ड प्रकार के स्वचालित पहचान पर भरोसा करें। यह सुविधाजनक है, यूआई को कम अव्यवस्थित (एक कम इनपुट बॉक्स) बनाता है और समय बचाता है। आगे बढ़ें!

+9

+1 कार्ड प्रकार के लिए ड्रॉप-डाउन बॉक्स प्रदान करने का शायद एकमात्र कारण त्रुटि जांच के साधन के रूप में है। –

+3

आइकनों की एक ड्रॉपडाउन या सूची अभी भी उपयोगी है - क्योंकि यह आपको यह देखने की अनुमति देती है कि कंपनी आपके द्वारा दर्ज किए जाने से पहले कौन से कार्ड प्रकार स्वीकार करती है - उदाहरण के लिए कुछ लोग अमेक्स, डिनर, मेस्ट्रो इत्यादि नहीं ले सकते हैं। –

7

मुझे यकीन है कि कम से कम मास्टरकार्ड, वीजा, डिस्कवर और अमेरिकन एक्सप्रेस के लिए यह सटीक है। मैंने कभी किसी अन्य के साथ काम नहीं किया है।

इस पृष्ठ के बिल्कुल नीचे देखें: http://en.wikipedia.org/wiki/Bank_card_number

+1

http: //www.barclaycardbusiness। co.uk/docs/binranges.pdf में ब्रिटेन के बैंक से कार्ड के लिए बीआईएन श्रेणी है, इसलिए यह सटीक होगा। – gbjbaanb

+0

@ gbjbaanb की टिप्पणी के लिए यूआरएल अपडेट किया गया: http://www.barclaycard.co.uk/business/documents/pdfs/bin_rules.pdf – Tao

21

मैं एक अच्छे कारण के बारे में सुना है: http://www.merchantplus.com/resources/pages/credit-card-logos-and-test-numbers/

इसके अलावा यह आपके लिए उपयोगी हो सकता है " http://www.beachnet.com/~hstiles/cardtype.html

यह सुंदर दिलचस्प है उन्हें चुनने के लिए (भले ही आप इसे समझ सकें) ताकि वे आपके द्वारा स्वीकार किए जाने वाले क्रेडिट कार्ड की सूची जान सकें।

+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

मेरा बुरा था ... मुझे बस उस फ़ंक्शन का उपयोग करके याद आया और ग्राहक शिकायत के कारण कुछ अपवाद अपडेट करना पड़ा (कुछ वैध सीसी # नहीं आया) - लेकिन वास्तव में लंबाई की जांच – Niko

+0

अधिकांश कार्ड 16 # लंबाई में हैं (यूके) मेस्ट्रो 1 9 तक हो सकता है ताकि लंबाई की जांच एक पिटा बन जाए। –

4

Wikipedia में अधिकांश कार्ड उपसर्गों की एक सूची है। आपके द्वारा पोस्ट किए गए लिंक से कुछ कार्ड गायब हैं। यह भी प्रतीत होता है कि आपके द्वारा प्रदान किया गया लिंक मान्य है।

कार्ड प्रकार के लिए पूछने का एक कारण अतिरिक्त सत्यापन के लिए है, जो उपयोगकर्ता ने संख्या के विरुद्ध प्रदान किया है उसकी तुलना करें।

10

उपभोक्ता के रूप में, मुझे पहले कार्ड चुनने से नफरत है। मैं सिर्फ संख्या टाइप करना शुरू करना चाहता हूं।

इस मुद्दे पर Wroblewski के Web Form Design पृष्ठों पर 153-154 पर चर्चा की गई है। यह अध्याय "अनावश्यक इनपुट" खंड के "प्रश्नों को हटाने" खंड में है। दिया गया उदाहरण पेपैल है, जो आपके नंबर पर टाइप किए जाने पर कार्ड के प्रकार को हाइलाइट करता है।

+0

और क्या होता है यदि वे अमेक्स स्वीकार नहीं करते हैं (जैसा अक्सर होता है)? क्या आप उन कार्डों को सूचीबद्ध करते हैं जिन्हें आप स्वीकार नहीं करते हैं? –

+6

पेपैल में दिखाए गए सभी स्वीकृत कार्ड प्रकारों के लिए ग्राफिक प्रस्तुतियां हैं लेकिन भूत। जब आप संख्या टाइप करते हैं, मिलान कार्ड पूर्ण तीव्रता तक चमकता है। – Nosredna

1

अजगर में इस कार्यान्वयन एमेक्स, डिस्कवर, मास्टर कार्ड, वीजा के लिए काम करना चाहिए:

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

क्रेडिट कार्ड बहुत खराब नहीं हैं क्योंकि वे नियमों के एक समूह का पालन करते हैं; हमारे पास मेस्ट्रो कार्ड हैं जो सभी मुद्दों का कारण बनते हैं क्योंकि वे क्रेडिट कार्ड उत्पादकों के समान प्रारंभ कोड का उपयोग करते हैं और 16 से अधिक डिगिट्स हैं। –

1

सभी क्रेडिट कार्ड है कि आप स्वीकार करते हैं एक ही गुण है तो बस उपयोगकर्ता कार्ड नंबर और अन्य में प्रवेश करते हैं गुण (समाप्ति तिथि, सीवीवी, आदि)। हालांकि, कुछ कार्ड प्रकारों को दर्ज करने के लिए विभिन्न फ़ील्ड की आवश्यकता होती है (उदाहरण के लिए यूके मेस्ट्रो कार्ड के लिए प्रारंभ तिथि या अंक संख्या)। उन मामलों में, आपके पास या तो सभी फ़ील्ड होना चाहिए, जिससे उपयोगकर्ता को भ्रमित करने के लिए उपयोगकर्ता या कुछ जावास्क्रिप्ट को प्रासंगिक क्षेत्रों को छिपाने/दिखाने के लिए, फिर उपयोगकर्ता को थोड़ा अजीब अनुभव करना पड़ता है (खेतों में गायब/प्रकट होते हैं, क्योंकि वे क्रेडिट कार्ड नंबर दर्ज करते हैं) । उन मामलों में, मैं पहले कार्ड प्रकार के लिए पूछने की सलाह देते हैं।

2

कार्ड प्रकार स्वचालित रूप से निर्धारित करने के लिए एक त्वरित गंदा तरीका है और इसे टाइप करते समय उपयोगकर्ता को दिखाएं।

इसका मतलब है ए) उपयोगकर्ता को इसे चुनना नहीं है और बी) वे एक ड्रॉपडाउन की तलाश में समय बर्बाद नहीं करते हैं जो मौजूद नहीं है।

अमेक्स, वीजा और मास्टरकार्ड के लिए बहुत ही सरल 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"); 
    }); 

यह इस (ASP.NET MVC) साथ देने के लिए jQuery है:

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

मैं के लिए .unknown धूसर हो प्रदर्शित करने के लिए सीएसएस नियम है पाठ।

5

कोडप्रोजेक्ट पर Complete C# or VB code for all kinds of CC related things है।

  • IsValidNumber
  • GetCardTypeFromNumber
  • GetCardTestNumber
  • PassesLuhnTest

यह लेख कोई नकारात्मक टिप्पणी के साथ एक कुछ वर्षों के लिए किया गया है।

3

यह 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

कोड आप लिंक किए गए डिस्कवर के लिए एक अधूरा बिन/रेंज सूची है में उल्लेख किया है एक ही एल्गोरिथ्म के php संस्करण है, डिनर के क्लब को छोड़ देता है (जो अब डिस्कवर के अंतर्गत आता है वैसे भी) , कार्ड प्रकारों को सूचीबद्ध करता है जो अब मौजूद नहीं हैं और इन्हें अन्य प्रकारों (एन रूट, कार्टे ब्लैंच) में तब्दील किया जाना चाहिए, और तेजी से महत्वपूर्ण मेस्ट्रो अंतर्राष्ट्रीय कार्ट प्रकार को अनदेखा कर सकते हैं।

जैसा कि @ एलेक्स ने पुष्टि की है, बीआईएन संख्या से कार्ड प्रकार निर्धारित करना संभव है, और कई कंपनियां ऐसा करती हैं लेकिन लगातार और सही तरीके से ऐसा करना मुश्किल नहीं होता है: कार्ड ब्रांड लगातार बदलते हैं, और चीजों का ट्रैक रखना अधिक जटिल हो जाता है आप क्षेत्रीय डेबिट कार्ड (आयरलैंड में लेजर, यूरोप में मेस्ट्रो इत्यादि) को संभालने का प्रयास करते हैं - मुझे कहीं भी इस के लिए कोड या एल्गोरिदम का नि: शुल्क और बनाए रखा (सही) टुकड़ा नहीं मिला है।

@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 (लेकिन यह किसी कारण के लिए डिस्कवर शामिल करने के लिए नहीं लगता है - शायद वे डिस्कवर पर संसाधित नहीं करते नेटवर्क?)

ऐसा लगता है कि ट्रिवियल एक सही कार्ड-पहचान एल्गोरिदम/विधि/फ़ंक्शन को बनाए रखने के लिए काम करता है, इसलिए जब तक कि आपका पता लगाने की नियमितता गैर-महत्वपूर्ण/सूचनात्मक न हो (उदाहरण के लिए @ साइमन_वेवर का सुझाव), या आप इसे चालू रखने के लिए काम में जाने के लिए, मैं अनुशंसा करता हूं कि आप स्वचालित पहचान छोड़ दें।

1

व्यक्तिगत रूप से मुझे पहले कार्ड प्रकार चुनने में कोई समस्या नहीं है। लेकिन क्रेडिट कार्ड नंबर एंट्री के दो पहलू हैं जो मेरे विचार में समस्याग्रस्त हैं।

सबसे खराब संख्याओं के समूहों के बीच रिक्त स्थान दर्ज करने में असमर्थता है। भौतिक कार्ड पर मुद्रित रिक्त स्थान सहित उपयोगकर्ता को यह सत्यापित करने के लिए स्कैन करना बहुत आसान होगा कि उन्होंने सही ढंग से जानकारी दर्ज की है।हर बार जब मुझे इस सर्वव्यापी कमी का सामना करना पड़ता है, मुझे लगता है कि मुझे पत्थर की उम्र में पीछे की ओर अग्रसर किया जा रहा है जब अनावश्यक पात्रों को हटाने के लिए उपयोगकर्ता इनपुट फ़िल्टर नहीं किया जा सकता था।

दूसरी बात यह है कि विक्रेता को सुनने के लिए फोन ऑर्डर देने पर आपको कार्ड नंबर दोहराया जाता है। सभी क्रेडिट कार्ड प्राप्तकर्ता को वास्तव में एक यूआई की आवश्यकता होती है जो उन्हें चेक अंक योजना तक पहुंच प्रदान करती है जो सत्यापित करती है कि एक सीसी संख्या वैध है। उस एल्गोरिदम के अनुसार पहले 15 (या हालांकि कई) अंक अंतिम अंक की गणना करते हैं - और "मूर्ख" के लिए लगभग असंभव है। "पास" के लिए एक वसा उँगलियों के लिए 15 अंकों के बीच कम से कम दो पारस्परिक रूप से त्रुटियों को रद्द करने की आवश्यकता होती है। जब तक एल्गोरिदम आसन्न संख्याओं (एक सामान्य प्रविष्टि त्रुटि) को ट्रांसपोज़ करके असमान रूप से बेवकूफ होने के दोष से पीड़ित होता है, जिसे मैं संदेह करता हूं, सिवाय इसके कि यह किसी भी मानव डबल चेक से अधिक विश्वसनीय है।

2

स्ट्रिप ने इस शानदार जावास्क्रिप्ट कार्ड योजना पहचान के लिए लाइब्रेरी प्रदान की है। मुझे कुछ कोड स्निपेट जोड़ने दें और आपको इसका उपयोग कैसे करें।

सबसे पहले के रूप में

<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
संबंधित मुद्दे