$response和$status在贝宝';s ipn没有值


$response and $status in paypal's ipn have no values?

贝宝开发者网站的ipn.php示例代码中以下两行的目的是什么?

$response = curl_exec($request);
$status   = curl_getinfo($request, CURLINFO_HTTP_CODE);

当我测试$response$status时,@status给了我值0,而$response没有值。

以下是我在上面两行之前执行的所有代码:

<?php
    // Does this code actually run?
    error_log("yes");
    // Capture the post
    $ipn_post_data = $_POST;
    // Choose url
    if(array_key_exists('test_ipn', $ipn_post_data) && 1 === (int) $ipn_post_data['test_ipn'])
        $url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
    else
        $url = 'https://www.paypal.com/cgi-bin/webscr';
    // Set up request to PayPal
    $request = curl_init();
    curl_setopt_array($request, array
    (
        CURLOPT_URL => $url,
        CURLOPT_POST => TRUE,
        CURLOPT_POSTFIELDS => http_build_query(array('cmd' => '_notify-validate') + $ipn_post_data),
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_HEADER => FALSE,
        CURLOPT_SSL_VERIFYPEER => TRUE,
        CURLOPT_CAINFO => 'cacert.pem',
    ));
    // Execute request and get response and status code
    $response = curl_exec($request);
    $status   = curl_getinfo($request, CURLINFO_HTTP_CODE);

我可以在apache错误日志中看到一个yes,所以我知道当paypal将ipn数据返回到我的测试服务器时,这个文件就会被执行。

但是,当我检查从贝宝返回的$payment_status时,它总是有效的,即当付款正常时,$payment_statusComplete,当它挂起时,返回到我的服务器的$payment_status贝宝是Pending等等。所以代码有效,我只是不明白为什么$response$status是空的。

请检查一下:

如果你连接到服务器,那么你可以从中获得一个返回代码,否则它将失败,你会得到一个0。因此,如果你尝试连接到"www.google.com/lksdfk",你会得到一个400的返回代码,如果你直接访问google.com,你会获得302(如果你转发到下一页,则会获得200……我会这样做,因为它转发到了google.combr,所以你可能不会得到),如果你访问"google.com",你将获得0(找不到主机),所以对于最后一个,没有人可以发回代码。

使用以下代码进行测试

<?php
$html_brand = "www.google.com";
$ch = curl_init();
$options = array(
    CURLOPT_URL            => $html_brand,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 120,
    CURLOPT_TIMEOUT        => 120,
    CURLOPT_MAXREDIRS      => 10,
);
curl_setopt_array( $ch, $options );
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ( $httpCode != 200 ){
    echo "Return code is {$httpCode} 'n"
        .curl_error($ch);
} else {
    echo "<pre>".htmlspecialchars($response)."</pre>";
}
curl_close($ch);

OR第二个原因:

意识到我有SSL问题。只需将CURLOPT_SSL_VERIFYPEER和CURLOPT-SSL_VERIFYHOST设置为false。作品

OR第三个原因:

CURLOPT_CONNECTTIMEOUT-尝试连接时等待的秒数。使用0可以无限期等待。

CURLOPT_TIMEOUT-允许执行cURL函数的最大秒数。

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds

也不要忘记放大php脚本自身的执行时间:

set_time_limit(0);// to infinity for example

curl_exec():如果您连接到服务器,那么您可以从中获得返回代码,否则它将失败,您将获得0。

检查URL是否正确,并检查您的编码:为什么我的PayPal IPN脚本失败?

您真的应该考虑使用库而不是重新发明轮子。我个人使用https://github.com/Quixotix/PHP-PayPal-IPN