Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1

    Validare le carte di credito

    Esiste qualche funzione o qualcosa che valida una carta di credito?
    Qualcosina l'ho trovata su internet ma non sono sicuro siano buoni.

    Vorrei fare qualcosa tipo i siti di booking o venere che l'utente mette i dati della carta per garantire la prenotazione ma senza prelevare.

    C'e' per forza bisogno della banca oppure ci si puo' avvalere di qualche validatore di carte?
    Mai dire Mai

  2. #2
    Il controllo della validità (fittizia) della carta di credito te lo puoi implementare con una regexp.
    Devi sapere che ogni tipo di carta (Visa, Mastercard, American Express ecc), prevede una disposizione delle cifre diversa dalle altre.
    Se non ricordo male, per esempio, le carte VISA prevedono 15 cifre, mentre la mastercard 16.
    Dovresti quindi implementare nella form anche un radio button che indichi che tipo di carta stai controllando, quindi indirizzare verso la giusta regexp di controllo.

    Ho però sottolineato validità fittizia della card.
    Tu puoi andare a controllare che la carta abbia un numero che corrisponda a quanto ci si aspetti.... se poi la carta è clonata oppure inesistente, solo la banca te lo può dire.

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  3. #3
    si su questo sono d'accordissimo con te, pero' a quanto pare anche i siti tipo booking.com o venere o altri non fanno alcun controllo tramite banca ma solo qualche controllo sulla carta e sulla sua validazione.
    Ho trovato un po' di script in rete che ti fanno questi controlli, per esempio per le VISA deve partire con il numero 4 ed avere 16 cifre e qualche altra cosa, cosi' come per le altre carte.

    Sono sicuro di questa cosa che venere non fa grossi controlli in quanto un amico riceveva prenotazioni proprio da venere con carte di credito non vere perche' le controllava con il pos.

    Per questo volevo capire se esisteva un software, ma anche a pagamento che non sia eccessivo, che mi faccia questi controlli e confermi le prenotazioni solo se la carta di credito e' corretta.
    Mai dire Mai

  4. #4
    Forse non ho capito cosa ti serve, ma una volta che mi dici che hai trovato il modo per impostare le regexp, e che non hai grosse necessità di stare a fare controlli, cosa ci fai con un software più o meno free per fare la stessa operazione?
    Ad ogni modo, ho sentito parlare bene del modulo di OsCommerce.
    Puoi provare a scaricarti il CMS e vedere come implementarlo nella tua applicazione.

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  5. #5
    Utente di HTML.it L'avatar di henry78
    Registrato dal
    May 2001
    Messaggi
    1,264
    function checkCreditCard ($cardnumber, $cardname, &$errornumber, &$errortext) {

    $cards = array ( array ('name' => 'American Express',
    'length' => '15',
    'prefixes' => '34,37',
    'checkdigit' => true
    ),
    array ('name' => 'Carte Blanche',
    'length' => '14',
    'prefixes' => '300,301,302,303,304,305,36,38',
    'checkdigit' => true
    ),
    array ('name' => 'Diners Club',
    'length' => '14',
    'prefixes' => '300,301,302,303,304,305,36,38',
    'checkdigit' => true
    ),
    array ('name' => 'Discover',
    'length' => '16',
    'prefixes' => '6011',
    'checkdigit' => true
    ),
    array ('name' => 'Enroute',
    'length' => '15',
    'prefixes' => '2014,2149',
    'checkdigit' => true
    ),
    array ('name' => 'JCB',
    'length' => '15,16',
    'prefixes' => '3,1800,2131',
    'checkdigit' => true
    ),
    array ('name' => 'Maestro',
    'length' => '16,18',
    'prefixes' => '5020,6',
    'checkdigit' => true
    ),
    array ('name' => 'MasterCard',
    'length' => '16',
    'prefixes' => '51,52,53,54,55',
    'checkdigit' => true
    ),
    array ('name' => 'Solo',
    'length' => '16,18,19',
    'prefixes' => '6334,6767',
    'checkdigit' => true
    ),
    array ('name' => 'Switch',
    'length' => '16,18,19',
    'prefixes' => '4903,4905,4911,4936,564182,633110,6333,6759',
    'checkdigit' => true
    ),
    array ('name' => 'Visa',
    'length' => '13,16',
    'prefixes' => '4',
    'checkdigit' => true
    ),
    array ('name' => 'Visa Electron',
    'length' => '16',
    'prefixes' => '417500,4917,4913',
    'checkdigit' => true
    )
    );

    $ccErrorNo = 0;

    $ccErrors [0] = "Unknown card type";
    $ccErrors [1] = "No card number provided";
    $ccErrors [2] = "Credit card number has invalid format";
    $ccErrors [3] = "Credit card number is invalid";
    $ccErrors [4] = "Credit card number is wrong length";

    // Establish card type
    $cardType = -1;
    for ($i=0; $i<sizeof($cards); $i++) {

    // See if it is this card (ignoring the case of the string)
    if (strtolower($cardname) == strtolower($cards[$i]['name'])) {
    $cardType = $i;
    break;
    }
    }

    // If card type not found, report an error
    if ($cardType == -1) {
    $errornumber = 0;
    $errortext = $ccErrors [$errornumber];
    return false;
    }

    // Ensure that the user has provided a credit card number
    if (strlen($cardnumber) == 0) {
    $errornumber = 1;
    $errortext = $ccErrors [$errornumber];
    return false;
    }

    // Remove any spaces from the credit card number
    $cardNo = str_replace (' ', '', $cardnumber);

    // Check that the number is numeric and of the right sort of length.
    if (!eregi('^[0-9]{13,19}$',$cardNo)) {
    $errornumber = 2;
    $errortext = $ccErrors [$errornumber];
    return false;
    }

    // Now check the modulus 10 check digit - if required
    if ($cards[$cardType]['checkdigit']) {
    $checksum = 0; // running checksum total
    $mychar = ""; // next char to process
    $j = 1; // takes value of 1 or 2

    // Process each digit one by one starting at the right
    for ($i = strlen($cardNo) - 1; $i >= 0; $i--) {

    // Extract the next digit and multiply by 1 or 2 on alternative digits.
    $calc = $cardNo{$i} * $j;

    // If the result is in two digits add 1 to the checksum total
    if ($calc > 9) {
    $checksum = $checksum + 1;
    $calc = $calc - 10;
    }

    // Add the units element to the checksum total
    $checksum = $checksum + $calc;

    // Switch the value of j
    if ($j ==1) {$j = 2;} else {$j = 1;};
    }

    // All done - if checksum is divisible by 10, it is a valid modulus 10.
    // If not, report an error.
    if ($checksum % 10 != 0) {
    $errornumber = 3;
    $errortext = $ccErrors [$errornumber];
    return false;
    }
    }

    // The following are the card-specific checks we undertake.

    // Load an array with the valid prefixes for this card
    $prefix = split(',',$cards[$cardType]['prefixes']);

    // Now see if any of them match what we have in the card number
    $PrefixValid = false;
    for ($i=0; $i<sizeof($prefix); $i++) {
    $exp = '^' . $prefix[$i];
    if (ereg($exp,$cardNo)) {
    $PrefixValid = true;
    break;
    }
    }

    // If it isn't a valid prefix there's no point at looking at the length
    if (!$PrefixValid) {
    $errornumber = 3;
    $errortext = $ccErrors [$errornumber];
    return false;
    }

    // See if the length is valid for this card
    $LengthValid = false;
    $lengths = split(',',$cards[$cardType]['length']);
    for ($j=0; $j<sizeof($lengths); $j++) {
    if (strlen($cardNo) == $lengths[$j]) {
    $LengthValid = true;
    break;
    }
    }

    // See if all is OK by seeing if the length was valid.
    if (!$LengthValid) {
    $errornumber = 4;
    $errortext = $ccErrors [$errornumber];
    return false;
    };

    // The credit card is in the required format.
    return true;
    }
    /*================================================= ===========================*/




  6. #6
    Utente di HTML.it L'avatar di brodik
    Registrato dal
    Jan 2009
    Messaggi
    765
    forse intendi validare secondo la formula di luhn?

  7. #7
    Si questo codice qua bene o male dovrebbe essere proprio quella formula di luhn.

    Il problema e' che ti fa solo il controllo se hai messo delle cifre esatte e se inizia per 4 se si tratta di visa ecc

    Quello che dico io, booking, venere e altri siti famosi, fanno qualche altro controllo?
    Si collegano ad una banca?
    Mai dire Mai

  8. #8
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Come ti hanno detto, se non sei una banca o altro ente a cui è associato il gestore della carta di credito, tu puoi al massimo verificare che il numero inserito è coerente con l'algoritmo che regola la generazione dei numeri delle carte di credito, ma non puoi sapere se è una carta realmente in circolazione, se lo era ed è stata ritirata o quant'altro.

    Ad esempio, tu potresti riconoscere se io ti do il numero di una postepay coerente con il formato che da questa carta ci si aspetterebbe, io a questo punto potrei darti il numero di quella che mi è scaduta 3 mesi fa, ma per te è una carta valida perché non puoi sapere che è scaduta.

  9. #9
    Originariamente inviato da Alhazred
    Come ti hanno detto, se non sei una banca o altro ente a cui è associato il gestore della carta di credito, tu puoi al massimo verificare che il numero inserito è coerente con l'algoritmo che regola la generazione dei numeri delle carte di credito, ma non puoi sapere se è una carta realmente in circolazione, se lo era ed è stata ritirata o quant'altro.

    Ad esempio, tu potresti riconoscere se io ti do il numero di una postepay coerente con il formato che da questa carta ci si aspetterebbe, io a questo punto potrei darti il numero di quella che mi è scaduta 3 mesi fa, ma per te è una carta valida perché non puoi sapere che è scaduta.
    ma lo stesso lo fanno anche i siti famosi?
    oppure utilizzano qualche servizio per verificare se la carta e' attiva o meno?
    Mai dire Mai

  10. #10
    Per controllare se una carta è attiva va fatta una query al DB della banca. Si incrociano il nome, il cognome, la data di scadenza della carta e il numero della stessa e se tutto ritorna, si da l'OK al pagamento.
    Credo sia logico che tutte queste informazioni non DEVONO assolutamente essere accessibili da chiunque.

    I siti di cui tu parli, sicuramente ti permettono di inserire quei dati nel loro DB, per filtrarli e per creare una banca dati dei loro clienti, ma di sicuro per effettuare il pagamento si appoggiano poi ad un gateway messo a disposizione da un istituto di credito.

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.