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_status
为Complete
,当它处于待处理状态时,{{1} paypal返回我的服务器是$payment_status
,依此类推。所以代码有效,我只是不明白为什么使用Pending
和$response
,因为它们是空白的。
答案 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