クレジットカードのチェックサンプル概要
クレジットカード情報の番号が正しいか確認できるアルゴリズムを見つけたのでPHPで実装してみました。
外部への通信は行なわないので、ブラックリストなどオーソリチェックはクレジットカード会社に任せるとして、入力された数字がクレジットカード番号で正しいかチェックします。
試す場合は、ローカルにて実装してからご確認下さい。
正規表現でチェックする方法もありますが、
今回行なっているのは数値チェックと、クレジットカードのアルゴリズムのチェックだけです。
あとは桁数チェックとかあれば尚よいかも。
クレジットカード番号の意味
1)最初の1桁:主要産業識別子 (MII:Major industry identifier)
カード発行者の業界を表します。
0 予備
1、2 航空
3 旅行・娯楽
4、5 銀行・金融
6 商品輸送・銀行
7 石油
8 通信
9 国ごとの割り当て分
2)MIIを含む最初6桁:発行者識別番号(IIN:Issuer Identifier Number)
カード発行者の身元を表します。
[主要クレジットカードのIIN]
Visa 4xxxxx
Mastercard 51xxxx – 55xxxx
Discover 6011xx, 644xxx, 65xxxx
Amex 34xxxx, 37xxxx
3)7桁目以降、最後1桁の前の数まで:カード口座番号
コンビネーションは1兆通り。
4)最後の1桁:チェックディジット、別名チェックサム
そのクレジットカードの番号が有効かどうかLuhnアルゴリズムで認証するとき使います。
クレジットカードチェックサンプル
<?php
function checkCard(){
//変数の初期化
$card = "";
$check = "";
//クレジットカードのタイプ 最初の一桁
$type = array(0=>"予備",1=>"航空",2=>"航空",3=>"旅行・娯楽",4=>"銀行・金融",5=>"銀行・金融",6=>"商品輸送・銀行",7=>"石油",8=>"通信",9=>"国ごとの割り当て分");
//ポストデータをエスケープ
$_POST = array_map("htmlspecialchars",$_POST);
//データを一つにまとめる
for( $i = 1; $i <= 4; $i++ ){
$card .= $_POST["card_".$i];
}
//数値以外はエラーを返す。
if( !is_numeric( $card ) ){
return "半角数字で入力してください。";
}
//文字列を配列に分解
$card = str_split($card);
//数字の数だけループする
for( $i = 0; $i < 16; $i++ ){
//奇数の場合のみ2倍する
if( $i % 2 == 0 ) {
$card[$i] = $card[$i] * 2;
}
//2桁の場合は分割して足す
if( mb_strlen( $card[$i] ) != 1 ){
$split = str_split($card[$i]);
$card[$i] = $split[0] + $split[1];
}
$check += $card[$i];
}
if( $check % 10 == 0 ){
return "<font color='blue'>正しいクレジットカード番号です。<br />このカードは「".$type[$card[0]]."」で使われるカードです。</font>";
}else{
return "<font color='red'>クレジットカードが無効です。</font>";
}
}
まとめ
APIなどでクレジットカード会社に与信チェックするときにお金がかかる場合がありますが、
これを実装しておけばある程度はAPIを叩く回数が減るので節約になるかも知れませんね。
また、全てのクレジットカードで確認してないので、
だめだった場合は、コメントに内容を書いていただけると修正します!
Developer Hack 
クレジットカードチェックサンプル、参考にさせていただきました。ありがとうございます。
ただそのままのソースではAmericanExpress(AMEX)カードが正しくチェックできませんでした。
(AMEXは先頭に0をつけて16桁にして、ようやくチェックが通りました)
カード番号の文字数をチェックして右から計算していくことで
全てのカードに対応できるかと存じます。