Próbuję dowiedzieć się, jak wykryć rodzaj karty kredytowej na podstawie wyłącznie jej liczby. Czy ktoś zna ostateczny i niezawodny sposób na znalezienie tego?
algorithm
language-agnostic
e-commerce
Andrew Edvalson
źródło
źródło
Odpowiedzi:
Numer karty kredytowej / debetowej jest określany jako PAN lub główny numer konta . Pierwsze sześć cyfr PAN pochodzi z numeru IIN lub numeru identyfikacyjnego emitenta należącego do banku wydającego (numery IIN były wcześniej znane jako BIN - bankowe numery identyfikacyjne - dlatego w niektórych dokumentach można znaleźć odniesienia do tej terminologii). Te sześć cyfr podlega międzynarodowej normie ISO / IEC 7812 i można ich użyć do określenia rodzaju karty na podstawie numeru.
Niestety rzeczywista baza danych ISO / IEC 7812 nie jest publicznie dostępna, jednak istnieją nieoficjalne listy, zarówno komercyjne, jak i bezpłatne, w tym na Wikipedii .
W każdym razie, aby wykryć typ na podstawie liczby, możesz użyć wyrażenia regularnego, takiego jak poniższe: Kredyt za oryginalne wyrażenia
Visa:
^4[0-9]{6,}$
Numery kart Visa zaczynają się od 4.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,}$
Przed 2016 r. Numery MasterCard zaczynają się od cyfr 51 do 55, ale wykrywa to tylko karty kredytowe MasterCard ; istnieją inne karty wydane przy użyciu systemu MasterCard, które nie należą do tego zakresu IIN. W 2016 r. Dodadzą liczby z zakresu (222100–272099).American Express:
^3[47][0-9]{5,}$
Numery kart American Express zaczynają się od 34 lub 37.Diners Club:
^3(?:0[0-5]|[68][0-9])[0-9]{4,}$
Numery kart Diners Club zaczynają się od 300 do 305, 36 lub 38. Istnieją karty Diners Club, które zaczynają się od 5 i mają 16 cyfr. Są to wspólne przedsięwzięcia Diners Club i MasterCard i powinny być przetwarzane jak karta MasterCard.Odkryj:
^6(?:011|5[0-9]{2})[0-9]{3,}$
numery kart zaczynają się od 6011 lub 65.JCB:
^(?:2131|1800|35[0-9]{3})[0-9]{3,}$
Karty JCB zaczynają się od 2131, 1800 lub 35.Niestety istnieje wiele rodzajów kart przetwarzanych w systemie MasterCard, które nie działają w zakresie IIN MasterCard (numery zaczynające się od 51 ... 55); najważniejszym przypadkiem są karty Maestro, z których wiele zostało wydanych z zakresów IIN innych banków, a więc są rozmieszczone na całej przestrzeni liczbowej. W związku z tym najlepiej założyć, że każda karta, która nie jest innego rodzaju, który akceptujesz, musi być kartą MasterCard .
Ważne : numery kart różnią się długością; na przykład Visa wydawała w przeszłości karty z 13 cyfrowymi PAN i karty z 16 cyfrowymi PAN. Dokumentacja Visa obecnie wskazuje, że może wydawać lub wydawać numery od 12 do 19 cyfr. Dlatego nie należy sprawdzać długości numeru karty, poza sprawdzeniem, czy ma on co najmniej 7 cyfr (dla pełnego IIN plus jedna cyfra kontrolna, które powinny być zgodne z wartością przewidywaną przez algorytm Luhna ).
Jeszcze jedna wskazówka: przed przetworzeniem PAN karty posiadacza karty, usuń wszelkie białe znaki i znaki interpunkcyjne z wejścia . Dlaczego? Ponieważ zwykle o wiele łatwiej jest wprowadzać cyfry w grupach, podobnie jak są wyświetlane na przedniej stronie rzeczywistej karty kredytowej, tj
jest znacznie łatwiej wprowadzić poprawnie niż
Naprawdę nie ma korzyści z karania użytkownika, ponieważ wprowadzili oni znaki, których się tu nie spodziewasz.
Oznacza to również upewnienie się, że w polach wejściowych jest miejsce na co najmniej 24 znaki, w przeciwnym razie użytkownikom, którzy wejdą w spacje, zabraknie miejsca. Zalecam, aby pole było wystarczająco szerokie, aby wyświetlało 32 znaki i pozwalało na użycie maksymalnie 64 znaków; daje to dużo miejsca na rozbudowę.
Oto obraz, który daje nieco więcej wglądu:
AKTUALIZACJA (2014): Metoda sumy kontrolnej nie wydaje się już prawidłowym sposobem weryfikacji autentyczności karty, jak zauważono w komentarzach do tej odpowiedzi.
AKTUALIZACJA (2016): Mastercard wdroży nowe zakresy BIN od Ach Payment .
źródło
W javascript:
Test jednostkowy:
źródło
Zaktualizowano: 15 czerwca 2016 r. (Jako obecnie najlepsze rozwiązanie)
Pamiętaj, że nawet oddaję głos na ten, który jest najczęściej głosowany, ale aby wyjaśnić, że tak naprawdę wyrażenia regularne działają, przetestowałem go z tysiącami prawdziwych kodów BIN. Najważniejsze jest użycie ciągów początkowych (^), w przeciwnym razie da to fałszywe wyniki w prawdziwym świecie!
JCB
^(?:2131|1800|35)[0-9]{0,}$
Zacznij od: 2131, 1800, 35 (3528-3589)American Express
^3[47][0-9]{0,}$
Zacznij od: 34, 37Diners Club
^3(?:0[0-59]{1}|[689])[0-9]{0,}$
Zacznij od: 300-305, 309, 36, 38-39Visa
^4[0-9]{0,}$
Zacznij od: 4karta MasterCard
^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$
Zacznij od: 2221-2720, 51-55Maestro
^(5[06789]|6)[0-9]{0,}$
Maestro zawsze rośnie w przedziale: 60-69 , zaczynał od / nie czegoś innego, ale start 5 musi być zakodowany jako mastercard. Karty Maestro muszą zostać wykryte na końcu kodu, ponieważ niektóre inne mają zakres od 60 do 69. Proszę spojrzeć na kod.Odkryć
^(6011|65|64[4-9]|62212[6-9]|6221[3-9]|622[2-8]|6229[01]|62292[0-5])[0-9]{0,}$
Odkryj dość trudny do kodowania, zacznij od: 6011, 622126-622925, 644-649, 65W javascript używam tej funkcji. Jest to dobre, gdy przypisujesz je do zdarzenia onkeyup i daje wynik tak szybko, jak to możliwe.
Tutaj możesz z nim zagrać:
http://jsfiddle.net/upN3L/69/
W przypadku PHP użyj tej funkcji, wykrywa to również niektóre karty podrzędne VISA / MC:
źródło
Oto funkcja sprawdzania typu karty kredytowej za pomocą Regex, c #
źródło
Spójrz na to:
http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CC70060A01B
źródło
ostatnio potrzebowałem takiej funkcjonalności, przenosiłem Walidator Zend Framework na Ruby. ruby gem: https://github.com/Fivell/credit_card_validations zend framework: https://github.com/zendframework/zf2/blob/master/library/Zend/Validator/CreditCard.php
Oba używają zakresów INN do wykrywania typu. Tutaj możesz przeczytać o INN
Zgodnie z tym możesz alternatywnie wykryć kartę kredytową (bez wyrażeń regularnych, ale deklarując pewne zasady dotyczące prefiksów i możliwej długości)
Mamy więc kolejne zasady dotyczące najczęściej używanych kart
Następnie, wyszukując prefiks i porównując długość, możesz wykryć markę karty kredytowej. Nie zapomnij także o luhn algoritm (jest opisany tutaj http://en.wikipedia.org/wiki/Luhn ).
AKTUALIZACJA
zaktualizowaną listę zasad można znaleźć tutaj https://raw.githubusercontent.com/Fivell/credit_card_validations/master/lib/data/brands.yaml
źródło
Oto kompletny kod C # lub VB dla wszystkich rodzajów CC związanych z projektami kodowymi.
Ten artykuł jest obecny od kilku lat bez żadnych negatywnych komentarzy.
źródło
Kompaktowa wersja javascript
źródło
Odpowiedź Anatolija w PHP:
źródło
Oto funkcja klasy php zwraca CCtype przez CCnumber.
Ten kod nie weryfikuje karty lub nie uruchamia Algorytm Luhna próbuje jedynie znaleźć typ karty kredytowej na podstawie tabeli na tej stronie . zasadniczo używa długości numeru CC i prefiksu karty CC, aby określić typ karty CCcard.
źródło
Nie próbuj wykrywać typu karty kredytowej w ramach przetwarzania płatności. Ryzykujesz odrzuceniem ważnych transakcji.
Jeśli musisz podać procesorowi płatności informacje (np. Obiekt karty kredytowej PayPal wymaga podania nazwy rodzaju karty ), zgadnij na podstawie najmniej dostępnych informacji, np.
Ta implementacja (wykorzystująca tylko dwie pierwsze cyfry) jest wystarczająca, aby zidentyfikować wszystkie główne (aw przypadku PayPal wszystkie obsługiwane) schematy kart. W rzeczywistości możesz pominąć wyjątek całkowicie i domyślnie wybrać najpopularniejszy typ karty. Niech bramka płatności / procesor poinformuje Cię, czy wystąpił błąd sprawdzania poprawności w odpowiedzi na Twoje żądanie.
Rzeczywistość jest taka, że twoja bramka płatności nie dba o twoją wartość .
źródło
Pierwszych numerów karty kredytowej można użyć do przybliżenia sprzedawcy:
źródło
W Card Range Recognition (CRR), wadą algorytmów wykorzystujących serię wyrażeń regularnych lub innych zakodowanych na stałe zakresów jest to, że BIN / IIN zmieniają się w miarę upływu czasu. Co-branding kart jest ciągłą komplikacją. Różni nabywcy / akceptanci kart mogą wymagać traktowania tej samej karty w różny sposób, w zależności np. Od geolokalizacji.
Ponadto w ciągu ostatnich kilku lat, na przykład z kartami UnionPay w szerszym obiegu, istniejące modele nie radzą sobie z nowymi zakresami, które czasami przeplatają się z szerszymi zakresami, które zastępują.
Znajomość położenia geograficznego systemu może pomóc, ponieważ niektóre zakresy są ograniczone do użytku w poszczególnych krajach. Na przykład, zakresy 62 obejmują niektóre podzakresy AAA w USA, ale jeśli twoja baza handlowa znajduje się poza USA, możesz traktować wszystkie 62 jako UnionPay.
Możesz również zostać poproszony o potraktowanie karty inaczej w zależności od lokalizacji sprzedawcy. Na przykład, aby traktować niektóre karty brytyjskie jako debet w kraju, ale jako kredyt międzynarodowy.
Istnieje jeden bardzo użyteczny zestaw zasad utrzymywanych przez jeden duży bank przejmujący. Np. Https://www.barclaycard.co.uk/business/files/BIN-Rules-EIRE.pdf i https://www.barclaycard.co.uk/business/files/BIN-Rules-UK.pdf . (Ważne linki z czerwca 2017 r., Dzięki użytkownikowi, który podał link do zaktualizowanej referencji). Należy jednak pamiętać o zastrzeżeniu, że chociaż te zasady CRR mogą reprezentować wszechświat wydawania kart, ponieważ dotyczy kupców nabytych przez ten podmiot, nie obejmuje np. zakresów określonych jako CUP / UPI.
Te uwagi dotyczą scenariuszy z paskiem magnetycznym (MagStripe) lub PKE (Pan Key Entry). Znowu sytuacja wygląda inaczej w świecie ICC / EMV.
Aktualizacja: Inne odpowiedzi na tej stronie (a także na połączonej stronie WikiPedia) mają JCB jak zawsze 16. Jednak w mojej firmie mamy dedykowany zespół inżynierów, którzy certyfikują nasze urządzenia POS i oprogramowanie w wielu bankach i lokalizacjach. Najnowszy pakiet certyfikacji kart, które ten zespół ma od JCB, miał skrzynkę na 19-letnią PAN.
źródło
Swift 2.1 Wersja odpowiedzi Usmana Y. Skorzystaj z instrukcji print, aby zweryfikować wywołanie za pomocą wartości ciągu
źródło
Stripe zapewnił tę fantastyczną bibliotekę javascript do wykrywania schematów kart. Pozwól, że dodam kilka fragmentów kodu i pokażę, jak z niego korzystać.
Najpierw dołącz go do swojej strony internetowej jako
Po drugie, użyj funkcji cardType do wykrycia schematu karty.
Oto linki referencyjne, aby uzyskać więcej przykładów i wersji demonstracyjnych.
źródło
W trybie szybkim możesz utworzyć wyliczenie, aby wykryć typ karty kredytowej.
Wywołaj metodę CreditCardType.cardTypeForCreditCardNumber („# numer karty”), która zwraca wartość wyliczającą CreditCardType.
źródło
Moje rozwiązanie z jQuery:
W przypadku zwrotu 0 typ karty kredytowej nie jest wykrywany.
Do pola wejściowego karty kredytowej należy dodać klasę „karta kredytowa”.
źródło
Dość często szukałem formatowania kart kredytowych i formatowania numerów telefonów. Znalazłem wiele dobrych wskazówek, ale nic tak naprawdę nie pasowało do moich konkretnych pragnień, więc stworzyłem ten kawałek kodu . Używasz go w ten sposób:
źródło
źródło
Tylko mała łyżeczka do karmienia:
źródło
Oto przykład niektórych funkcji boolowskich napisanych w Pythonie, które zwracają się,
True
jeśli karta zostanie wykryta zgodnie z nazwą funkcji.źródło
W oparciu o powyższe fakty chciałbym zachować fragment kodu JAVA w celu identyfikacji marki karty.
Odniesienie
źródło
Spróbuj tego dla kotlin. Dodaj Regex i dodaj do instrukcji when.
źródło
Reguły wyrażeń regularnych pasujące do odpowiednich dostawców kart :
(4\d{12}(?:\d{3})?)
dla VISA.(5[1-5]\d{14})
dla MasterCard.(3[47]\d{13})
dla AMEX.((?:5020|5038|6304|6579|6761)\d{12}(?:\d\d)?)
dla Maestro.(3(?:0[0-5]|[68][0-9])[0-9]{11})
dla Diners Club.(6(?:011|5[0-9]{2})[0-9]{12})
dla Discover.(35[2-8][89]\d\d\d{10})
dla JCB.źródło
Używam https://github.com/bendrucker/creditcards-types/ do wykrywania typu karty kredytowej na podstawie numeru. Jednym z problemów, na jakie natrafiłem, jest test nr 6011 1111 1111 1117
z https://www.cybersource.com/developers/other_resources/quick_references/test_cc_numbers/ możemy zobaczyć, że jest to liczba odkrywcza, ponieważ zaczyna się od 6011. Ale wynik, jaki otrzymuję z typów kart kredytowych, to „Maestro”. Otworzyłem problem autorowi. Odpowiedział mi bardzo szybko i przekazał ten dokument pdf https://www.discovernetwork.com/downloads/IPP_VAR_Compliance.pdf Z tego dokumentu jasno widać, że 6011 1111 1111 1117 nie mieści się w zakresie karty kredytowej Discover.
źródło
Spróbuj tego. Dla szybkiego.
Posługiwać się.
źródło
źródło