it-swarm-tr.com

Sayıya göre kredi kartı türünü nasıl tespit ediyorsunuz?

Kredi kartı türünü yalnızca bu numaraya dayalı olarak nasıl tespit edeceğimi bulmaya çalışıyorum. Bunu bulmanın kesin, güvenilir bir yolunu bilen var mı?

481
Andrew Edvalson

Kredi/banka kartı numarasına _ _ _ veya Birincil Hesap Numarası denir. PAN öğesinin ilk altı basamağı, veren bankaya (IIN'lere ait olan _IN veya İhraççı Kimlik Numarasından alınmıştır. daha önce BIN - Banka Kimlik Numaraları - olarak adlandırılmıştı, bu yüzden bu terminolojiye referansları bazı belgelerde görebilirsiniz). Bu altı rakam uluslararası bir standarda tabidir, ISO/IEC 7812 ve numaradan gelen kart tipini belirlemek için kullanılabilir.

Ne yazık ki asıl ISO/IEC 7812 veri tabanı halka açık değildir, ancak Wikipedia'da dahil olmak üzere hem ticari hem de ücretsiz resmi olmayan listeler vardır.

Neyse, sayıyı türden saptamak için, aşağıdakiler gibi normal bir ifade kullanabilirsiniz: Orijinal ifadeler için kredi

Visa:^4[0-9]{6,}$ Visa kart numaraları 4 ile başlar.

MasterCard:^5[1-5][0-9]{5,}|222[1-9][0-9]{3,}|22[3-9][0-9]{4,}|2[3-6][0-9]{5,}|27[01][0-9]{4,}|2720[0-9]{3,}$ 2016'dan önce MasterCard numaraları 51 ile 55 arasındaki sayılarla başlar, ancak bu yalnızca MasterCard kredi kartlarını algılar; MasterCard sistemi kullanılarak verilen ve bu IIN aralığına girmeyen başka kartlar da var. 2016 yılında, aralığa numaralar ekleyecektir (222100-272099).

American Express:^3[47][0-9]{5,}$ American Express kart numaraları 34 veya 37 ile başlar.

Diners Club:^3(?:0[0-5]|[68][0-9])[0-9]{4,}$ Diners Club kart numaraları 300 ile 305, 36 veya 38 ile başlar. 5 ile başlayan ve 16 rakamlı Diners Club kartları vardır. Bunlar, Diners Club ve MasterCard arasındaki ortak girişimdir ve MasterCard gibi işlenmesi gerekir.

Discover:^6(?:011|5[0-9]{2})[0-9]{3,}$ Discover kart numaraları 6011 veya 65 ile başlar.

JCB:^(?:2131|1800|35[0-9]{3})[0-9]{3,}$ JCB kartları 2131, 1800 veya 35 ile başlar.

Ne yazık ki, MasterCard sistemiyle işlenmiş ve MasterCard’ın IIN aralığında bulunmayan çeşitli kart türleri vardır (sayılar 51 ... 55); Bunlardan en önemlisi, birçoğu diğer bankaların IIN menzillerinden çıkarılan Maestro kartlarının durumudur; Sonuç olarak, kabul ettiğiniz başka türde olmayan herhangi bir kartın MasterCard olması gerektiğini varsaymak en iyisi olabilir.

Önemli: kart numaralarının uzunluğu değişir; Örneğin, Visa geçmişte 13 haneli PAN'lere ve 16 haneli PAN'lara sahip kartlara sahipti. Visa’nın dokümantasyonu şu anda 12 ila 19 rakamlı sayıları yayınlayabileceğini veya yayınlayabileceğini gösterir. Bu nedenle, kart numarasının uzunluğunu, en az 7 haneye sahip olduğunu doğrulamak dışında kontrol etmemelisiniz (tam bir IIN artı bir kontrol basamağı için - tarafından öngörülen değerle eşleşmelidir - Luhn algoritması ).

Bir ipucu: bir kart sahibi PAN'i işlemeden önce, girişten herhangi bir boşluk ve noktalama işaretini sıyırın. Niye ya? Normalde, , gerçek bir kredi kartının önünde gösterilme şekline benzer şekilde, rakamlar halinde gruplara girmek daha kolaydır (===) çok daha kolaydır.

4444 4444 4444 4444

doğru girmek çok daha kolaydır

4444444444444444

Kullanıcının cezalandırılmasında hiçbir fayda yoktur, çünkü burada beklemeyeceğiniz karakterleri girmişlerdir.

Bu aynı zamanda giriş alanlarınızın en az 24 karakterden oluşan bir alana sahip olduğundan emin olmanızı gerektirir; aksi takdirde boşluk bırakan kullanıcılar odadan kalkar. alanın 32 karakter gösterecek kadar geniş olmasını ve 64 taneye kadar izin vermenizi sağlar; Bu genişleme için bol miktarda kafa boşluğu veriyor.

İşte size biraz daha fazla fikir veren bir resim:

GÜNCELLEME (2014): Sağlama toplamı yöntemi artık bir kartın orijinalliğini doğrulamak için geçerli bir yol gibi görünmüyor bu cevaptaki yorumlarda belirtildiği gibi.

GÜNCELLEME (2016): Mastercard yeni BIN aralıklarını başlatacak Ach Payment .

Credit Card Verification

730
senfo

Javascript'te:

function detectCardType(number) {
    var re = {
        electron: /^(4026|417500|4405|4508|4844|4913|4917)\d+$/,
        maestro: /^(5018|5020|5038|5612|5893|6304|6759|6761|6762|6763|0604|6390)\d+$/,
        dankort: /^(5019)\d+$/,
        interpayment: /^(636)\d+$/,
        unionpay: /^(62|88)\d+$/,
        visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
        mastercard: /^5[1-5][0-9]{14}$/,
        amex: /^3[47][0-9]{13}$/,
        diners: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,
        discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/,
        jcb: /^(?:2131|1800|35\d{3})\d{11}$/
    }

    for(var key in re) {
        if(re[key].test(number)) {
            return key
        }
    }
}

Ünite testi:

describe('CreditCard', function() {
    describe('#detectCardType', function() {

        var cards = {
            '8800000000000000': 'UNIONPAY',

            '4026000000000000': 'ELECTRON',
            '4175000000000000': 'ELECTRON',
            '4405000000000000': 'ELECTRON',
            '4508000000000000': 'ELECTRON',
            '4844000000000000': 'ELECTRON',
            '4913000000000000': 'ELECTRON',
            '4917000000000000': 'ELECTRON',

            '5019000000000000': 'DANKORT',

            '5018000000000000': 'MAESTRO',
            '5020000000000000': 'MAESTRO',
            '5038000000000000': 'MAESTRO',
            '5612000000000000': 'MAESTRO',
            '5893000000000000': 'MAESTRO',
            '6304000000000000': 'MAESTRO',
            '6759000000000000': 'MAESTRO',
            '6761000000000000': 'MAESTRO',
            '6762000000000000': 'MAESTRO',
            '6763000000000000': 'MAESTRO',
            '0604000000000000': 'MAESTRO',
            '6390000000000000': 'MAESTRO',

            '3528000000000000': 'JCB',
            '3589000000000000': 'JCB',
            '3529000000000000': 'JCB',

            '6360000000000000': 'INTERPAYMENT',

            '4916338506082832': 'VISA',
            '4556015886206505': 'VISA',
            '4539048040151731': 'VISA',
            '4024007198964305': 'VISA',
            '4716175187624512': 'VISA',

            '5280934283171080': 'MASTERCARD',
            '5456060454627409': 'MASTERCARD',
            '5331113404316994': 'MASTERCARD',
            '5259474113320034': 'MASTERCARD',
            '5442179619690834': 'MASTERCARD',

            '6011894492395579': 'DISCOVER',
            '6011388644154687': 'DISCOVER',
            '6011880085013612': 'DISCOVER',
            '6011652795433988': 'DISCOVER',
            '6011375973328347': 'DISCOVER',

            '345936346788903': 'AMEX',
            '377669501013152': 'AMEX',
            '373083634595479': 'AMEX',
            '370710819865268': 'AMEX',
            '371095063560404': 'AMEX'
        };

        Object.keys(cards).forEach(function(number) {
            it('should detect card ' + number + ' as ' + cards[number], function() {
                Basket.detectCardType(number).should.equal(cards[number]);
            });
        });
    });
});
68
Anatoliy

Güncelleme: 15 Haziran 2016 (şu anda nihai bir çözüm olarak)

Lütfen en çok oy alan oy için bile pes ettiğimi, ancak bunları açıkça belirtmek için regexps aslında binlerce gerçek BIN kodu ile test ettiğimden eminim. En önemlisi start dizelerini (^) kullanmaktır, aksi takdirde gerçek dünyada yanlış sonuçlar verecektir!

JCB^(?:2131|1800|35)[0-9]{0,}$ Başla: 2131, 1800, 35 (3528-3589)

American Express^3[47][0-9]{0,}$ Başla: 34, 37

Diners Club^3(?:0[0-59]{1}|[689])[0-9]{0,}$ Başla: 300-305, 309, 36, 38-39

Visa^4[0-9]{0,}$ Başla: 4

MasterCard^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$ Başla: 2221-2720, 51-55

Maestro^(5[06789]|6)[0-9]{0,}$ Maestro her zaman şu aralıkta büyür: 60-69, başka bir şeyle başlar/başlamaz, ancak 5'ten başlayarak, yine de ana kart olarak kodlanmalıdır. Maestro kartları kodun sonunda bulunmalıdır, çünkü bazıları 60-69 arasındadır. Lütfen koda bakınız.

Discover^(6011|65|64[4-9]|62212[6-9]|6221[3-9]|622[2-8]|6229[01]|62292[0-5])[0-9]{0,}$ Kodlaması oldukça zor olanları keşfedin, ile başlayın: 6011, 622126-622925, 644-649, 65

Javascript 'de bu işlevi kullanıyorum. Bir onkeyup olayına atadığınızda bu en iyisidir ve en kısa sürede sonuç verir.

function cc_brand_id(cur_val) {
  // the regular expressions check for possible matches as you type, hence the OR operators based on the number of chars
  // regexp string length {0} provided for soonest detection of beginning of the card numbers this way it could be used for BIN CODE detection also

  //JCB
  jcb_regex = new RegExp('^(?:2131|1800|35)[0-9]{0,}$'); //2131, 1800, 35 (3528-3589)
  // American Express
  amex_regex = new RegExp('^3[47][0-9]{0,}$'); //34, 37
  // Diners Club
  diners_regex = new RegExp('^3(?:0[0-59]{1}|[689])[0-9]{0,}$'); //300-305, 309, 36, 38-39
  // Visa
  visa_regex = new RegExp('^4[0-9]{0,}$'); //4
  // MasterCard
  mastercard_regex = new RegExp('^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$'); //2221-2720, 51-55
  maestro_regex = new RegExp('^(5[06789]|6)[0-9]{0,}$'); //always growing in the range: 60-69, started with / not something else, but starting 5 must be encoded as mastercard anyway
  //Discover
  discover_regex = new RegExp('^(6011|65|64[4-9]|62212[6-9]|6221[3-9]|622[2-8]|6229[01]|62292[0-5])[0-9]{0,}$');
  ////6011, 622126-622925, 644-649, 65


  // get rid of anything but numbers
  cur_val = cur_val.replace(/\D/g, '');

  // checks per each, as their could be multiple hits
  //fix: ordering matter in detection, otherwise can give false results in rare cases
  var sel_brand = "unknown";
  if (cur_val.match(jcb_regex)) {
    sel_brand = "jcb";
  } else if (cur_val.match(amex_regex)) {
    sel_brand = "amex";
  } else if (cur_val.match(diners_regex)) {
    sel_brand = "diners_club";
  } else if (cur_val.match(visa_regex)) {
    sel_brand = "visa";
  } else if (cur_val.match(mastercard_regex)) {
    sel_brand = "mastercard";
  } else if (cur_val.match(discover_regex)) {
    sel_brand = "discover";
  } else if (cur_val.match(maestro_regex)) {
    if (cur_val[0] == '5') { //started 5 must be mastercard
      sel_brand = "mastercard";
    } else {
      sel_brand = "maestro"; //maestro is all 60-69 which is not something else, thats why this condition in the end
    }
  }

  return sel_brand;
}

Burada onunla oynayabilirsiniz:

http://jsfiddle.net/upN3L/69/

PHP için bu işlevi kullanın, bu da bazı VISA/MC kartlarını da algılar:

    /**
 * Obtain a brand constant from a PAN 
 *
 * @param type $pan               Credit card number
 * @param type $include_sub_types Include detection of sub visa brands
 * @return string
 */
public static function getCardBrand($pan, $include_sub_types = false)
{
    //maximum length is not fixed now, there are growing number of CCs has more numbers in length, limiting can give false negatives atm

    //these regexps accept not whole cc numbers too
    //visa        
    $visa_regex = "/^4[0-9]{0,}$/";
    $vpreca_regex = "/^428485[0-9]{0,}$/";
    $postepay_regex = "/^(402360|402361|403035|417631|529948){0,}$/";
    $cartasi_regex = "/^(432917|432930|453998)[0-9]{0,}$/";
    $entropay_regex = "/^(406742|410162|431380|459061|533844|522093)[0-9]{0,}$/";
    $o2money_regex = "/^(422793|475743)[0-9]{0,}$/";

    // MasterCard
    $mastercard_regex = "/^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$/";
    $maestro_regex = "/^(5[06789]|6)[0-9]{0,}$/"; 
    $kukuruza_regex = "/^525477[0-9]{0,}$/";
    $yunacard_regex = "/^541275[0-9]{0,}$/";

    // American Express
    $amex_regex = "/^3[47][0-9]{0,}$/";

    // Diners Club
    $diners_regex = "/^3(?:0[0-59]{1}|[689])[0-9]{0,}$/";

    //Discover
    $discover_regex = "/^(6011|65|64[4-9]|62212[6-9]|6221[3-9]|622[2-8]|6229[01]|62292[0-5])[0-9]{0,}$/";

    //JCB
    $jcb_regex = "/^(?:2131|1800|35)[0-9]{0,}$/";

    //ordering matter in detection, otherwise can give false results in rare cases
    if (preg_match($jcb_regex, $pan)) {
        return "jcb";
    }

    if (preg_match($amex_regex, $pan)) {
        return "amex";
    }

    if (preg_match($diners_regex, $pan)) {
        return "diners_club";
    }

    //sub visa/mastercard cards
    if ($include_sub_types) {
        if (preg_match($vpreca_regex, $pan)) {
            return "v-preca";
        }
        if (preg_match($postepay_regex, $pan)) {
            return "postepay";
        }
        if (preg_match($cartasi_regex, $pan)) {
            return "cartasi";
        }
        if (preg_match($entropay_regex, $pan)) {
            return "entropay";
        }
        if (preg_match($o2money_regex, $pan)) {
            return "o2money";
        }
        if (preg_match($kukuruza_regex, $pan)) {
            return "kukuruza";
        }
        if (preg_match($yunacard_regex, $pan)) {
            return "yunacard";
        }
    }

    if (preg_match($visa_regex, $pan)) {
        return "visa";
    }

    if (preg_match($mastercard_regex, $pan)) {
        return "mastercard";
    }

    if (preg_match($discover_regex, $pan)) {
        return "discover";
    }

    if (preg_match($maestro_regex, $pan)) {
        if ($pan[0] == '5') {//started 5 must be mastercard
            return "mastercard";
        }
            return "maestro"; //maestro is all 60-69 which is not something else, thats why this condition in the end

    }

    return "unknown"; //unknown for this system
}
28
Janos Szabo
  public string GetCreditCardType(string CreditCardNumber)
    {
        Regex regVisa = new Regex("^4[0-9]{12}(?:[0-9]{3})?$");
        Regex regMaster = new Regex("^5[1-5][0-9]{14}$");
        Regex regExpress = new Regex("^3[47][0-9]{13}$");
        Regex regDiners = new Regex("^3(?:0[0-5]|[68][0-9])[0-9]{11}$");
        Regex regDiscover = new Regex("^6(?:011|5[0-9]{2})[0-9]{12}$");
        Regex regJCB= new Regex("^(?:2131|1800|35\\d{3})\\d{11}$");


        if(regVisa.IsMatch(CreditCardNumber))
            return "VISA";
       else if (regMaster.IsMatch(CreditCardNumber))
            return "MASTER";
      else  if (regExpress.IsMatch(CreditCardNumber))
            return "AEXPRESS";
       else if (regDiners.IsMatch(CreditCardNumber))
            return "DINERS";
       else if (regDiscover.IsMatch(CreditCardNumber))
            return "DISCOVERS";
       else   if (regJCB.IsMatch(CreditCardNumber))
            return "JCB";
       else
        return "invalid";
    }

İşte Regex, c # kullanarak Kredi kartı türünü kontrol etme işlevi

19
Usman Younas

Şuna bir bak:

http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CC70060A01B

function isValidCreditCard(type, ccnum) {
/* Visa: length 16, prefix 4, dashes optional.
Mastercard: length 16, prefix 51-55, dashes optional.
Discover: length 16, prefix 6011, dashes optional.
American Express: length 15, prefix 34 or 37.
Diners: length 14, prefix 30, 36, or 38. */

  var re = new Regex({ "visa": "/^4\d{3}-?\d{4}-?\d{4}-?\d",
                       "mc": "/^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/",
                       "disc": "/^6011-?\d{4}-?\d{4}-?\d{4}$/",
                       "amex": "/^3[47]\d{13}$/",
                       "diners": "/^3[068]\d{12}$/"}[type.toLowerCase()])

   if (!re.test(ccnum)) return false;
   // Remove all dashes for the checksum checks to eliminate negative numbers
   ccnum = ccnum.split("-").join("");
   // Checksum ("Mod 10")
   // Add even digits in even length strings or odd digits in odd length strings.
   var checksum = 0;
   for (var i=(2-(ccnum.length % 2)); i<=ccnum.length; i+=2) {
      checksum += parseInt(ccnum.charAt(i-1));
   }
   // Analyze odd digits in even length strings or even digits in odd length strings.
   for (var i=(ccnum.length % 2) + 1; i<ccnum.length; i+=2) {
      var digit = parseInt(ccnum.charAt(i-1)) * 2;
      if (digit < 10) { checksum += digit; } else { checksum += (digit-9); }
   }
   if ((checksum % 10) == 0) return true; else return false;
}
18
Rashy

son zamanlarda böyle bir işlevselliğe ihtiyacım vardı, Zend Framework Kredi Kartı Validator'u Ruby'ye taşıyordum. Ruby gem: https://github.com/Fivell/credit_card_validations zend çerçevesi: https://github.com/zendframework/zf2/blob/master/ kütüphane/Zend/Doğrulayıcı/CreditCard.php

Her ikisi de türü tespit etmek için INN aralıkları kullanır. Burada okuyabilirsiniz INN hakkında

Buna göre kredi kartını alternatif olarak tespit edebilirsiniz (regexps olmadan, fakat önekler ve olası uzunluklarla ilgili bazı kurallar koymuş olabilirsiniz)

Bu yüzden en çok kullanılan kartlar için bir sonraki kurallarımız var

########  most used brands #########

    visa: [
        {length: [13, 16], prefixes: ['4']}
    ],
    mastercard: [
        {length: [16], prefixes: ['51', '52', '53', '54', '55']}
    ],

    amex: [
        {length: [15], prefixes: ['34', '37']}
    ],
    ######## other brands ########
    diners: [
        {length: [14], prefixes: ['300', '301', '302', '303', '304', '305', '36', '38']},
    ],

    #There are Diners Club (North America) cards that begin with 5. These are a joint venture between Diners Club and MasterCard, and are processed like a MasterCard
    # will be removed in next major version

    diners_us: [
        {length: [16], prefixes: ['54', '55']}
    ],

    discover: [
        {length: [16], prefixes: ['6011', '644', '645', '646', '647', '648',
                                  '649', '65']}
    ],

    jcb: [
        {length: [16], prefixes: ['3528', '3529', '353', '354', '355', '356', '357', '358', '1800', '2131']}
    ],


    laser: [
        {length: [16, 17, 18, 19], prefixes: ['6304', '6706', '6771']}
    ],

    solo: [
        {length: [16, 18, 19], prefixes: ['6334', '6767']}
    ],

    switch: [
        {length: [16, 18, 19], prefixes: ['633110', '633312', '633304', '633303', '633301', '633300']}

    ],

    maestro: [
        {length: [12, 13, 14, 15, 16, 17, 18, 19], prefixes: ['5010', '5011', '5012', '5013', '5014', '5015', '5016', '5017', '5018',
                                                              '502', '503', '504', '505', '506', '507', '508',
                                                              '6012', '6013', '6014', '6015', '6016', '6017', '6018', '6019',
                                                              '602', '603', '604', '605', '6060',
                                                              '677', '675', '674', '673', '672', '671', '670',
                                                              '6760', '6761', '6762', '6763', '6764', '6765', '6766', '6768', '6769']}
    ],

    # Luhn validation are skipped for union pay cards because they have unknown generation algoritm
    unionpay: [
        {length: [16, 17, 18, 19], prefixes: ['622', '624', '625', '626', '628'], skip_luhn: true}
    ],

    dankrot: [
        {length: [16], prefixes: ['5019']}
    ],

    rupay: [
        {length: [16], prefixes: ['6061', '6062', '6063', '6064', '6065', '6066', '6067', '6068', '6069', '607', '608'], skip_luhn: true}
    ]

}

