5

この説明のつかないことは、おそらく何千人ものウェブマスターに影響を与えるか、影響を与えるでしょう。

問題は、Paypal がこの要求にまったく応答しないことです。以下は、私が使用するサンプル コードとプログラマーのコメントです。

注文日 - 5 回繰り返されました。なんで?これは、PayPal がこのスクリプトの IPN を 5 回試みましたが、成功しなかったことを意味するだけです。HTTP を 1.0 に更新してスクリプトを再アップロードした場合にのみ、PayPal から「VERIFIED」応答が表示されました。その後も、PayPal は引き続き問い合わせを行っていました。HTTP = 1.1 の場合、PayPal はすべてを適切に取得していますが、適切に応答していないようです。その後、何らかの理由で、同じ支払いに対してさらに別の応答を作成するために戻ります。HTTP 1.0 では、すべてが花のようなものです。1 つの要求、1 つの応答ですべてが機能します。何が悪いのかわからない... 0 スクリプトを再アップロードしました。その後も、PayPal は引き続き問い合わせを行っていました。HTTP = 1.1 の場合、PayPal はすべてを適切に取得していますが、適切に応答していないようです。その後、何らかの理由で、同じ支払いに対してさらに別の応答を作成するために戻ります。HTTP 1.0 では、すべてが花のようなものです。1 つの要求、1 つの応答ですべてが機能します。何が悪いのかわからない... 0 スクリプトを再アップロードしました。その後も、PayPal は引き続き問い合わせを行っていました。HTTP = 1.1 の場合、PayPal はすべてを適切に取得していますが、適切に応答していないようです。その後、何らかの理由で、同じ支払いに対してさらに別の応答を作成するために戻ります。HTTP 1.0 では、すべてが花のようなものです。1 つの要求、1 つの応答ですべてが機能します。何が悪いのかわからない...

Ps。「INVALID」応答について話しているのではありません。「INVALID」応答は実際には成功の一部ですが、HTTP 1.1 の場合、PayPal は応答をまったく提供せず、空の文字列です。」

<?php

$req = 'cmd=_notify-validate';
$r='';

foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
$r.="{$key}: {$value}\n";
}

// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: www.paypal.com\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);
#I also tried: $fp =fsockopen('ssl://www.paypal.com',443,$err_num,$err_str,30);

if (!$fp) {
$r.="----\nHTTP ERROR\n";
// HTTP ERROR
} else {

$r.="----\nReceived IPN request\n";

fputs ($fp, $header . $req);

while (!feof($fp)) {
$res = fgets ($fp, 1024);
}
fclose ($fp);

if (strcmp ($res, 'VERIFIED') == 0) {

$proceed=TRUE;

}
else{
$proceed=FALSE;
}
}

?>

PS。これは、notify_url使用するスクリプトの一部です。

<input type="hidden" name="notify_url" value="{$main_url}/index.php?action=ipn&amp;user_id={$user_id}" />

サンドボックスでテストされたとき、それは機能しています..

4

7 に答える 7

12

これを変える:

// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: www.paypal.com\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);
#I also tried: $fp =fsockopen('ssl://www.paypal.com',443,$err_num,$err_str,30);

これに:

// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: www.paypal.com\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n";
$header .= "Connection: close\r\n\r\n";
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

この:

if (strcmp ($res, 'VERIFIED') == 0) {

これに:

if (strcmp (trim($res), 'VERIFIED') == 0) {

そして、それは動作することがほぼ保証されています。

PayPal が応答で Connection: keep-alive ヘッダーを送信するため、現在のセットアップは失敗します。これは fsockopen が喜んで受け入れるため、接続を開いたままにします。
一方、cURL などの HTTP ライブラリは、接続を自動的に閉じます。

私の一般的な提案は次のとおりです。PayPal に送信されるすべてのビットを制御したくない場合は、単純な TCP 接続である fsockopen ではなく、cURL などの HTTP ライブラリを使用してください。(PayPal には、https://www.paypal.com/ipnおよびhttps://www.paypal.com/pdt
で入手可能な cURL を使用したサンプル コードがあります)

于 2012-09-18T21:53:25.787 に答える
2

上記のコードでは、次のように置き換えることができます。

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

if (strcmp (trim($res), "VERIFIED") == 0) { 

唯一の違いはトリムです

于 2012-09-26T09:01:25.850 に答える
1

これを見つけましたhttp://www.justmyusecase.com/2012/09/subject-action-required-update-your.html

「検証済み」文字列をトリミングするだけでよいようです。

于 2012-09-18T19:21:40.823 に答える
0

2012 年 12 月中旬以降、PayPal から IPN を受け取りませんでした。それ以来、PayPal が IPN を送信しようとしていることを示すエントリは、Web サーバー アクセスまたはエラー ログにありません。

それで、今日、ドイツのペイパルサポートに電話しました(2時間以上待った後、ようやく誰かに連絡しました)。

彼らは私に、いくつかのアカウントに問題があり (IPN が送信されない)、それを修正しようとしていることを確認しました。したがって、スクリプトを変更する前に、まずサーバー ログ ファイルに注意してください。

于 2013-01-23T12:51:16.493 に答える
0

まあ、私は私のIPNに似たようなものを持っていました

試してみて、PayPal で IPN エンコーディングを変更してください

アカウント => プロフィール => 販売ツール => 言語エンコード

于 2013-02-10T21:57:44.147 に答える
-1

私もこの問題を抱えており、PP は問題があることを認めません。どうなるかわかりませんが、4ヶ月でお客様が激怒します。

変更する必要があるのは次のとおりです。

$header .= "POST /cgi-bin/webscr HTTP/1.1\r\n"; // wrong  
$header .= "POST cgi-bin/webscr HTTP/1.1\r\n"; // right (according to PP)
于 2012-09-18T18:38:41.540 に答える