Saya mencoba mencari cara untuk mendeteksi jenis kartu kredit berdasarkan pada nomornya. Adakah yang tahu cara pasti dan andal untuk menemukan ini?
algorithm
language-agnostic
e-commerce
Andrew Edvalson
sumber
sumber
Jawaban:
Nomor kartu kredit / debit disebut sebagai PAN , atau Nomor Akun Utama . Enam digit pertama PAN diambil dari IIN , atau Nomor Identifikasi Penerbit , milik bank penerbit (IIN sebelumnya dikenal sebagai BIN - Nomor Identifikasi Bank - sehingga Anda dapat melihat referensi terminologi itu dalam beberapa dokumen). Keenam digit ini tunduk pada standar internasional, ISO / IEC 7812 , dan dapat digunakan untuk menentukan jenis kartu dari nomor tersebut.
Sayangnya basis data ISO / IEC 7812 yang sebenarnya tidak tersedia untuk umum, namun, ada daftar tidak resmi, baik komersial maupun gratis, termasuk di Wikipedia .
Pokoknya, untuk mendeteksi jenis dari angka, Anda dapat menggunakan ekspresi reguler seperti yang di bawah ini: Kredit untuk ekspresi asli
Visa:
^4[0-9]{6,}$
Nomor kartu Visa dimulai dengan angka 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,}$
Sebelum 2016, nomor MasterCard mulai dengan angka 51 hingga 55, tetapi ini hanya akan mendeteksi kartu kredit MasterCard ; ada kartu lain yang dikeluarkan menggunakan sistem MasterCard yang tidak termasuk dalam rentang IIN ini. Pada 2016, mereka akan menambahkan angka dalam kisaran (222100-272099).American Express:
^3[47][0-9]{5,}$
Nomor kartu American Express dimulai dengan 34 atau 37.Diners Club:
^3(?:0[0-5]|[68][0-9])[0-9]{4,}$
Nomor kartu Diners Club dimulai dengan 300 hingga 305, 36 atau 38. Ada kartu Diners Club yang dimulai dengan 5 dan memiliki 16 digit. Ini adalah usaha patungan antara Diners Club dan MasterCard dan harus diproses seperti MasterCard.Temukan:
^6(?:011|5[0-9]{2})[0-9]{3,}$
Temukan nomor kartu dimulai dengan 6011 atau 65.JCB:
^(?:2131|1800|35[0-9]{3})[0-9]{3,}$
Kartu JCB dimulai dengan 2131, 1800 atau 35.Sayangnya, ada sejumlah jenis kartu yang diproses dengan sistem MasterCard yang tidak hidup dalam kisaran IIN MasterCard (angka mulai 51 ... 55); kasus yang paling penting adalah kartu Maestro, banyak di antaranya telah dikeluarkan dari rentang IIN bank lain dan berlokasi di seluruh ruang angka. Sebagai akibatnya, mungkin lebih baik untuk mengasumsikan bahwa kartu apa pun yang bukan dari jenis lain yang Anda terima haruslah MasterCard .
Penting : panjang nomor kartu bervariasi; misalnya, Visa memiliki kartu yang dikeluarkan di masa lalu dengan 13 digit PAN dan kartu dengan 16 digit PAN. Dokumentasi Visa saat ini menunjukkan bahwa ia mungkin mengeluarkan atau mungkin telah mengeluarkan angka dengan antara 12 dan 19 digit. Oleh karena itu, Anda tidak boleh memeriksa panjang nomor kartu, selain untuk memverifikasi bahwa ia memiliki setidaknya 7 digit (untuk IIN lengkap ditambah satu digit periksa, yang harus sesuai dengan nilai yang diprediksi oleh algoritma Luhn ).
Satu petunjuk lebih lanjut: sebelum memproses PAN pemegang kartu, lepaskan karakter spasi dan tanda baca apa pun dari input . Mengapa? Karena biasanya lebih mudah untuk memasukkan angka dalam grup, mirip dengan bagaimana mereka ditampilkan di bagian depan kartu kredit yang sebenarnya, yaitu
jauh lebih mudah untuk masuk dengan benar daripada
Benar-benar tidak ada manfaat dalam menghukum pengguna karena mereka telah memasukkan karakter yang tidak Anda harapkan di sini.
Ini juga menyiratkan memastikan bahwa bidang entri Anda memiliki ruang untuk setidaknya 24 karakter, jika tidak, pengguna yang memasukkan spasi akan kehabisan ruang. Saya sarankan Anda membuat bidang cukup lebar untuk menampilkan 32 karakter dan memungkinkan hingga 64; yang memberi banyak ruang kepala untuk ekspansi.
Berikut adalah gambar yang memberi sedikit lebih banyak wawasan:
UPDATE (2014): Metode checksum tampaknya tidak lagi menjadi cara yang valid untuk memverifikasi keaslian kartu seperti yang tercantum dalam komentar pada jawaban ini.
UPDATE (2016): Mastercard akan menerapkan rentang BIN baru mulai Pembayaran Ach .
sumber
Dalam javascript:
Tes unit:
sumber
Diperbarui: 15 Juni 2016 (sebagai solusi akhir saat ini)
Harap dicatat bahwa saya bahkan memberikan suara untuk salah satu yang terpilih, tetapi untuk membuatnya jelas ini adalah regexps benar-benar berfungsi saya mengujinya dengan ribuan kode BIN nyata. Yang paling penting adalah menggunakan string awal (^) kalau tidak akan memberikan hasil yang salah di dunia nyata!
JCB
^(?:2131|1800|35)[0-9]{0,}$
Mulai dengan: 2131, 1800, 35 (3528-3589)American Express
^3[47][0-9]{0,}$
Mulai dengan: 34, 37Klub Diners
^3(?:0[0-59]{1}|[689])[0-9]{0,}$
Mulai dengan: 300-305, 309, 36, 38-39Visa
^4[0-9]{0,}$
Mulai dengan: 4MasterCard
^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$
Mulai dengan: 2221-2720, 51-55Maestro
^(5[06789]|6)[0-9]{0,}$
Maestro selalu berkembang dalam kisaran: 60-69 , dimulai dengan / bukan sesuatu yang lain, tetapi mulai 5 harus dikodekan sebagai mastercard. Kartu maestro harus dideteksi di akhir kode karena sebagian yang lain memiliki kisaran 60-69. Silakan lihat kodenya.Temukan
^(6011|65|64[4-9]|62212[6-9]|6221[3-9]|622[2-8]|6229[01]|62292[0-5])[0-9]{0,}$
Temukan yang cukup sulit untuk dikodekan, mulai dengan: 6011, 622126-622925, 644-649, 65Dalam javascript saya menggunakan fungsi ini. Ini bagus ketika Anda menugaskannya ke acara onkeyup dan itu memberikan hasil sesegera mungkin.
Di sini Anda dapat bermain dengannya:
http://jsfiddle.net/upN3L/69/
Untuk PHP menggunakan fungsi ini, ini mendeteksi beberapa sub kartu VISA / MC juga:
sumber
Berikut adalah fungsi untuk memeriksa jenis kartu kredit menggunakan Regex, c #
sumber
Lihat ini:
http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CC70060A01B
sumber
Baru-baru ini saya membutuhkan fungsionalitas seperti itu, saya memindahkan Validator Kartu Kredit Zend Framework ke ruby. ruby gem: https://github.com/Fivell/credit_card_validations kerangka zend: https://github.com/zendframework/zf2/blob/master/library/Zend/Validator/CreditCard.php
Keduanya menggunakan rentang INN untuk mendeteksi tipe. Di sini Anda dapat membaca tentang INN
Menurut ini, Anda dapat mendeteksi kartu kredit sebagai alternatif (tanpa regexps, tetapi mendeklarasikan beberapa aturan tentang awalan dan kemungkinan panjang)
Jadi kita memiliki aturan selanjutnya untuk kartu yang paling sering digunakan
Kemudian dengan mencari awalan dan membandingkan panjang Anda dapat mendeteksi merek kartu kredit. Juga jangan lupa tentang algoritme luhn (itu dideskripsikan di sini http://en.wikipedia.org/wiki/Luhn ).
MEMPERBARUI
daftar peraturan terbaru dapat ditemukan di sini https://raw.githubusercontent.com/Fivell/credit_card_validations/master/lib/data/brands.yaml
sumber
Berikut kode C # atau VB Lengkap untuk semua jenis hal terkait CC pada proyek codep.
Artikel ini telah terbit selama beberapa tahun tanpa komentar negatif.
sumber
Versi javascript ringkas
sumber
Jawaban Anatoliy dalam PHP:
sumber
Berikut adalah fungsi kelas php mengembalikan CCtype oleh CCnumber.
Kode ini tidak memvalidasi kartu atau tidak menjalankan algoritma Luhn hanya mencoba menemukan jenis kartu kredit berdasarkan tabel di halaman ini . pada dasarnya menggunakan panjang CCnumber dan awalan CCcard untuk menentukan jenis CCcard.
sumber
Jangan mencoba mendeteksi jenis kartu kredit sebagai bagian dari pemrosesan pembayaran. Anda berisiko kehilangan transaksi yang valid.
Jika Anda perlu memberikan informasi kepada pemroses pembayaran Anda (mis. Objek kartu kredit PayPal harus menyebutkan jenis kartu ), maka tebaklah dari informasi yang paling sedikit tersedia, mis.
Implementasi ini (hanya menggunakan dua digit pertama) sudah cukup untuk mengidentifikasi semua skema kartu utama (dan dalam kasus PayPal semua yang didukung). Bahkan, Anda mungkin ingin melewatkan pengecualian sama sekali dan default ke jenis kartu paling populer. Biarkan gateway pembayaran / prosesor memberi tahu Anda jika ada kesalahan validasi dalam menanggapi permintaan Anda.
Kenyataannya adalah gateway pembayaran Anda tidak peduli dengan nilai yang Anda berikan .
sumber
Angka pertama kartu kredit dapat digunakan untuk memperkirakan vendor:
sumber
Dalam Card Range Recognition (CRR), kelemahan dengan algoritma yang menggunakan serangkaian regex atau rentang hard-coded lainnya, adalah bahwa BIN / IIN berubah seiring waktu dalam pengalaman saya. Co-branding kartu merupakan komplikasi yang berkelanjutan. Pengakuisisi Kartu yang berbeda / pedagang mungkin perlu Anda memperlakukan kartu yang sama secara berbeda, tergantung pada misalnya geolokasi.
Selain itu, dalam beberapa tahun terakhir dengan kartu UnionPay misalnya dalam sirkulasi yang lebih luas, model yang ada tidak mengatasi rentang baru yang kadang-kadang interleave dengan rentang yang lebih luas yang mereka gantikan.
Mengetahui geografi yang perlu dicakup sistem Anda dapat membantu, karena beberapa rentang terbatas untuk digunakan di negara-negara tertentu. Misalnya, rentang 62 mencakup beberapa sub-rentang AAA di AS, tetapi jika basis pedagang Anda di luar AS, Anda mungkin dapat memperlakukan semua 62 sebagai UnionPay.
Anda mungkin juga diminta untuk memperlakukan kartu secara berbeda berdasarkan lokasi pedagang. Misalnya memperlakukan kartu UK tertentu sebagai debit di dalam negeri, tetapi sebagai kredit internasional.
Ada seperangkat aturan yang sangat berguna yang dikelola oleh satu Bank Pengakuisisi besar. Misalnya https://www.barclaycard.co.uk/business/files/BIN-Rules-EIRE.pdf dan https://www.barclaycard.co.uk/business/files/BIN-Rules-UK.pdf . (Tautan yang valid per Juni 2017, terima kasih kepada pengguna yang memberikan tautan ke referensi yang diperbarui.) Namun perlu diperhatikan bahwa, sementara aturan CRR ini dapat mewakili alam semesta Penerbit Kartu sebagaimana berlaku untuk pedagang yang diperoleh oleh entitas itu, itu tidak termasuk mis. rentang yang diidentifikasi sebagai CUP / UPI.
Komentar ini berlaku untuk skenario magnetic stripe (MagStripe) atau PKE (Pan Key Entry). Situasinya berbeda lagi di dunia ICC / EMV.
Pembaruan: Jawaban lain pada halaman ini (dan juga halaman WikiPedia yang ditautkan) memiliki JCB seperti biasanya sepanjang 16. Namun, di perusahaan saya, kami memiliki tim insinyur khusus yang mengesahkan perangkat POS dan perangkat lunak kami di beberapa bank dan geografi yang mengakuisisi. Paket Sertifikasi kartu terakhir yang dimiliki tim ini dari JCB, memiliki kasus lulus untuk PAN yang panjang 19.
sumber
Swift 2.1 Versi dari jawaban Usman Y. Gunakan pernyataan cetak untuk memverifikasi sehingga panggilan dengan beberapa nilai string
sumber
Stripe telah menyediakan perpustakaan javascript yang fantastis ini untuk deteksi skema kartu. Izinkan saya menambahkan beberapa cuplikan kode dan menunjukkan kepada Anda cara menggunakannya.
Pertama Sertakan ke halaman web Anda sebagai
Kedua, gunakan cardType fungsi untuk mendeteksi skema kartu.
Berikut ini tautan referensi untuk lebih banyak contoh dan demo.
sumber
Dengan cepat Anda dapat membuat enum untuk mendeteksi jenis kartu kredit.
Panggil metode CreditCardType.cardTypeForCreditCardNumber ("# nomor kartu") yang mengembalikan nilai enum CreditCardType.
sumber
Solusi saya dengan jQuery:
Jika 0 dikembalikan, jenis kartu kredit tidak terdeteksi.
kelas "kartu kredit" harus ditambahkan ke bidang input kartu kredit.
sumber
Saya mencari di sekitar sedikit untuk pemformatan kartu kredit dan pemformatan nomor telepon. Menemukan banyak tips bagus tetapi tidak ada yang benar-benar cocok dengan keinginan saya, jadi saya membuat sedikit kode ini . Anda menggunakannya seperti ini:
sumber
sumber
Sedikit saja pemberian sendok:
sumber
Berikut adalah contoh beberapa fungsi boolean yang ditulis dengan Python yang kembali
True
jika kartu terdeteksi sesuai nama fungsi.sumber
Berdasarkan fakta di atas saya ingin menyimpan potongan kode JAVA untuk mengidentifikasi merek kartu.
Referensi
sumber
Coba ini untuk kotlin. Tambahkan Regex dan tambahkan ke pernyataan when.
sumber
Aturan persamaan reguler yang cocok dengan masing - masing vendor kartu :
(4\d{12}(?:\d{3})?)
untuk VISA.(5[1-5]\d{14})
untuk MasterCard.(3[47]\d{13})
untuk AMEX.((?:5020|5038|6304|6579|6761)\d{12}(?:\d\d)?)
untuk Maestro.(3(?:0[0-5]|[68][0-9])[0-9]{11})
untuk Diners Club.(6(?:011|5[0-9]{2})[0-9]{12})
untuk Discover.(35[2-8][89]\d\d\d{10})
untuk JCB.sumber
Saya menggunakan https://github.com/bendrucker/creditcards-types/ untuk mendeteksi jenis kartu kredit dari nomor. Satu masalah yang saya temui adalah menemukan nomor tes 6011 1111 1111 1117
dari https://www.cybersource.com/developers/other_resources/quick_references/test_cc_numbers/ kita bisa melihat ini adalah nomor penemuan karena dimulai oleh 6011. Tetapi hasil yang saya dapatkan dari kartu kredit adalah "Maestro". Saya membuka masalah kepada penulis. Dia segera menjawab saya dan memberikan dokumen pdf ini https://www.discovernetwork.com/downloads/IPP_VAR_Compliance.pdf Dari dokumen tersebut kita dapat melihat dengan jelas bahwa 6011 1111 1111 1117 tidak termasuk dalam jajaran kartu kredit temukan.
sumber
Coba ini. Untuk cepat.
Menggunakan.
sumber
sumber