Domanda

Ho avuto problemi con il mio script ascoltatore Paypal IPN per un paio di giorni. Per quelli di voi che non hanno familiarità con il sistema Paypal IPN, fondamentalmente Paypal invia lo script con un messaggio circa la transazione, che si invia indietro con un paio di pezzi aggiunti. Se Paypal riceve la risposta corretta, sarà rispondere con 'VERIFICATO', e se non si dirà 'non valido'.

Inizialmente ho pensato che il problema che stavo vivendo era con il comando 'fsockopen': $ Fp = fsockopen ( 'ssl: //sandbox.paypal.com', 443, $ errno, $ errstr, 30); Tuttavia, dopo aver ridotto tutto il mio codice per praticamente solo questa linea, sembra collegare ok. Il problema arriva con il 'feof' e 'fgets' comandi. Lo script appena riaggancia, e io non so perché. Ho in sostanza copiato il codice suggerito sul sito Paypal IPN Listener, così ho pensato che avrebbe funzionato! Se potesse aiutarmi a capire il motivo per cui feof o fgets stanno causando lo stallo quindi il vostro aiuto sarebbe molto apprezzato.

Ecco lo script completo:

$postback = 'cmd=_notify-validate'; //doesn't matter what these include for now
$header='abc';

//Script has been activated, create debug
$filename = 'debug/debug1_script.txt';
$filehandle=fopen($filename, 'w');
fwrite($filehandle,$postback);
fclose($filehandle);


$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);//open the connection

//no connection, create debug file
if(!$fp){
    $filename = 'debug/debug2_fpfail.txt';
    $filehandle=fopen($filename, 'w');
    fwrite($filehandle, $errstr.'('.$errno.')');
    fclose($filehandle);
    die();
}


//post data back
fputs($fp, $header . $postback);

//create debug file
$filename = 'debug/debug3_postback.txt';
$filehandle=fopen($filename, 'w');
fwrite($filehandle, $header.$postback);
fclose($filehandle);


//script hangs with either of the two following lines included
while(!feof($fp)){
    $res=fgets($fp,1024);
}

Molte grazie in anticipo!

È stato utile?

Soluzione

Quindi penso che ho trovato una soluzione, che è stata invece di utilizzare il

while(!feof())

e

fgets()

combo, ho usato questo:

$res=stream_get_contents($fp, 1024);

Ha lavorato prima volta! Ora posso andare avanti con la mia vita.

Altri suggerimenti

Per chi arriva qui da Google, non dimenticate di includere "Chiudere: Connessione" nelle intestazioni! In caso contrario, l'host mantenere aperta la connessione fino a quando il tempo è scaduto!

Se qualcun altro ha lo stesso problema, CURL sembra essere la scelta per IPN consigliare da PayPal.

Scopri là di codice su Github a: https: / /github.com/paypal/ipn-code-samples/blob/master/paypal_ipn.php

La parte posteriore di collegamento a PayPal dal vostro zoccolo $fp deve essere un post HTTP. feof() si blocca perché PayPal non sente una richiesta HTTP completo, in modo che non invia mai indietro nulla -. mantiene solo ad ascoltare fino a quando si rinuncia

È necessario il materiale extra (la $header finito e variabili $req) nel codice di esempio su questo paypal IPN pagina .

vorrei riscrivere questa opzione per utilizzare CURL se è possibile, invece di socket raw, in modo da non dover formattare la richiesta HTTP completa e leggere una risposta HTTP grezzo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top