PayPal IPN 响应为空

Posted

技术标签:

【中文标题】PayPal IPN 响应为空【英文标题】:PayPal IPN response empty 【发布时间】:2017-02-14 11:03:42 【问题描述】:

在过去的 5 个小时里,我一直在尝试调试此问题和/或在线查找答案,但一切都是徒劳的。我正在沙箱中进行测试,但在实时服务器上也存在同样的问题,这表明我的代码而不是沙箱有问题,但我无法弄清楚那是什么。我的代码基本上是直接从贝宝的例子here复制过来的。

// Step 2: POST IPN data back to PayPal to validate
$ch = curl_init();
$url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));

if( !($res = curl_exec($ch)) ) 
    error_log("Got " . curl_error($ch) . " when processing IPN data");
    mail($notifyemail,'CURL error on IPN',"Got " . curl_error($ch) . " when processing IPN data");
    curl_close($ch);
    exit;

curl_close($ch);

(为简洁起见,我省略了此代码上方的所有内容,但请放心,在此之前的所有代码都经过测试和验证可以正常工作。我已经对$req 使用字符串和数组进行了测试)

在沙箱中测试时,它显示IPN was sent and the handshake was verified(向我建议端口 443 已打开)。但是,$res 始终为空。更奇怪的是,在调试过程中,我添加了一个步骤,在该步骤中,我的代码在 curl_exec() 步骤之前和之后通过电子邮件向我发送了 curl_getinfo($ch) 的内容,在这两种情况下,除了 url 之外的所有内容也是空的 - 好像选项根本没有被添加到请求中。我对 curl 的经验不足,不知道这是否正常。

PayPal 谈到 IPN:

HTTP response code: 200
Delivery status: Sent
No. of retries: 0
IPN type: Transaction made

我尝试从 https://github.com/Quixotix/php-PayPal-IPN 交换库并改用它,但它记录了 cURL error: [7](无法连接),这对我来说没有任何意义,因为握手再次得到验证。我将$listener->getTextReport() 的内容通过电子邮件发送给自己,但它根本不包含任何错误信息。

尝试use_ssluse_curl的各种组合,我的错误日志如下所示:

[05-Oct-2016 16:40:13 America/Toronto] cURL error: [7] 
[05-Oct-2016 16:47:22 America/Toronto] PHP Warning:  fsockopen(): unable to connect to ssl://www.sandbox.paypal.com:443 (Operation not permitted) in /home/[stuff]/public_html/[stuff]/ipnlistener.php on line 144
[05-Oct-2016 16:47:22 America/Toronto] fsockopen error: [1] Operation not permitted
[05-Oct-2016 16:50:39 America/Toronto] cURL error: [7] 
[05-Oct-2016 16:51:55 America/Toronto] PHP Warning:  fsockopen(): unable to connect to www.sandbox.paypal.com:80 (Operation not permitted) in /home/[stuff]/public_html/[stuff]/ipnlistener.php on line 144
[05-Oct-2016 16:51:55 America/Toronto] fsockopen error: [1] Operation not permitted

一定有什么我做错了或忽略了,但对于我的生活,我无法弄清楚那可能是什么。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

好吧,问题似乎在于网络主机没有将 www.sandbox.paypal.com 列入白名单。因此,给遇到此问题的其他人一个教训:与您的虚拟主机核实,确保一切就绪,让您可以做您需要做的事情。

旁注:既然我已经有了它的经验,我推荐我在一天结束时开始使用的 IPN 库。在测试环境和实际环境之间以及 cURL 和套接字之间快速切换的能力非常有用和有益,它使我在一天结束时的测试速度显着加快。

【讨论】:

以上是关于PayPal IPN 响应为空的主要内容,如果未能解决你的问题,请参考以下文章

(Laravel)无法从PayPal IPN获得响应,但模拟的响应返回已经过验证

Paypal:ipn响应问题

从 PayPal 的沙盒 IPN 获得无效响应

Paypal 中某些 IPN 消息的无效响应

多次收到 Paypal IPN 响应

PayPal IPN 模拟器工作正常,但 IPN 不响应沙盒支付