You are here

function pay_method_gateway::set_cc_number in Pay 7

Same name and namespace in other branches
  1. 6 includes/handlers/pay_method_gateway.inc \pay_method_gateway::set_cc_number()

File

includes/handlers/pay_method_gateway.inc, line 178
The base class for credit card payment activities.

Class

pay_method_gateway
@file The base class for credit card payment activities.

Code

function set_cc_number($val) {
  $this->cc_number = preg_replace('/[^\\d]/', '', $val);

  // Set the credit card type rather than relying on user input.
  $orig_cc_type = $this->cc_type;
  $this->cc_type = NULL;
  $prefix1 = substr($this->cc_number, 0, 1);
  $prefix2 = substr($this->cc_number, 0, 2);
  $prefix3 = substr($this->cc_number, 0, 3);
  $prefix4 = substr($this->cc_number, 0, 4);
  $prefix5 = substr($this->cc_number, 0, 5);
  $prefix6 = substr($this->cc_number, 0, 6);

  /**
   * References: http://www.beachnet.com/~hstiles/cardtype.html
   */
  switch ($prefix1) {
    case 1:

      // JCB: prefix 1800, length 15
      if ($prefix4 == 1800) {
        $this->cc_type = 'jcb';
      }
      break;
    case 2:

      // JCB: prefix 2131, length 15
      if ($prefix4 == 2131) {
        $this->cc_type = 'jcb';
      }
      elseif ($prefix4 == 2014) {
        $this->cc_type = 'enroute';
      }
      elseif ($prefix4 == 2149) {
        $this->cc_type = 'enroute';
      }
      break;
    case 3:

      // Diners Club: prefix 300-305, length 14
      if (in_array($prefix3, array(
        300,
        301,
        302,
        303,
        304,
        305,
      ))) {
        $this->cc_type = 'diners';
      }
      elseif (in_array($prefix2, array(
        34,
        37,
      ))) {
        $this->cc_type = 'amex';
      }
      elseif (in_array($prefix2, array(
        36,
        38,
      ))) {
        $this->cc_type = 'diners';
      }
      else {
        $this->cc_type = 'jcb';
      }
      break;
    case 4:

      // Visa: prefix 4, length 13, 16
      $this->cc_type = 'visa';

      // Switch: prefix 4903, 4905, 4911, 4936
      if (in_array($prefix4, array(
        4903,
        4905,
        4911,
        4936,
      ))) {
        $this->cc_type = 'switch';
      }
      break;
    case 5:

      // Mastercard: prefix 51-55, length 16
      if (in_array($prefix2, array(
        51,
        52,
        53,
        54,
        55,
      ))) {
        $this->cc_type = 'mc';
      }

      // Switch: prefix 564182
      if ($prefix6 == 564182) {
        $this->cc_type = 'switch';
      }

      // Maestro: prefix 5018, 5020, 5038
      if (in_array($prefix4, array(
        5018,
        5020,
        5038,
      ))) {
        $this->cc_type = 'maestro';
      }
      break;
    case 6:

      // Discover: prefix 6011, length 16
      if ($prefix4 == 6011) {
        $this->cc_type = 'discover';
      }

      // Laser: prefix 6304 or 6706 or 6709 or 6771, length 19
      if ($prefix4 == 6304 || $prefix4 == 6706 || $prefix4 == 6709 || $prefix4 == 6771) {
        $this->cc_type = 'laser';
      }

      // Switch: prefix 633110, 6333, 6759,
      if ($prefix6 == 633110 || $prefix4 == 6333) {
        $this->cc_type = 'switch';
      }

      // Maestro: prefix 6759, 6761, 6763
      if (in_array($prefix4, array(
        6759,
        6761,
        6763,
      ))) {
        $this->cc_type = 'maestro';
      }

      // Solo: prefix 6334 or 6767
      if ($prefix4 == 6334 || $prefix4 == 6767) {
        $this->cc_type = 'solo';
      }
      break;
  }

  // Only if we still fail to determine card type, reset it to user supplied
  // value.
  if (empty($this->cc_type)) {
    $this->cc_type = $orig_cc_type;
  }
}