1

このスクリプトに移動するように、Paypal アカウント通知 URL を設定しました。

    // Read the notification from PayPal which comes in the form of a POST array and create the acknowledgement response
    $req = 'cmd=_notify-validate';               // add 'cmd' to beginning of the acknowledgement you send back to PayPal

    foreach ($_POST as $key => $value) 
    { // Loop through the notification NV pairs
    $value = urlencode(stripslashes($value));  // Encode the values
    $req .= "&$key=$value";                    // Add the NV pairs to the acknowledgement
    }


    // Assign the paypal payment notification values to local variables
    if($_POST){
    $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'];}

    //Set up the acknowledgement request headers (this is the updated version for http 1.1)
    $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 .= "Connection: close\r\n";
    $header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
    //Open a socket for the acknowledgement request
    $fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);

    if(!$fp){
        echo "HTTP ERROR";
    }
    else
    {//start 1

    // Post request back to PayPal for validation
    fputs ($fp, $header . $req);

    //once paypal receives the acknowledgement response, another message will be send containing the single word VERIFIED or INVALID

    while (!feof($fp)) 
        { //start 2, while not EndOfFile
    $res = fgets ($fp, 1024); // Get the acknowledgement response
    $res = trim($res);
        if (strcmp ($res, "VERIFIED") == 0) 
            {// start 3, Response is OK

            if ($payment_status == "Completed")
                {//start 4

                //send email announcing success

                $from = "Rupert Heath Literary Agency";
                $to = $payer_email;
                $subject = "Ebook";
                $body = "It works";
                mail($to, $subject, $body, $from);

                }//end 4
            }//end 3
            else if(strcmp ($res, "INVALID") == 0)
                {//start 5

                //send email announcing failure
                //$error_log .= 'Line 57'

                $from = "Guide Test Page";
                $to = $payer_email;
                $subject = "INVALID IPN";
                $body = "Doesn't work";
                mail($to, $subject, $body, $from);
                }//end 5


    } //end 2
fclose ($fp);  //close file pointer
} //end 1

これは、Web でホストされている多くの例に基づいており、HTTP 1.1 へのアップグレードに対応しています。

このスクリプトは、テストとして、Paypal からの VERIFIED または INVALID 応答に応じて、成功または失敗のいずれかの電子メールを送信します。問題は、常に無効なメールを受け取り、その理由が理解できないことです。Paypal の IPN 履歴を調べたところ、HTTP 応答コードが 200 で、IPN 交換が正常に機能したことを示しているようです。おそらく Paypal は VERIFIED で応答していますが、スクリプトにエラーがあります。

IPN 履歴の詳細は次のとおりです。

即時支払い通知 (IPN) の詳細

メッセージ ID69025489S2598613V

作成日時 2013/07/18 23:22 PDT

オリジナル/再送信 オリジナル

最新の配信試行日時 2013 年 7 月 18 日 23:22 PDT

通知URL http://www.rupertheath.com/ipn/ipn_script

HTTP 応答コード 200

配送状況 発送済み

リトライ回数 0

トランザクション ID4D0877596N038120Y

IPNタイプ取引成立

IPN Message mc_gross=0.01&protection_eligibility=Eligible&address_status=confirmed&payer_id=C3USV8A4Q2QDW&tax=0.00&address_street=Ramsey House 34 Fowlers Road&payment_date=23:22:44 Jul 18, 2013 PDT&payment_status=Completed&charset=windows-1252&address_zip=SP1 2QU&first_name=Michael&mc_fee=0.01&address_country_code=GB&address_name=Michael Heath¬ify_version=3.7&custom=&payer_status=verified&business=emailagency@rupertheath.com&address_country=United Kingdom&address_city=Salisbury&quantity=1&verify_sign=AhKyCHsfiy2frgZNNoQmGHQ3LhKMAboweJqZzYCdqp30Hb7b99tF.04a&payer_email=msheath@btinternet.com&txn_id=4D0877596N038120Y&payment_type=instant&last_name=Heath&address_state=Wiltshire&receiver_email=emailagency@rupertheath.com&payment_fee=&receiver_id=BRM2TYMP4ACZ8&txn_type=web_accept&item_name=Ebook&mc_currency=GBP&item_number=&residence_country=GB&handling_amount=0.00&transaction_subject=Ebook&payment_gross=&shipping=0.00&ipn_track_id=b0a3b4ae3c51c

この問題のデバッグを手伝ってくれる人はいますか?

4

2 に答える 2

1

自分で再構築するのではなく、投稿された生データを使用することをお勧めします。これは私が個人的に使用しているコードで、これまでのところうまく機能しています。

file_get_contents(
    'https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate',
    false,
    stream_context_create(array(
        'http'=>array(
            'method'=>'POST',
            'header' => 'Content-Type: application/x-www-form-urlencoded',
            'content' => file_get_contents('php://input'),
        )
    ))
);

簡単に cURL に変換することもできます。

于 2013-07-19T07:13:38.057 に答える
0

この行の問題である可能性が非常に高いです:

$value = urlencode(stripslashes($value));

具体的には、stripslashesそこを使用します。stripslashesPHP 構成で (神があなたを助けてくれます)マジック クォートをオンにしている場合にのみ、含める必要があります。ありがたいことに、マジック クォートは PHP 5.4 で削除されたので、おそらくstripslashesその行から安全に削除できます。

$value = urlencode($value);

信じられないかもしれませんが、Paypal ではユーザー データにバックスラッシュを含めることができます。したがって、IPN にバックスラッシュが含まれていて、それらをstripslashesで削除した場合、検証のために IPN データを PayPal に送り返すと、データが一致しないため、Paypal から INVALID 応答が返されます。

于 2015-03-03T04:52:37.957 に答える