paypal的ipn中的$ response和$ status没有值?

时间:2013-08-31 10:00:21

标签: php paypal paypal-sandbox paypal-ipn

paypal开发者网站的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数据返回给我的测试服务器时会执行此文件。

但是,当我检查从PayPal返回的$payment_status时,它始终有效,即当付款正常时,$payment_statusComplete,当它处于待处理状态时,{{1} paypal返回我的服务器是$payment_status,依此类推。所以代码有效,我只是不明白为什么使用Pending$response,因为它们是空白的。

3 个答案:

答案 0 :(得分:0)

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

检查网址是否正确并检查您的编码:Why is my PayPal IPN script failing?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你能不能检查一下:

如果您与服务器连接,那么您可以从中获取返回代码,否则它将失败并且您获得0.因此,如果您尝试连接到“www.google.com/lksdfk”,您将获得返回代码400,如果你直接去google.com,你会得到302(如果你转到下一页则会得到200 ...好吧,我这样做是因为它转发到google.com.br,所以你可能得不到如果你去“googlecom”你会得到一个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);

或其他原因:

意识到我遇到了SSL问题。只需将CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST设置为false即可。的工作原理。

或第三个原因:

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