Ipn paypal problema nella risposta

migo80

Utente Attivo
25 Apr 2013
224
3
18
Salve sto cercando di inserire in un sito su altervista un sistema di pagamento paypal con risposta.
Ma ho problemi con l' IPN mi da sempre esito invalid, qualcuno sa come farlo funzionare?
Per i test uso sanbox.
Allego il codice dell' istener:

PHP:
<?php 
// CONFIG: Enable debug mode. This means we'll log requests into 'ipn.log' in the same directory. 
// Especially useful if you encounter network errors or other intermittent problems with IPN (validation). 
// Set this to 0 once you go live or don't require logging. 
define("DEBUG", 1); 
// Set to 0 once you're ready to go live 
define("USE_SANDBOX", 1); 
define("LOG_FILE", "./ipn.log"); 
// Read POST data 
// reading posted data directly from $_POST causes serialization 
// issues with array data in POST. Reading raw POST data from input stream instead. 
$raw_post_data = file_get_contents('php://input'); 
$raw_post_array = explode('&', $raw_post_data); 
$myPost = array(); 
foreach ($raw_post_array as $keyval) { 
    $keyval = explode ('=', $keyval); 
    if (count($keyval) == 2) 
        $myPost[$keyval[0]] = urldecode($keyval[1]); 
} 
// read the post from PayPal system and add 'cmd' 
$req = 'cmd='.urlencode('_notify-validate'); 
if(function_exists('get_magic_quotes_gpc')) { 
    $get_magic_quotes_exists = true; 
} 
foreach ($myPost as $key => $value) { 
    if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) { 
        $value = urlencode(stripslashes($value)); 
    } else { 
        $value = urlencode($value); 
    } 
    $req .= "&$key=$value"; 
} 
// Post IPN data back to PayPal to validate the IPN data is genuine 
// Without this step anyone can fake IPN data 
if(USE_SANDBOX == true) { 
    $paypal_url = "https://www.sandbox.paypal.com/cgi-bin/webscr"; 
} else { 
    $paypal_url = "https://www.paypal.com/cgi-bin/webscr"; 
} 
$ch = curl_init($paypal_url); 
if ($ch == FALSE) { 
    return FALSE; 
} 
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $req); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); 
if(DEBUG == true) { 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLINFO_HEADER_OUT, 1); 
} 
// CONFIG: Optional proxy configuration 
//curl_setopt($ch, CURLOPT_PROXY, $proxy); 
//curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 
// Set TCP timeout to 30 seconds 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close')); 
// CONFIG: Please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path 
// of the certificate as shown below. Ensure the file is readable by the webserver. 
// This is mandatory for some environments. 
//$cert = __DIR__ . "./cacert.pem"; 
//curl_setopt($ch, CURLOPT_CAINFO, $cert); 
$res = curl_exec($ch); 
if (curl_errno($ch) != 0) // cURL error 
    { 
    if(DEBUG == true) {     
        error_log(date('[Y-m-d H:i e] '). " erro 1 Can't connect to PayPal to validate IPN message: " . curl_error($ch) . PHP_EOL, 3, LOG_FILE); 
    } 
    curl_close($ch); 
    exit; 
} else { 
        // Log the entire HTTP response if debug is switched on. 
        if(DEBUG == true) { 
            error_log(date('[Y-m-d H:i e] '). "erro 2 HTTP request of validation request:". curl_getinfo($ch, CURLINFO_HEADER_OUT) ." for IPN payload: $req" . PHP_EOL, 3, LOG_FILE); 
            error_log(date('[Y-m-d H:i e] '). "erro 3 HTTP response of validation request: $res" . PHP_EOL, 3, LOG_FILE); 
        } 
        curl_close($ch); 
} 
// Inspect IPN validation result and act accordingly 
// Split response headers and payload, a better way for strcmp 
$tokens = explode("\r\n\r\n", trim($res)); 
$res = trim(end($tokens)); 
if (strcmp ($res, "VERIFIED") == 0) { 
    // check whether the payment_status is Completed 
    // check that txn_id has not been previously processed 
    // check that receiver_email is your PayPal email 
    // check that payment_amount/payment_currency are correct 
    // process payment and mark item as paid. 
    // assign posted variables to local variables 
    //$item_name = $_POST['item_name']; 
    //$item_number = $_POST['item_number']; 
    //$payment_status = $_POST['payment_status']; 
    //$payment_amount = $_POST['mc_gross']; 
    //$payment_currency = $_POST['mc_currency']; 
    //$txn_id = $_POST['txn_id']; 
    //$receiver_email = $_POST['receiver_email']; 
    //$payer_email = $_POST['payer_email']; 
     echo "The response from IPN was: <b>" .$res ."</b>"; 
    // assign posted variables to local variables 
     
    $txn_id = $_POST['txn_id']; 
     echo $txn_id; 

    // IPN message values depend upon the type of notification sent. 
    // To loop through the &_POST array and print the NV pairs to the screen: 
    foreach($_POST as $key => $value) { 
      echo $key." = ". $value."<br>"; 
    } 
    if(DEBUG == true) { 
        error_log(date('[Y-m-d H:i e] '). "erro 4 Verified IPN: $req ". PHP_EOL, 3, LOG_FILE); 
    } 
} else if (strcmp ($res, "INVALID") == 0) { 
    // log for manual investigation 
    // Add business logic here which deals with invalid IPN messages 
      echo "non valido"; 
    if(DEBUG == true) { 
        error_log(date('[Y-m-d H:i e] '). "erro 5 Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE); 
    } 
} 
?>
 

filomeni

Moderatore
Membro dello Staff
MOD
14 Mag 2006
1.052
6
38
50
Roseto degli Abruzzi (TE)
www.sitiweb.cloud
Ciao, non capisco perchè hai fatto sta sorta de casino... Allora se devi fare dei test usi sandbox e va bene ma per eseguire un pagamento di test devi semplicemente puntare all'indirizzo che hai citato ed inserire in GET i dati utente:
Codice:
https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_xclick&address_override=1&bn=IT_ICM-WPS&business=tuo%40account&item_name=NOME_PRODOTTO_ACQUISTATO&itemNumber=NUMERO_ORDINE&amount=IL_PREZZO&currency_code=EUR&button_subtype=services&no_note=0&charset=UTF%2d8&first_name=<?php echo $nome ?>&last_name=<?php echo $cognome ?>&address1=<?php echo $via ?>&address2=&city=<?php echo $citta ?>&state=$pv&country=IT&zip=<?php echo $cap ?>&email=<?php echo $email ?>&no_shipping=1&return=http%3A%2F%2Fwww.tuosito.it%2Fphp%2FbackPaypal.php?ItemNumber=<?php echo  $code ?>&cancel_return=http%3A%2F%2Fwww.bookbox.it%2Findex.php?pay=0
tuo%40account: l'account pay pal dove ricevere il pagamento, l'indirizzo:backPaypal.php lo uso per ritornare al sito come conferma del pagamento, la variabile: cancel_return la usi per indirizzare l'utente se abbandona il pagamento.
Ciao