クレジットカード全般のバリデーション
カード番号、セキュリティコード、有効期限のバリデーションについて
PHP
// カード番号
if (! preg_match('/^(4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|^(?:2131|1800|35\d{3})\d{11}$)$/', $str)) {
// エラー
}
// セキュリティコード(3~4桁の数字)
if (! preg_match('/^[0-9]{3,4}\z/', $str)) {
// エラー
}
// 有効期限(MMYY)
if (! preg_match('/^([0-9]{2})([0-9]{2})\z/', $str, $matches)) {
// エラー
} else {
$month = $matches[1];
$year = sprintf('20%s', $matches[2]);
// 日付妥当性
if (! checkdate($month, 1, $year)) {
// エラー
}
// 範囲
$expiration = mktime(0, 0, 0, $month, 1, $year);
// 過去の場合
$today = mktime(0, 0, 0, date('m'), 1, date('Y'));
if ($expiration < $today) {
// エラー
}
// 未来の場合(有効期限は最長10年程度?)
$future = mktime(0, 0, 0, date('m'), 1, date('Y') + 10);
if ($expiration > $future) {
// エラー
}
}
// 名義(大文字半角アルファベット 姓名の間にスペース)
if (! preg_match('/^[A-Z]+\s[A-Z]+\z/', $str)) {
// エラー
}
クレジットカード会社別のカード番号仕様
Finding or Verifying Credit Card Numbersを参照。
VISA
開始番号は4、全体で16桁(※古いカードの場合、13桁があり)
MasterCard
開始番号は51~55、全体で16桁
American Express
開始番号は34または37、全体で15桁
Diners Club
開始番号は300または305または36または38、全体で14桁
Discover
開始番号は6011または65、全体で16桁
JCB
開始番号は2131または1800、全体で15桁 または 開始番号は35、全体で16桁