0

まず、ご清聴ありがとうございました。問題になります。

この IPN リスナー コードを使用しています。

// IPN LISTENER
// intercetta le variabili IPN inviate da PayPal
$req = 'cmd=_notify-validate';     
// legge l'intero contenuto dell'array POST
foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}

// intestazione, prepara le variabili PayPal per la validazione
$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: www.sandbox.paypal.com\r\n";  // www.paypal.com for a live site
$header .= "Content-Length: " . strlen($req) . "\r\n";
$header .= "Connection: close\r\n\r\n";

// apre una connessione al socket PayPal
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

// converte le variabili inviate da IPN in variabili locali
$txn_id = filter_var($_POST['txn_id'], FILTER_SANITIZE_STRING);
$payment_status = filter_var($_POST['payment_status'], FILTER_SANITIZE_STRING);
$receiver_email = filter_var($_POST['receiver_email'], FILTER_SANITIZE_EMAIL);
$payer_email = filter_var($_POST['payer_email'], FILTER_SANITIZE_EMAIL);
$first_name = filter_var($_POST['first_name'], FILTER_SANITIZE_STRING);
$last_name = filter_var($_POST['last_name'], FILTER_SANITIZE_STRING);
$address_street = filter_var($_POST['address_street'], FILTER_SANITIZE_STRING);
$address_city = filter_var($_POST['address_city'], FILTER_SANITIZE_STRING);
$address_state = filter_var($_POST['address_state'], FILTER_SANITIZE_STRING);
$address_zip = filter_var($_POST['address_zip'], FILTER_SANITIZE_STRING);

// verifica l'apertura della connessione al socket
if (!$fp) {

    // se la connessione non avviene l'esecuzione dello script viene bloccata
print("connessione PayPal non avvenuta, si prega di riprovare piu' tardi");

    // in alternativa è per esempio possibile inviare un'email al venditore
} else {

    // elaborazione delle informazioni
    fputs ($fp, $header . $req);
    while (!feof($fp)) {
        $res = fgets ($fp, 1024);

        // azioni in caso di risposta positiva da parte di PayPal
        if (stripos($res, "VERIFIED") !== false) {
$myvariables = 1;
$anothermyvariables = "INSERT INTO MyDB ( paid, name, email, date) 
VALUES ('". $txn_id ."','" . $first_name ." ". $last_name .  "','" . $payer_email ."','". the_date('Y-m-d','','',FALSE) . "');";
$wpdb->query($anothermyvariables);
            }

        }

        // azione in caso di risposta negativa da parte di PayPal else
        if (stripos($res, "INVALID") !== false) {
$anothervariablesofmine = 2;
$paypalerr = "Pagamento non riuscito!"; // Payment not success!
        }

    }

    // chiusura della sorgente di dati
    fclose($fp);

以前は機能していましたが、現在は機能していません... PayPal が Web サイトに返す変数を と でテストしましvar_dumppayment_status=Completed。彼らは大丈夫そうです。

接続が確立されているかどうかをテストしましたが、それも機能します:

if (!$fp) {
ecc..
} else {
print("Connection Established");
etc....

問題は変数に付属していますstripos($res, "VERIFIED") stripos($res, "INVALID")var_dump両方を として返しますbool (false)

サンドボックス プロファイルの履歴 (買い手と売り手) を見ると、すべての取引結果が完了しています。しかし、私を夢中にさせるのは、1週間後には完全に機能することです... PayPalによるIPNリスナーポート、ホスト、または変数の変更について検索しましたが、何も変更されていないようです. 右?

IPN Listener を購入フォームのページに直接記述しました。これは、IPN Listener が$_POST変数なしでも呼び出されることを意味します。私にとって唯一可能な返信は、私をブロックした PayPal 側の IPN リスナーからのスパム保護です。それは可能ですか? Listener は なしでも呼び出されますcmd=_notify-validateが、単純に機能しません (ただし、おそらく PayPal にはあまり評価されない空の呼び出しが行われます)。

編集:

申し訳ありませんが、再デバッグしました(神のご加護をvar_dump)。whilevar_dumpループに入れたので:

....
        while (!feof($fp)) {
        $res = fgets ($fp, 1024);
var_dump(stripos($res, "VERIFIED"));
print("<br> VERIFIED". stripos($res, "VERIFIED") ."<br>");
var_dump(stripos($res, "INVALID"));
print("<br> INVALID". stripos($res, "INVALID") ."<br>");
...

VERIFIED int(0)代わりに1つを見つけますbool (false)

私はちょうど変わった

 if (stripos($res, "VERIFIED") !== false) {

 if (stripos($res, "VERIFIED") == 0) {

場合も同様だと思いますINVALID

しかし、これが正しいかどうかはまだわかりません。

それが問題でしたか?それとも、何か他のものを変更する必要がありますか? 両方のif条件 (if == 0if !== false) を使用する必要がありますか? PayPalVERIFIED戻り値を変更しましたか?

4

2 に答える 2

0

同様の問題があり、次のように修正されました。

時々、リスナーが cmd=_notify-validate をポストして新しい IPN を確認すると、「VERIFIED」または「INVALID」以外のメッセージが返されます。

時々私はこれを得る:

'8'.chr(13).chr(10).'検証済み'.chr(13).chr(10).'0'.chr(13).chr(10).chr(13).chr(10 )

時々私はこれを得る:

'00000008'.chr(13).chr(10).'検証済み'.chr(13).chr(10).'00000000'.chr(13).chr(10).chr(13).chr(10 )))

「VERIFIED」または「INVALID」に加えて、この 2 つの文字列を確認すれば問題ないと思います。そうでない場合は、stripos($res, "VERIFIED") および stripos($res, "INVALID") テストで不合格だったペイパルから返ってきたものを教えてください。

また、中間キャッシュや ISP からエラーが発生したり、paypal がタイムアウトしたりすることもあるので、後でその IPN に対して cmd=_notify-validate を実行して、コードを回復できるようにする必要があります。

最後に…私は長年 IPN システムと格闘していました。常に少し信頼性が低く、ドキュメンテーションにはいくつかの場所で深刻な誤りがあり、IPN はトランザクションに 15 分以上遅れることがよくあります。

API の TransactionSearch メソッドと GetTransactionDetails メソッドを使用する方がはるかに優れていることがわかりました。

ドキュメントはこちら:

https://developer.paypal.com/docs/classic/api/merchant/GetTransactionDetails_API_Operation_NVP/

https://developer.paypal.com/docs/classic/api/merchant/TransactionSearch_API_Operation_NVP/

これらは信頼性が高く、遅延がはるかに少ないです。これらの方法を使用して新しいトランザクションをチェックするために、15 分ごとに実行される cron ジョブがあります。また、IPN を受け取るたびに新しいトランザクション チェックを実行します。実装に関する詳細なガイダンスが必要な場合はお知らせください。

于 2015-07-01T10:12:28.537 に答える