【PHP】クレジットカードチェックサンプル

クレジットカードのチェックサンプル概要

クレジットカード情報の番号が正しいか確認できるアルゴリズムを見つけたので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を叩く回数が減るので節約になるかも知れませんね。

また、全てのクレジットカードで確認してないので、
だめだった場合は、コメントに内容を書いていただけると修正します!

0 0 votes
Article Rating
Subscribe
Notify of
guest

1 Comment
Inline Feedbacks
View all comments
clickpower

クレジットカードチェックサンプル、参考にさせていただきました。ありがとうございます。
ただそのままのソースではAmericanExpress(AMEX)カードが正しくチェックできませんでした。
(AMEXは先頭に0をつけて16桁にして、ようやくチェックが通りました)

カード番号の文字数をチェックして右から計算していくことで
全てのカードに対応できるかと存じます。

1
0
Would love your thoughts, please comment.x
()
x