目次
クレジットカードのチェックサンプル概要
クレジットカード情報の番号が正しいか確認できるアルゴリズムを見つけたので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を叩く回数が減るので節約になるかも知れませんね。
また、全てのクレジットカードで確認してないので、
だめだった場合は、コメントに内容を書いていただけると修正します!
クレジットカードチェックサンプル、参考にさせていただきました。ありがとうございます。
ただそのままのソースではAmericanExpress(AMEX)カードが正しくチェックできませんでした。
(AMEXは先頭に0をつけて16桁にして、ようやくチェックが通りました)
カード番号の文字数をチェックして右から計算していくことで
全てのカードに対応できるかと存じます。