贝宝开发者网站的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_status
是Complete
,当它挂起时,返回到我的服务器的$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