クレジットカードの種類は、クレジットカード番号だけで判断できますか?
これは推奨されますか、それともクライアントに使用しているクレジットカードの種類を常に尋ねるべきですか?
私はそれについてグーグルで検索し、このアルゴリズムを見つけました: http://cuinl.tripod.com/Tips/o-1.htm 、これは信頼できますか?
はい、あなたが言及したサイトは正しいです。多くのサイト、含む。 Google Checkoutは、カードタイプの自動検出に依存していると思います。これは便利で、UIがすっきり(入力ボックスが1つ少なく)なり、時間を節約できます。先に行く!
(あなたがそれを理解することができるとしても)それらを選ぶようにする一つの正当な理由を聞いたことがあります。彼らがあなたが受け入れるクレジットカードのリストを知っているように。
消費者として、私は最初にカードを選ぶのが嫌いです。数字の入力を始めたいだけです。
この問題については、WroblewskiのWeb Form Designの153-154ページで説明しています。 「不要な入力」の章の「質問を削除する」セクションにあります。例はPaypalで、番号を入力したときにカードの種類が強調表示されます。
少なくとも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
ここに、現在のカード範囲で動作するスクリプトを使用します。また、番号の有効性チェックも行います。
/**
* 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;
}
完全なC#またはVB CC関連のあらゆる種類のコード codeprojectで。
この記事は、否定的なコメントなしで数年にわたってアップされています。
これは、最初の投稿で言及した同じアルゴリズムのPHPバージョンです
<?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;
}
?>
Wikipedia には、ほとんどのカードプレフィックスのリストが含まれています。投稿したリンクに一部のカードがありません。また、指定したリンクが有効であるようです。
カードの種類を尋ねる理由の1つは、追加の検証のためです。ユーザーが提供したものを番号と比較します。
リンクしたコードには、不完全なBIN /範囲リストがあり、ダイナーのクラブ(現在はディスカバーに属している)は省略され、もはや存在しないカードタイプがリストされます存在し、他のタイプ(enRoute、Carte Blanche)に折りたたむ必要があり、ますます重要になっているMaestro Internationalカートタイプを無視します。
@Alexが確認したように、BIN番号からカードタイプを判別することは可能です。多くの企業がそれを行いますが、一貫して正しく行うことは簡単ではありません。カードブランドは常に変化し、処理しようとすると物事の追跡がより複雑になりますリージョナルデビットカード(アイルランドのレーザー、ヨーロッパのマエストロなど)-どこでも、このための無料で維持された(正しい)コードまたはアルゴリズムを見つけていません。
@MitMaroが指摘したように、 ウィキペディアにはカード識別子の高レベルのリストが含まれています 、および BIN番号と範囲のより具体的なリスト 、これは良い出発点です。そして、gbjbaanbがコメントしたように、 バークレイズには公開されたリストがあります (しかし、何らかの理由でDiscoverは含まれていないようです。おそらく、Discoverネットワークで処理されないのでしょうか?)
些細なことですが、正しいカード識別アルゴリズム/メソッド/機能を維持するために作業が必要です。そのため、検出ルーチンが重要でない/情報的でない限り(たとえば@Simon_Weaverの提案)、OR you 「最新の状態に保つために作業を行う予定です。自動検出をスキップすることをお勧めします。
Stripeは、カードスキーム検出用にこの素晴らしいjavascriptライブラリを提供しています。いくつかのコードスニペットを追加し、その使用方法を示します。
まず、Webページに次のように含めます
<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);
});
その他の例とデモの参照リンクは次のとおりです。
カードタイプを自動的に判別し、入力中にユーザーに表示する簡単な方法を次に示します。
これは、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ルールを使用して、灰色のテキストを表示します。
個人的には、最初にカードタイプを選択しても問題ありません。しかし、私の考えでは問題のあるクレジットカード番号の入力には2つの側面があります。
最悪なのは、数字のグループ間にスペースを入力できないことです。物理カードに印刷されたスペースを含めると、ユーザーが情報を正しく入力したことを確認するために、ユーザーが数字をスキャンしやすくなります。このユビキタスな欠陥に遭遇するたびに、不要な文字を削除するためにユーザー入力をフィルター処理できなかった石器時代に逆行しているように感じます。
2つ目は、電話の注文時にベンダーの声を聞き、カード番号を繰り返し返してもらう必要があることです。クレジットカードの受信者が実際に必要なのは、cc番号が有効であることを確認するチェックディジットスキームへのアクセスを提供するUIです。そのアルゴリズムによると、最初の15(またはそれ以上)の数字が最後の数字を計算します-そして、「だます」ことは事実上不可能です。太い指の番号を「パス」するには、15桁のうち少なくとも2つの相互キャンセルエラーが必要です。アルゴリズムが、疑わしい隣接番号の転置によって不釣り合いにだまされるという欠陥(一般的な入力エラー)に悩まされない限り、人間の二重チェックよりも信頼性が高いことを除きます。
受け入れるすべてのクレジットカードに同じプロパティがある場合は、ユーザーにカード番号と他のプロパティ(有効期限、CVVなど)を入力させるだけです。ただし、カードの種類によっては、異なるフィールドを入力する必要があります(例:UK Maestroカードの開始日または発行番号)。これらの場合、すべてのフィールドを持たなければならないため、ユーザーを混乱させるか、JavaScriptを使用して関連フィールドを非表示/表示する必要があります。これにより、ユーザーは少し奇妙になります(クレジットカード番号を入力すると、フィールドが消える/表示される) 。そのような場合は、最初にカードの種類を尋ねることをお勧めします。
Pythonのこの実装は、AmEx、Discover、Master Card、Visaで動作するはずです。
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
https://binlist.net/ は無料のAPIを提供します。カード番号の最初の6桁または8桁、つまり、以前は銀行識別番号(BIN)と呼ばれていた発行者識別番号(IIN)のみを入力する必要があります。
curl -H "Accept-Version: 3" "https://lookup.binlist.net/45717360"
(より具体的な質問からクロスポスト: デビットカードとクレジットカードの違いをどのように伝えるか )