Hey Leude,
ich hab da ein kleines Problem.Ich habe in einem PHP Buch einen Kreditkarten Check gefunden und ihn auf einer Webseite eingebaut.Leider enthällt dieser Check nur die Karten Amex,Eurocard,Discover und Visa.
Nun wollte ich ihn noch für DINERSCLUB und JBC erweitern, und hab mir das Script nochmal vorgeknöpft,leider ohne Erfolg
Das Script erledigt nur einen Check auf Prüfsumme und korrekte Länge der Karten,da diese bei jedem Anbieter jedoch verschieden sind, gestaltet es sich doch ein wenig komplizierter.
Hat jemand so was schon mal gemacht bzw. Erfahrung in solchen Sachen und kann mir weiterhelfen?
Hier ist das Script:
001: <?php
function validateCC($ccnum, $type = ''){
// Eingabe von Leerzeichen befreien
$type = strtolower($type);
$ccnum = preg_replace( '/[-[:space:]]/', '', $ccnum);
if (strlen($ccnum) == 0) return FALSE;
// Test des Kartentyps
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':
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;
}
// Starte MOD 10-Tests
$dig = 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 = 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 zurück
function CharToArray($input) {
$char = preg_split('//', $input);
array_pop($char);
array_shift($char);
return ($char);
}
echo 'Prüfe "' . $ccnumber . '"<br>';
echo validateCC($ccnumber, $cctype) ? 'Nummer ist gültig' : 'Nummer ist nicht gültig';
?>
002: <form action="$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 value="amex">American Express
<option value="visa">VISA
<option value="mastercard">MasterCard
<option value="discover">Discover
</select>
<input type="Submit" value="Prüfen">
</form>
ich hab da ein kleines Problem.Ich habe in einem PHP Buch einen Kreditkarten Check gefunden und ihn auf einer Webseite eingebaut.Leider enthällt dieser Check nur die Karten Amex,Eurocard,Discover und Visa.
Nun wollte ich ihn noch für DINERSCLUB und JBC erweitern, und hab mir das Script nochmal vorgeknöpft,leider ohne Erfolg
![Frown](https://www.php-resource.de/forum/core/images/smilies/frown.gif)
Das Script erledigt nur einen Check auf Prüfsumme und korrekte Länge der Karten,da diese bei jedem Anbieter jedoch verschieden sind, gestaltet es sich doch ein wenig komplizierter.
Hat jemand so was schon mal gemacht bzw. Erfahrung in solchen Sachen und kann mir weiterhelfen?
Hier ist das Script:
001: <?php
function validateCC($ccnum, $type = ''){
// Eingabe von Leerzeichen befreien
$type = strtolower($type);
$ccnum = preg_replace( '/[-[:space:]]/', '', $ccnum);
if (strlen($ccnum) == 0) return FALSE;
// Test des Kartentyps
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':
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;
}
// Starte MOD 10-Tests
$dig = 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 = 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 zurück
function CharToArray($input) {
$char = preg_split('//', $input);
array_pop($char);
array_shift($char);
return ($char);
}
echo 'Prüfe "' . $ccnumber . '"<br>';
echo validateCC($ccnumber, $cctype) ? 'Nummer ist gültig' : 'Nummer ist nicht gültig';
?>
002: <form action="$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 value="amex">American Express
<option value="visa">VISA
<option value="mastercard">MasterCard
<option value="discover">Discover
</select>
<input type="Submit" value="Prüfen">
</form>