Sonra önek arayarak ve uzunluğu karşılaştırarak kredi kartı markasını tespit edebilirsiniz. Ayrıca luhn algoritmasını da unutma (burada açıklanmıştır http://en.wikipedia.org/wiki/Luhn ).

GÜNCELLEŞTİRME

güncellenmiş kuralların listesini burada bulabilirsiniz https://raw.githubusercontent.com/Fivell/credit_card_validations/master/lib/data/brands.yaml

14
Fivell

İşte CC ile ilgili her türlü şey için C # veya VB kodunu tamamla üzerinde codeproject.

  • IsValidNumber
  • GetCardTypeFromNumber
  • GetCardTestNumber
  • PassesLuhnTest

Bu makale, olumsuz yorumlar olmadan birkaç yıldır yayınlanmıştır.

12
Simon_Weaver

Anatoliy'nin PHP'deki cevabı:

 public static function detectCardType($num)
 {
    $re = array(
        "visa"       => "/^4[0-9]{12}(?:[0-9]{3})?$/",
        "mastercard" => "/^5[1-5][0-9]{14}$/",
        "amex"       => "/^3[47][0-9]{13}$/",
        "discover"   => "/^6(?:011|5[0-9]{2})[0-9]{12}$/",
    );

    if (preg_match($re['visa'],$num))
    {
        return 'visa';
    }
    else if (preg_match($re['mastercard'],$num))
    {
        return 'mastercard';
    }
    else if (preg_match($re['amex'],$num))
    {
        return 'amex';
    }
    else if (preg_match($re['discover'],$num))
    {
        return 'discover';
    }
    else
    {
        return false;
    }
 }
7
angelcool.net

Kompakt javascript sürümü

    var getCardType = function (number) {
        var cards = {
            visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
            mastercard: /^5[1-5][0-9]{14}$/,
            amex: /^3[47][0-9]{13}$/,
            diners: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,
            discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/,
            jcb: /^(?:2131|1800|35\d{3})\d{11}$/
        };
        for (var card in cards) {
            if (cards[card].test(number)) {
                return card;
            }
        }
    };
7
Nick

İşte bir php sınıfı işlevi CCnumber tarafından CCtype döndürür.
Bu kod kartı doğrulamaz veya çalışmaz. Luhn algoritması yalnızca bu sayfa tablosundaki tabloya göre kredi kartı bulmaya çalışır. CCcard tipini belirlemek için temel olarak CCnumber uzunluğu ve CCcard ön ekini kullanır.

    <?php class CreditcardType
    {
   public static $creditcardTypes = array(
            array('Name'=>'American Express','cardLength'=>array(15),'cardPrefix'=>array('34', '37'))
            ,array('Name'=>'Maestro','cardLength'=>array(12, 13, 14, 15, 16, 17, 18, 19),'cardPrefix'=>array('5018', '5020', '5038', '6304', '6759', '6761', '6763'))
            ,array('Name'=>'Mastercard','cardLength'=>array(16),'cardPrefix'=>array('51', '52', '53', '54', '55'))
            ,array('Name'=>'Visa','cardLength'=>array(13,16),'cardPrefix'=>array('4'))
            ,array('Name'=>'JCB','cardLength'=>array(16),'cardPrefix'=>array('3528', '3529', '353', '354', '355', '356', '357', '358'))
            ,array('Name'=>'Discover','cardLength'=>array(16),'cardPrefix'=>array('6011', '622126', '622127', '622128', '622129', '62213',
                                        '62214', '62215', '62216', '62217', '62218', '62219',
                                        '6222', '6223', '6224', '6225', '6226', '6227', '6228',
                                        '62290', '62291', '622920', '622921', '622922', '622923',
                                        '622924', '622925', '644', '645', '646', '647', '648',
                                        '649', '65'))
            ,array('Name'=>'Solo','cardLength'=>array(16, 18, 19),'cardPrefix'=>array('6334', '6767'))
            ,array('Name'=>'Unionpay','cardLength'=>array(16, 17, 18, 19),'cardPrefix'=>array('622126', '622127', '622128', '622129', '62213', '62214',
                                        '62215', '62216', '62217', '62218', '62219', '6222', '6223',
                                        '6224', '6225', '6226', '6227', '6228', '62290', '62291',
                                        '622920', '622921', '622922', '622923', '622924', '622925'))
            ,array('Name'=>'Diners Club','cardLength'=>array(14),'cardPrefix'=>array('300', '301', '302', '303', '304', '305', '36'))
            ,array('Name'=>'Diners Club US','cardLength'=>array(16),'cardPrefix'=>array('54', '55'))
            ,array('Name'=>'Diners Club Carte Blanche','cardLength'=>array(14),'cardPrefix'=>array('300','305'))
            ,array('Name'=>'Laser','cardLength'=>array(16, 17, 18, 19),'cardPrefix'=>array('6304', '6706', '6771', '6709'))
    );     
        private function __construct() {}    
        public static function getType($CCNumber)
        {
            $CCNumber= trim($CCNumber);
            $type='Unknown';
            foreach (CreditcardType::$creditcardTypes as $card){
                if (! in_array(strlen($CCNumber),$card['cardLength'])) {
                    continue;
                }
                $prefixes = '/^('.implode('|',$card['cardPrefix']).')/';            
                if(preg_match($prefixes,$CCNumber) == 1 ){
                    $type= $card['Name'];
                    break;
                }
            }
            return $type;
        }
    } ?>
6
ismail

Kredi kartının ilk sayıları satıcıya yaklaştığında kullanılabilir:

  • Vize: 49,44 veya 47
  • Vize elektronu: 42, 45, 48, 49
  • MasterCard: 51
  • Amex: 34
  • Lokantalar: 30, 36, 38
  • JCB: 35
5
Shoban

Kart Aralığı Tanıma'da (CRR), bir dizi regex veya başka bir kodlanmış aralık kullanan algoritmaların bir dezavantajı, BIN'lerin/IIN'lerin zaman içerisinde deneyimimde değişmesidir. Kartların ortak markalaması devam eden bir komplikasyondur. Farklı Kart Alıcıları/satıcıları, aynı kartı, örneğin; coğrafi konum. 

Ek olarak, son birkaç yılda örneğin Daha geniş tirajlı UnionPay kartları, mevcut modeller, bazen daha üst sıralarda yer alan daha geniş aralıklarla harmanlayan yeni serilerle baş edemiyor.
Sisteminizin kapsaması gereken coğrafyayı bilmek, bazı ülkelerde belirli ülkelerde kullanımı sınırlı olduğu için yardımcı olabilir. Örneğin, aralıklar 62, ABD’de bazı AAA alt aralıkları içerir, ancak ticari tabanınız ABD’nin dışındaysa, 62’nin tamamını UnionPay olarak kabul edebilirsiniz.
.__ Ayrıca, satıcıya bağlı olarak bir karta farklı davranmanız da istenebilir. Örneğin. Bazı İngiltere kartlarına iç borç olarak, fakat uluslararası kredi olarak davranmak. 

Belli bir Acquiring Bankasının sağladığı çok faydalı kurallar vardır. Örneğin. https://www.barclaycard.co.uk/business/files/BIN-Rules-EIRE.pdf ve https://www.barclaycard.co.uk/business/files/BIN-Rules- UK.pdf . (Haziran 2017 itibariyle geçerli bağlantılar, güncellenmiş referansın bağlantısını sağlayan kullanıcı sayesinde.) Ancak, bu CRR kurallarının bu kuruluş tarafından edinilen tüccarlar için geçerli olan Kart Verme evrenini temsil edebileceğini unutmayın. örneğin içermez CUP/UPI olarak tanımlanan aralıklar.

Bu yorumlar manyetik şerit (MagStripe) veya PKE (Pan Key Giriş) senaryoları için geçerlidir. ICC/EMV dünyasında durum yine farklı.

Güncelleme: Bu sayfadaki (ve ayrıca bağlantılı WikiPedia sayfasındaki) diğer yanıtlar, her zaman 16 uzunluğunda JCB'ye sahiptir. Bununla birlikte, şirketimde POS cihazlarımızı ve yazılımlarımızı birden fazla satın alma bankası ve coğrafyasında sertifikalandıran özel bir mühendis ekibimiz var. JCB'den gelen bu ekibin en yeni Sertifika Kart Paketi, 19 uzun PAN için bir geçiş davası aldı.

5
MikeRoger

Ödeme işleminin bir parçası olarak kredi kartı türünü algılamaya çalışmayın. Geçerli işlemleri reddetme riski var.

Ödeme işlemcinize bilgi sağlamanız gerekiyorsa (örneğin, Paypal kredi kartı nesnesi, kart türünü isimlendirmeyi gerektiriyorsa), mevcut en az bilgiden, örneğin.

$credit_card['pan'] = preg_replace('/[^0-9]/', '', $credit_card['pan']);
$inn = (int) mb_substr($credit_card['pan'], 0, 2);

// @see http://en.wikipedia.org/wiki/List_of_Bank_Identification_Numbers#Overview
if ($inn >= 40 && $inn <= 49) {
    $type = 'visa';
} else if ($inn >= 51 && $inn <= 55) {
    $type = 'mastercard';
} else if ($inn >= 60 && $inn <= 65) {
    $type = 'discover';
} else if ($inn >= 34 && $inn <= 37) {
    $type = 'amex';
} else {
    throw new \UnexpectedValueException('Unsupported card type.');
}

Bu uygulama (yalnızca ilk iki haneyi kullanarak) tüm ana (ve Paypal'ın durumunda tüm desteklenen) kart şemalarını tanımlamak için yeterlidir. Aslında, istisnayı tamamen ve varsayılanı en popüler kart türüne atlamak isteyebilirsiniz. İsteğinize yanıt olarak bir doğrulama hatası olup olmadığını ödeme ağ geçidi/işlemci size bildirir.

Gerçek şu ki, ödeme ağ geçidinizin sağladığınız değeri umursamadığı .

5
Gajus

Swift 2.1 Usman Y'nin cevabının sürümü .. Bir dizgenin değerine göre çağrı yapıldığını doğrulamak için bir print cümlesi kullanın.

print(self.validateCardType(self.creditCardField.text!))

func validateCardType(testCard: String) -> String {

    let regVisa = "^4[0-9]{12}(?:[0-9]{3})?$"
    let regMaster = "^5[1-5][0-9]{14}$"
    let regExpress = "^3[47][0-9]{13}$"
    let regDiners = "^3(?:0[0-5]|[68][0-9])[0-9]{11}$"
    let regDiscover = "^6(?:011|5[0-9]{2})[0-9]{12}$"
    let regJCB = "^(?:2131|1800|35\\d{3})\\d{11}$"


    let regVisaTest = NSPredicate(format: "SELF MATCHES %@", regVisa)
    let regMasterTest = NSPredicate(format: "SELF MATCHES %@", regMaster)
    let regExpressTest = NSPredicate(format: "SELF MATCHES %@", regExpress)
    let regDinersTest = NSPredicate(format: "SELF MATCHES %@", regDiners)
    let regDiscoverTest = NSPredicate(format: "SELF MATCHES %@", regDiscover)
    let regJCBTest = NSPredicate(format: "SELF MATCHES %@", regJCB)


    if regVisaTest.evaluateWithObject(testCard){
        return "Visa"
    }
    else if regMasterTest.evaluateWithObject(testCard){
        return "MasterCard"
    }

    else if regExpressTest.evaluateWithObject(testCard){
        return "American Express"
    }

    else if regDinersTest.evaluateWithObject(testCard){
        return "Diners Club"
    }

    else if regDiscoverTest.evaluateWithObject(testCard){
        return "Discover"
    }

    else if regJCBTest.evaluateWithObject(testCard){
        return "JCB"
    }

    return ""

}
3
Daisy R.

JQuery ile benim çözüm:

function detectCreditCardType() {
    var type = new Array;
    type[1] = '^4[0-9]{12}(?:[0-9]{3})?$';      // visa
    type[2] = '^5[1-5][0-9]{14}$';              // mastercard
    type[3] = '^6(?:011|5[0-9]{2})[0-9]{12}$';  // discover
    type[4] = '^3[47][0-9]{13}$';               // amex

    var ccnum = $('.creditcard').val().replace(/[^\d.]/g, '');
    var returntype = 0;

    $.each(type, function(idx, re) {
        var regex = new RegExp(re);
        if(regex.test(ccnum) && idx>0) {
            returntype = idx;
        }
    });

    return returntype;
}

0 durumunda, kredi kartı türü tespit edilemez.

Kredi kartı giriş alanına "creditcard" sınıfı eklenmelidir.

3
ZurabWeb

Çizgili kart şeması tespiti için bu fantastik javascript kütüphanesini sağlamıştır. Birkaç kod parçacığını ekleyeyim ve nasıl kullanılacağını göstereyim. 

Öncelikle bunu web sayfanıza ekleyin

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

İkinci olarak, kart şemasını tespit etmek için cardType işlevini kullanın.

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

İşte daha fazla örnek ve demo için referans linkleri.

  1. jquery.payment.js için şerit blog
  2. Github deposu
2
Naina

Swift'de, kredi kartı türünü tespit etmek için bir numara oluşturabilirsiniz.

enum CreditCardType: Int { // Enum which encapsulates different card types and method to find the type of card.

case Visa
case Master
case Amex
case Discover

func validationRegex() -> String {
    var regex = ""
    switch self {
    case .Visa:
        regex = "^4[0-9]{6,}$"

    case .Master:
        regex = "^5[1-5][0-9]{5,}$"

    case .Amex:
        regex = "^3[47][0-9]{13}$"

    case .Discover:
        regex = "^6(?:011|5[0-9]{2})[0-9]{12}$"
    }

    return regex
}

func validate(cardNumber: String) -> Bool {
    let predicate = NSPredicate(format: "SELF MATCHES %@", validationRegex())
    return predicate.evaluateWithObject(cardNumber)
}

// Method returns the credit card type for given card number
static func cardTypeForCreditCardNumber(cardNumber: String) -> CreditCardType?  {
    var creditCardType: CreditCardType?

    var index = 0
    while let cardType = CreditCardType(rawValue: index) {
        if cardType.validate(cardNumber) {
            creditCardType = cardType
            break
        } else {
            index++
        }
    }
    return creditCardType
  }
}

CreditCardType enum değerini döndüren CreditCardType.cardTypeForCreditCardNumber yöntemini ("# card number") çağırın.

2
Vidyalaxmi

Kredi kartı biçimlendirme ve telefon numarası biçimlendirme için epeyce aradım. Pek çok iyi ipucu buldum, ancak hiçbir şey kesin arzularıma uygun değildi, bu yüzden bu kod 'u yarattım. Bunu böyle kullanıyorsun:

var sf = smartForm.formatCC(myInputString);
var cardType = sf.cardType;
2

Sadece küçük bir kaşık besleme:

$("#CreditCardNumber").focusout(function () {


        var regVisa = /^4[0-9]{12}(?:[0-9]{3})?$/;
        var regMasterCard = /^5[1-5][0-9]{14}$/;
        var regAmex = /^3[47][0-9]{13}$/;
        var regDiscover = /^6(?:011|5[0-9]{2})[0-9]{12}$/;

        if (regVisa.test($(this).val())) {
            $("#CCImage").html("<img height='40px' src='@Url.Content("~/images/visa.png")'>");          

        }

        else if (regMasterCard.test($(this).val())) {
        $("#CCImage").html("<img height='40px' src='@Url.Content("~/images/mastercard.png")'>");

        }

        else if (regAmex.test($(this).val())) {

           $("#CCImage").html("<img height='40px' src='@Url.Content("~/images/amex.png")'>");

        }
         else if (regDiscover.test($(this).val())) {

           $("#CCImage").html("<img height='40px' src='@Url.Content("~/images/discover.png")'>");

        }
        else {
        $("#CCImage").html("NA");

        }

    });
1
Pinch

Python'da yazılmış, boolean işlevlerinin bir örneği, eğer kart işlev adına göre algılanırsa, True değerini döndürür. 

def is_american_express(cc_number):
    """Checks if the card is an american express. If us billing address country code, & is_amex, use vpos
    https://en.wikipedia.org/wiki/Bank_card_number#cite_note-GenCardFeatures-3
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^3[47][0-9]{13}$', cc_number))


def is_visa(cc_number):
    """Checks if the card is a visa, begins with 4 and 12 or 15 additional digits.
    :param cc_number: unicode card number
    """

    # Standard Visa is 13 or 16, debit can be 19
    if bool(re.match(r'^4', cc_number)) and len(cc_number) in [13, 16, 19]:
        return True

    return False


def is_mastercard(cc_number):
    """Checks if the card is a mastercard. Begins with 51-55 or 2221-2720 and 16 in length.
    :param cc_number: unicode card number
    """
    if len(cc_number) == 16 and cc_number.isdigit():  # Check digit, before cast to int
        return bool(re.match(r'^5[1-5]', cc_number)) or int(cc_number[:4]) in range(2221, 2721)
    return False


def is_discover(cc_number):
    """Checks if the card is discover, re would be too hard to maintain. Not a supported card.
    :param cc_number: unicode card number
    """
    if len(cc_number) == 16:
        try:
            # return bool(cc_number[:4] == '6011' or cc_number[:2] == '65' or cc_number[:6] in range(622126, 622926))
            return bool(cc_number[:4] == '6011' or cc_number[:2] == '65' or 622126 <= int(cc_number[:6]) <= 622925)
        except ValueError:
            return False
    return False


def is_jcb(cc_number):
    """Checks if the card is a jcb. Not a supported card.
    :param cc_number: unicode card number
    """
    # return bool(re.match(r'^(?:2131|1800|35\d{3})\d{11}$', cc_number))  # wikipedia
    return bool(re.match(r'^35(2[89]|[3-8][0-9])[0-9]{12}$', cc_number))  # PawelDecowski


def is_diners_club(cc_number):
    """Checks if the card is a diners club. Not a supported card.
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^3(?:0[0-6]|[68][0-9])[0-9]{11}$', cc_number))  # 0-5 = carte blance, 6 = international


def is_laser(cc_number):
    """Checks if the card is laser. Not a supported card.
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^(6304|670[69]|6771)', cc_number))


def is_maestro(cc_number):
    """Checks if the card is maestro. Not a supported card.
    :param cc_number: unicode card number
    """
    possible_lengths = [12, 13, 14, 15, 16, 17, 18, 19]
    return bool(re.match(r'^(50|5[6-9]|6[0-9])', cc_number)) and len(cc_number) in possible_lengths


# Child cards

def is_visa_electron(cc_number):
    """Child of visa. Checks if the card is a visa electron. Not a supported card.
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^(4026|417500|4508|4844|491(3|7))', cc_number)) and len(cc_number) == 16


def is_total_rewards_visa(cc_number):
    """Child of visa. Checks if the card is a Total Rewards Visa. Not a supported card.
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^41277777[0-9]{8}$', cc_number))


def is_diners_club_carte_blanche(cc_number):
    """Child card of diners. Checks if the card is a diners club carte blance. Not a supported card.
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^30[0-5][0-9]{11}$', cc_number))  # github PawelDecowski, jquery-creditcardvalidator


def is_diners_club_carte_international(cc_number):
    """Child card of diners. Checks if the card is a diners club international. Not a supported card.
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^36[0-9]{12}$', cc_number))  # jquery-creditcardvalidator
1
radtek
// abobjects.com, parvez ahmad ab bulk mailer
use below script

function isValidCreditCard2(type, ccnum) {
       if (type == "Visa") {
          // Visa: length 16, prefix 4, dashes optional.
          var re = /^4\d{3}?\d{4}?\d{4}?\d{4}$/;
       } else if (type == "MasterCard") {
          // Mastercard: length 16, prefix 51-55, dashes optional.
          var re = /^5[1-5]\d{2}?\d{4}?\d{4}?\d{4}$/;
       } else if (type == "Discover") {
          // Discover: length 16, prefix 6011, dashes optional.
          var re = /^6011?\d{4}?\d{4}?\d{4}$/;
       } else if (type == "AmEx") {
          // American Express: length 15, prefix 34 or 37.
          var re = /^3[4,7]\d{13}$/;
       } else if (type == "Diners") {
          // Diners: length 14, prefix 30, 36, or 38.
          var re = /^3[0,6,8]\d{12}$/;
       }
       if (!re.test(ccnum)) return false;
       return true;
       /*
       // Remove all dashes for the checksum checks to eliminate negative numbers
       ccnum = ccnum.split("-").join("");
       // Checksum ("Mod 10")
       // Add even digits in even length strings or odd digits in odd length strings.
       var checksum = 0;
       for (var i=(2-(ccnum.length % 2)); i<=ccnum.length; i+=2) {
          checksum += parseInt(ccnum.charAt(i-1));
       }
       // Analyze odd digits in even length strings or even digits in odd length strings.
       for (var i=(ccnum.length % 2) + 1; i<ccnum.length; i+=2) {
          var digit = parseInt(ccnum.charAt(i-1)) * 2;
          if (digit < 10) { checksum += digit; } else { checksum += (digit-9); }
       }
       if ((checksum % 10) == 0) return true; else return false;
       */

    }
jQuery.validator.addMethod("isValidCreditCard", function(postalcode, element) { 
    return isValidCreditCard2($("#cardType").val(), $("#cardNum").val()); 

}, "<br>credit card is invalid");


     Type</td>
                                          <td class="text">&nbsp; <form:select path="cardType" cssclass="fields" style="border: 1px solid #D5D5D5;padding: 0px 0px 0px 0px;width: 130px;height: 22px;">
                                              <option value="SELECT">SELECT</option>
                                              <option value="MasterCard">Mastercard</option>
                                              <option value="Visa">Visa</option>
                                               <option value="AmEx">American Express</option>
                                              <option value="Discover">Discover</option>
                                            </form:select> <font color="#FF0000">*</font> 

$("#signupForm").validate({

    rules:{
       companyName:{required: true},
       address1:{required: true},
       city:{required: true},
       state:{required: true},
       Zip:{required: true},
       country:{required: true},
       chkAgree:{required: true},
       confPassword:{required: true},
       lastName:{required: true},
       firstName:{required: true},
       ccAddress1:{required: true},
       ccZip:{         
           postalcode : true
       },
       phone:{required: true},
       email:{
           required: true,
           email: true
           },
       userName:{
           required: true,
           minlength: 6
           },
       password:{
           required: true,
           minlength: 6
           },          
       cardNum:{           
            isValidCreditCard : true
       },
1
Parvez

Kredi kartı türünü numaradan tespit etmek için https://github.com/bendrucker/creditcards-types/ kullanıyorum. Karşılaştığım tek sorun test numarasıdır. 6011 1111 1111 1117

https://www.cybersource.com/developers/other_resources/quick_references/test_cc_numbers/ .__ 'dan 6011 ile başlayan bir keşif numarası olduğunu görüyoruz. "Maestro". Konuyu yazara açtım. Çok yakında bana cevap verdi ve bu pdf dökümanını sağladı https://www.discovernetwork.com/downloads/IPP_VAR_Compliance.pdf kredi kartı keşfedin. 

0
yuxiaomin

Bunu dene. Swift için.

func checkCardValidation(number : String) -> Bool
{
    let reversedInts = number.characters.reversed().map { Int(String($0)) }
        return reversedInts.enumerated().reduce(0, {(sum, val) in
            let odd = val.offset % 2 == 1
            return sum + (odd ? (val.element! == 9 ? 9 : (val.element! * 2) % 9) : val.element!)
        }) % 10 == 0
}

Kullan.

if (self.checkCardValidation(number: "yourNumber") == true) {
     print("Card Number valid")
}else{
     print("Card Number not valid")
}
0
Dixit Akabari

Bir kart numarasının ilk altı rakamı (ilk MII Rakam dahil) veren kimlik numarası (IIN) olarak bilinir. Bunlar Kartı karta veren kartı veren kurumu tanımlar. Kulp. Numaranın geri kalanı kart veren tarafından tahsis edilir. Kart numarasının uzunluğu, hane sayısıdır. Birçok kart veren yazdırıyor. kartlarındaki tüm IIN ve hesap numarası.

Yukarıdaki gerçeklere dayanarak, kart markasını tanımlamak için Java kod parçacığını tutmak istiyorum.

Örnek kart tipleri

public static final String AMERICAN_EXPRESS = "American Express";
public static final String DISCOVER = "Discover";
public static final String JCB = "JCB";
public static final String DINERS_CLUB = "Diners Club";
public static final String VISA = "Visa";
public static final String MASTERCARD = "MasterCard";
public static final String UNKNOWN = "Unknown";

Kart Önekleri

// Based on http://en.wikipedia.org/wiki/Bank_card_number#Issuer_identification_number_.28IIN.29
public static final String[] PREFIXES_AMERICAN_EXPRESS = {"34", "37"};
public static final String[] PREFIXES_DISCOVER = {"60", "62", "64", "65"};
public static final String[] PREFIXES_JCB = {"35"};
public static final String[] PREFIXES_DINERS_CLUB = {"300", "301", "302", "303", "304", "305", "309", "36", "38", "39"};
public static final String[] PREFIXES_VISA = {"4"};
public static final String[] PREFIXES_MASTERCARD = {
        "2221", "2222", "2223", "2224", "2225", "2226", "2227", "2228", "2229",
        "223", "224", "225", "226", "227", "228", "229",
        "23", "24", "25", "26",
        "270", "271", "2720",
        "50", "51", "52", "53", "54", "55"
    };

Giriş numarasının verilen öneklerden herhangi birine sahip olup olmadığını kontrol edin.

public String getBrand(String number) {

String evaluatedType;
if (StripeTextUtils.hasAnyPrefix(number, PREFIXES_AMERICAN_EXPRESS)) {
    evaluatedType = AMERICAN_EXPRESS;
} else if (StripeTextUtils.hasAnyPrefix(number, PREFIXES_DISCOVER)) {
    evaluatedType = DISCOVER;
} else if (StripeTextUtils.hasAnyPrefix(number, PREFIXES_JCB)) {
    evaluatedType = JCB;
} else if (StripeTextUtils.hasAnyPrefix(number, PREFIXES_DINERS_CLUB)) {
    evaluatedType = DINERS_CLUB;
} else if (StripeTextUtils.hasAnyPrefix(number, PREFIXES_VISA)) {
    evaluatedType = VISA;
} else if (StripeTextUtils.hasAnyPrefix(number, PREFIXES_MASTERCARD)) {
    evaluatedType = MASTERCARD;
} else {
    evaluatedType = UNKNOWN;
}
    return evaluatedType;
}

Son olarak, Yardımcı Program yöntemi

/**
  * Check to see if the input number has any of the given prefixes.
  *
  * @param number the number to test
  * @param prefixes the prefixes to test against
  * @return {@code true} if number begins with any of the input prefixes
*/

public static boolean hasAnyPrefix(String number, String... prefixes) {
  if (number == null) {
       return false;
  }
   for (String prefix : prefixes) {
       if (number.startsWith(prefix)) {
       return true;
    }
  }
     return false;
}

Referans

0
Anoop M

ilgili kart satıcılarıyla eşleşen düzenli ifade kuralları

  • VISA için (4\d{12}(?:\d{3})?).
  • MasterCard için (5[1-5]\d{14}).
  • AMEX için (3[47]\d{13}).
  • Maestro için ((?:5020|5038|6304|6579|6761)\d{12}(?:\d\d)?).
  • Diners Club için (3(?:0[0-5]|[68][0-9])[0-9]{11}).
  • Discover için (6(?:011|5[0-9]{2})[0-9]{12}).
  • JCB için (35[2-8][89]\d\d\d{10}).
0
rajan
follow Luhn’s algorithm

 private  boolean validateCreditCardNumber(String str) {

        int[] ints = new int[str.length()];
        for (int i = 0; i < str.length(); i++) {
            ints[i] = Integer.parseInt(str.substring(i, i + 1));
        }
        for (int i = ints.length - 2; i >= 0; i = i - 2) {
            int j = ints[i];
            j = j * 2;
            if (j > 9) {
                j = j % 10 + 1;
            }
            ints[i] = j;
        }
        int sum = 0;
        for (int i = 0; i < ints.length; i++) {
            sum += ints[i];
        }
        if (sum % 10 == 0) {
           return true;
        } else {
            return false;
        }


    }

then call this method

Edittext mCreditCardNumberEt;

 mCreditCardNumberEt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

             int cardcount=   s.toString().length();
                 if(cardcount>=16) {
                    boolean cardnumbervalid=   validateCreditCardNumber(s.toString());
                    if(cardnumbervalid) {
                        cardvalidtesting.setText("Valid Card");
                        cardvalidtesting.setTextColor(ContextCompat.getColor(context,R.color.green));
                    }
                    else {
                        cardvalidtesting.setText("Invalid Card");
                        cardvalidtesting.setTextColor(ContextCompat.getColor(context,R.color.red));
                    }
                }
               else if(cardcount>0 &&cardcount<16) {
                     cardvalidtesting.setText("Invalid Card");
                     cardvalidtesting.setTextColor(ContextCompat.getColor(context,R.color.red));
                }

                else {
                    cardvalidtesting.setText("");

                }


                }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
0
gaurav gupta