1

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

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

当我测试$responseand$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);

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

但是,当我检查$payment_status从贝宝返回时,它总是有效,即当付款正常时,$payment_statusComplete,当它处于待处理状态时,$payment_status贝宝返回到我的服务器Pending等等。所以代码有效,我只是不明白为什么$responseand$status被使用,因为它们是空白的。

4

3 回答 3

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 脚本 self 的执行时间:

set_time_limit(0);// to infinity for example
于 2013-09-10T08:32:17.347 回答
0

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

于 2013-09-08T11:03:47.717 回答
0

curl_exec(): 如果你连接服务器,那么你可以从它那里得到一个返回码,否则它会失败,你得到一个 0。

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

于 2013-09-06T18:27:47.217 回答