クレジットカード番号があり、追加情報がない場合、PHP でその番号が有効な番号かどうかを判断する最適な方法は何ですか?
現時点では、American Express、Discover、MasterCard、Visa で機能するものが必要ですが、他のタイプでも機能すると便利かもしれません。
ベストアンサー1
カード番号の検証には 3 つの部分があります。
- パターン- 発行者のパターンと一致しているか(例:VISA/Mastercard など)
- チェックサム- 実際にチェックサムが実行されているか(例:AMEX カード番号にするために「34」の後の 13 個のランダムな数字だけを並べるわけではない)
- 本当に存在する- 実際に関連付けられたアカウントがありますか(販売者アカウントがなければこれを取得することはほとんど不可能です)
パターン
- MASTERCARD プレフィックス=51-55、長さ=16 (Mod10 チェックサム)
- VISA プレフィックス=4、長さ=13 または 16 (Mod10)
- AMEX プレフィックス=34 または 37、長さ=15 (Mod10)
- ダイナースクラブ/カルテ プレフィックス=300-305、36 または 38、長さ=14 (Mod10)
- 検出プレフィックス=6011,622126-622925,644-649,65、長さ=16、(Mod10)
- など(接頭辞の詳細なリスト)
チェックサム
ほとんどのカードはチェックサムに Luhn アルゴリズムを使用します。
Wikipedia で説明されている Luhn アルゴリズム
Wikipedia リンクには、PHP を含む多くの実装へのリンクがあります。
<?
/* Luhn algorithm number checker - (c) 2005-2008 shaman - www.planzero.org *
* This code has been released into the public domain, however please *
* give credit to the original author where possible. */
function luhn_check($number) {
// Strip any non-digits (useful for credit card numbers with spaces and hyphens)
$number=preg_replace('/\D/', '', $number);
// Set the string length and parity
$number_length=strlen($number);
$parity=$number_length % 2;
// Loop through each digit and do the maths
$total=0;
for ($i=0; $i<$number_length; $i++) {
$digit=$number[$i];
// Multiply alternate digits by two
if ($i % 2 == $parity) {
$digit*=2;
// If the sum is two digits, add them together (in effect)
if ($digit > 9) {
$digit-=9;
}
}
// Total up the digits
$total+=$digit;
}
// If the total mod 10 equals 0, the number is valid
return ($total % 10 == 0) ? TRUE : FALSE;
}
?>