Paypal SandBox IPN always returns INVALID

前端 未结 9 1422
予麋鹿
予麋鹿 2020-12-03 08:33

As mentioned in one of the comments in an answer below, I tried following this tutorial. So now I have the following:


The ipn.php file:

9条回答
  •  眼角桃花
    2020-12-03 09:07

    The problem is that you don't check the HTTP response code, so you are intepreting the "Invalid Host header" as the PayPal response, whilst it's the web server response (for the status code 400).
    If you look at the PayPal documentation, there is a PHP example which is very similar to your code, since it uses the "fsockopen", "fputs" and "fgets" functions to communicate with the PayPal server.
    But if you look carefully at the remark after the "fsockopen" call, you can read:

    // Process validation from PayPal 
    // TODO: This sample does not test the HTTP response code. All 
    // HTTP response codes must be handled or you should use an HTTP 
    // library, such as cUrl
    

    And this is exacty your problem: you don't check that the HTTP response code is 200 (OK), before parsing the response body.
    Also, using the "strtolower" function is not correct, since the real response from the PayPal server is always uppercase, as shown in the above cited example.
    Even if the PayPal example uses the "fsockopen" approach, I think it should be much better to use the PHP cURL library to implement your IPN listener.
    Have also a look at the following answers:

    • PHP cURL PayPal Sandbox
    • cURL or fsockopen for paypal ipn

    However, if you really want to use the "fsockopen" function, you should always specify the "Host" header field in the POST request, as shown in the following snippet of code (taken from the PHP manual):

    \n";
    } else {
        $out = "GET / HTTP/1.1\r\n";
        $out .= "Host: www.example.com\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
        while (!feof($fp)) {
            echo fgets($fp, 128);
        }
        fclose($fp);
    }
    ?>
    

    UPDATE

    Here is a simple function for recursive stripslashes/urlencoding:

    
    
    
     Array("USD 20.00"),
      "payment_request_date" => "Sun Aug '05 08:49:20 PDT 2012",
      "return_url" => "http://000.000.000.000/success.php"
    );
    
    echo "before myUrlencode...\n";
    print_r($post);
    
    function myUrlencode($post) {
      foreach ($post as $key => $val) {
        if (is_array($val)) {
          $post[$key] = myUrlencode($val);
        } else {
          $post[$key] = urlencode(stripslashes($val));
        }
      }
      return($post);
    }
    
    echo "\nafter myUrlencode...\n";
    print_r(myUrlencode($post));
    
    ?>
    

提交回复
热议问题