PHP/Kreditkartenprüfung

Aus Mikiwiki
< PHP
Zur Navigation springen Zur Suche springen

Die Klasse "CCCheck" prüft Kreditkartennummern auf Vollständigkeit und richtige Prüfziffer. Dies erlaubt zumindest schon eine erste Vorabprüfung auf Tippfehler oder offensichtliche Betrugsversuche bei einem Online-Shop. Damit kann vermieden werden, dass zuviele fehlerhafte Abfragen an ein Zahlungsgateway geschikt werden, was unter Umständen auch Kosten sparen kann.

Die Methode "validateCC" führt die eigentliche Aktion aus. Sie verwendet den Mod10-Algorithmus zur Prüfung und wird wie folgt verwendet. Die Variable "$number" enthält die zu prüfende Kreditkartennummer, "$type" den Kreditkartentyp ("visa", "mastercard", "discover" oder "amex"). Die Methode gibt im Erfolgsfall "TRUE" zurück, sonst "FALSE" oder "-1", wenn der Kartentyp nicht richtig ist.

$cc = new CCheck();
$ok = $cc->validateCC($number, $type);
<?php
class CCCheck
{
  public function validateCC($ccnum,  $type = '')
  {  
    $type  = strtolower($type);
    ## Eingabe von Leerzeichen befreien
    $ccnum = preg_replace("/[-[:space:]]/", "", $ccnum);
    if (strlen($ccnum) == 0)
    {
      return FALSE;
    }
    ## Test jeden Kartentyps individuell auf vollständige Nummer. Dabei
    ## ist die Länge der Nummer und die Methode der Prüfzifferberechnung
    ## zu berücksichtigen. Zudem beginnen alle Kreditkartennummern mit
    ## einer typischen Ziffernfolge.
    switch ($type) 
    {
      case "":
        break;
      case "visa":
        if (strlen($ccnum) != 13 and strlen($ccnum) != 16 or substr($ccnum, 0, 1) != "4") 
        { 
          return  FALSE;
        }
        break;
      case "mastercard":
        if (strlen($ccnum) != 16 || !preg_match("/^5[1-5]/", $ccnum))
        {
          return FALSE;
        }
        break;
      case "amex":
        ## American Express-Karten beginnen immer mit "34" oder "37"
        if (strlen($ccnum) != 15 || !preg_match("/^3[47]/", $ccnum))
        {
          return FALSE;
        }  
        break;
      case "discover":
        if (strlen($ccnum) != 16 || substr($ccnum, 0, 4) == "6011")
        {
          return FALSE;
        }
        break;
      default:
        return FALSE;
    }        
    ## Berechnung der Prüfziffern nach dem Mod10-Verfahren.
    $dig = $this->CharToArray($ccnum);
    $numdig = sizeof($dig);
    for ($i = ($numdig-2), $j = 0 ; $i >= 0; $i -= 2, $j++) 
    {
      $dbl[$j] = $dig[$i] * 2;
    }
    $dblsz    = sizeof($dbl);
    $validate = 0;
    for ($i = 0; $i < $dblsz; $i++)
    {
      $add = $this->CharToArray($dbl[$i]);
      for ($j = 0; $j < sizeof($add); $j++)
      {
        $validate += $add[$j];  
      }
      $add = "";  
    }
    for ($i = ($numdig-1); $i >= 0; $i -= 2)
    {
      $validate += $dig[$i];
    }
    if (substr($validate, -1, 1) == "0")  
      return  TRUE;
    else
      return  FALSE;
  }

  ## Diese Funktion gibt eine Zeichenkette als Array aus 
  ## Zeichen zurück
  private function CharToArray($input)
  {
    $char = preg_split("//", $input);
    array_pop($char);
    array_shift($char);
    return ($char);
  }
}

## Anlegen einer Instanz der Klasse "CCCheck".
$cc = new CCCheck();
if (isset($_POST['ccnumber']) && isset($_POST['cctype']))
{
  $ccnumber = $_POST['ccnumber'];
  $cctype   = $_POST['cctype'];
  echo "Prüfe \"" . $ccnumber . "\"<br />\n";
  ## Aufruf der Methode "validateCC"
  echo $cc->validateCC($ccnumber, $cctype) ? "Nummer ist gültig" : "Nummer ist nicht gültig";
}
?>
<!-- Formular verlangt Angabe der zu prüfenden Kreditkartennummer
     und den Kartentyp -->
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
  Nummer zu Prüfen: <input type="Text" maxlength="20" name="ccnumber">
  <select name="cctype">
    <option value="">- Wählen Sie den Kartentyp -</option>
    <option value="amex">American Express</option>
    <option value="visa">VISA</option>
    <option value="mastercard">MasterCard</option>
    <option value="discover">Discover</option>
  </select>
  <input type="Submit" value="Prüfen">
</form>