我最近在paypal ipn模块中调试curl函数时非常困难。
以下是我们使用的模块:http://www.oscommerce.com/community/contributions,2679但相关代码如下。
我在约5%的交易中遇到此错误。它会导致订单无法更新为付费状态。
我已经确定它是curl_exec失败并停止进一步处理脚本。 cpanel上的错误日志中没有与此相关的错误。
我试过改变curl和php超时持续时间而没有改变。我尝试过使用try和catch,但这也没有帮助。
由于脚本在点击curl_exec时停止执行,我无法使用curl_error获取有关该问题的任何反馈。
我查看了传递给IPN的参数,但它们没问题。
我觉得我已经尽了所能来确定这个问题的原因并且没有在哪里。
如果脚本使用fsock作为主要的连接方法,我会遇到同样的问题。
如果有人对其他调试此问题的方法有任何建议,我会很感激。
由于
if (MODULE_PAYMENT_PAYPAL_IPN_GATEWAY_SERVER == 'Live') {
$server = 'www.paypal.com';
} else {
$server = 'www.sandbox.paypal.com';
}
$fsocket = false;
$curl = false;
$result = false;
if (function_exists('curl_exec')) {
$curl = true;
} elseif ((PHP_VERSION >= 4.3) && ($fp = @fsockopen('ssl://' . $server, 443, $errno, $errstr, 30)) ) {
$fsocket = true;
} elseif ($fp = @fsockopen($server, 80, $errno, $errstr, 30)) {
$fsocket = true;
}
if ($fsocket == true) {
$header = 'POST /cgi-bin/webscr HTTP/1.0' . "\r\n" .
'Host: ' . $server . "\r\n" .
'Content-Type: application/x-www-form-urlencoded' . "\r\n" .
'Content-Length: ' . strlen($parameters) . "\r\n" .
'Connection: close' . "\r\n\r\n";
@fputs($fp, $header . $parameters);
$string = '';
while (!@feof($fp)) {
$res = @fgets($fp, 1024);
$string .= $res;
if ( ($res == 'VERIFIED') || ($res == 'INVALID') ) {
$result = $res;
break;
}
}
@fclose($fp);
} elseif ($curl == true) {
$ch = @curl_init();
@curl_setopt($ch, CURLOPT_URL, 'https://' . $server . '/cgi-bin/webscr');
@curl_setopt($ch, CURLOPT_POST, true);
@curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
@curl_setopt($ch, CURLOPT_HEADER, false);
@curl_setopt($ch, CURLOPT_TIMEOUT, 30);
@curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = @curl_exec($ch);
curl_close($ch);
}
答案 0 :(得分:0)
如果您使用"@"
php将不再显示错误,它将抑制错误。所以我建议删除它,然后开始调试。
答案 1 :(得分:0)
我知道这并没有回答你如何让curl_exec正常工作的问题,但是你有充分的理由不仅仅使用fsock吗?我一直在fsock上运行我的IPN监听器,它就像一个魅力......