PHP Credit Card Validator – Class

If you ever need to validate credit card numbers, here is a simple validator class. Of course you can use it as simple as just defining validation rules in one array and use the php biult-in preg_match function to validate. But for the sake of good OOP practice, we need a class :) . Well, i hope that this will help you. So, first we create the validator class:

<?php
class CreditCardValidator
{
    /**
     * Holds all the rules in case we need to extend the validator class
     *
     * @var array
     */
    private $rules = array();

    /**
     * Validator class constructor
     *
     * @author  [email protected]
     * @since   May 2, 2012
     */
    public function __construct()
    {
        $this->setCreditCardRules();
    }

    /**
     * Set the rules for credit card validation
     *
     * @author  [email protected]
     * @since   May 2, 2012
     */
    private  function setCreditCardRules()
    {
        $this->rules['creditCard'] = array(
            'amex'     => '/^3[4|7]\\d{13}$/',
            'bankcard' => '/^56(10\\d\\d|022[1-5])\\d{10}$/',
            'diners'   => '/^(?:3(0[0-5]|[68]\\d)\\d{11})|(?:5[1-5]\\d{14})$/',
            'disc'     => '/^(?:6011|650\\d)\\d{12}$/',
            'electron' => '/^(?:417500|4917\\d{2}|4913\\d{2})\\d{10}$/',
            'enroute'  => '/^2(?:014|149)\\d{11}$/',
            'jcb'      => '/^(3\\d{4}|2100|1800)\\d{11}$/',
            'maestro'  => '/^(?:5020|6\\d{3})\\d{12}$/',
            'mc'       => '/^5[1-5]\\d{14}$/',
            'solo'     => '/^(6334[5-9][0-9]|6767[0-9]{2})\\d{10}(\\d{2,3})?$/',
            'switch'   => '/^(?:49(03(0[2-9]|3[5-9])|11(0[1-2]|7[4-9]|8[1-2])|36[0-9]{2})' .
                          '\\d{10}(\\d{2,3})?)|(?:564182\\d{10}(\\d{2,3})?)|(6(3(33[0-4]' .
                          '[0-9])|759[0-9]{2})\\d{10}(\\d{2,3})?)$/',
            'visa'     => '/^4\\d{12}(\\d{3})?$/',
            'voyager'  => '/^8699[0-9]{11}$/',
            'fast'     => '/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|3' .
                          '(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})$/'
            );
    }

    /**
     * Get available rules for credit card validation. In case you need
     * them to pass to another object(s) and you don't want to use
     * the validator
     *
     * @author  [email protected]
     * @since   May 2, 2012
     * @return  array
     */
    public function getCreditCardRules()
    {
        return $this->rules['creditCard'];
    }

    /**
     * The validator
     *
     * @author  [email protected]
     * @since   May 2, 2012
     * @param   string $cardType Card type as defined in setCreditCardRules()
     * @param   numeric $cardNumber Credit card number
     * @throws  \Exception
     */
    public function isValid($cardType, $cardNumber)
    {
        if(!isset($this->rules['creditCard'][$cardType]))
        {
            throw new \Exception('Invalid card type');
        }

        return preg_match($this->rules['creditCard'][$cardType], $cardNumber);
    }

}
?>

Easy, no ? Using it is very, very simple:

<?php 
    $cardType    = 'mc'; // Master Card
    $cardNumber  = '5402051931858035'; // Card number
    $ccValidator = new CreditCardValidator();
    
    if($ccValidator->isValid($cardType, $cardNumber))
    {
        echo 'Credit card number is valid';
    }
    else
    {
        echo 'Invalid credit card number';
    }
?>

Hope it is useful for you. Cheers !

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

2 Comments

  • Turk
    18/10/2012 - 21:43 | Permalink

    This script does step one… NOT step two.

    Does not validate only matches patterns (regexpost.com)

    Example of visa validation: http://9gag.com/gag/2689757

    • admin
      28/10/2012 - 14:50 | Permalink

      It’s true Turk. Usually all you have to do is match patterns. The actual validation is made by the payment processor / payment gateway.

  • Leave a Reply

    Your email address will not be published. Required fields are marked *

    *


    − 3 = three

    You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>