Curl / php 来自 PayPal IPN url 的空响应

Posted

技术标签:

【中文标题】Curl / php 来自 PayPal IPN url 的空响应【英文标题】:Curl / php Empty response from PayPal IPN url 【发布时间】:2020-06-01 15:08:34 【问题描述】:

在过去的几天里,我们的 PayPal IPN 已停止工作,并且收到了来自 PayPal 的空回复。服务器或我们的代码没有任何变化。

尝试 cUrl 到 PayPal IPN url 只会返回一个空响应。

$url = "https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

$data = curl_exec($ch);
curl_close($ch);

print $data;

以上内容应返回“INVALID”并在我的本地主机和其他服务器上按预期工作。 将 url 更改为 PayPal 以外的任何其他域也可以正常工作。

所以它似乎只收到了来自 paypal.com 的空响应

我想知道是否有人遇到过这个问题或可以指点在哪里寻找以希望解决它?

亲切的问候 穆萨法尔

【问题讨论】:

对我来说它返回无效。也许检查 php 版本? 对不起,我已经测试过了,效果很好。即使我使用file_get_contents('https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate');,我也会收到INVALID 【参考方案1】:

Paypal 似乎在周末进行了一些安全更改。自周日以来,一些 oscommerce 用户出现了类似的症状,结果显示 curl 错误是:

SSL 证书问题:无法获取本地颁发者证书

在他们的情况下,这是由于本地证书副本只有 Paypal 证书,而不是根证书或中间证书,以及更新它的解决方案。

工作证书可以在以下位置找到: OSCOM Phoenix github

【讨论】:

他们不仅没有通知我们,甚至没有记录他们所做的事情,而且支持人员似乎根本不知道。不过,让我们继续工作! 当客户请求 Paypal 时,我现在只是拒绝,我推荐 Stripe 或其他一些逻辑和用户友好的实现之一。我根本不需要 Paypal 在不通知开发人员或客户的情况下更改系统的压力。 感谢您分享您的不满,让我感觉更好,因为知道我不是唯一一个感觉自己在黑暗中拍摄的人。问题在周一晚上自行解决,因此我希望现在就足够了。【参考方案2】:

我可能会开始检查curl 是否给您任何错误。在这种情况下,PHP 为您提供curl_errno($ch)curl_error($ch),它们将分别返回一条消息或错误代码。

如果没有任何可疑之处。我可能会尝试验证您是否能够从服务器上的 CLI 运行上述内容。 (需要 SSH 访问)

curl -H "User-Agent: ..." "https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate"

我希望这能给你一个好的起点。请让我知道这是否有帮助或者您是否需要更多想法。

编辑#2:在作者添加的 cmets 之后:

cUrl 确实返回错误:错误 35,错误信息如下:

error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

在这种情况下,我猜您的系统已经过时并且不支持来自 paypal 的 SSL 密码。您可以尝试强制使用特定的 TLS 版本。截至今天,paypal 网络服务器仅支持 TLS1.2 或 TLS1.3。这就是你可以强制它的方式:

curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);

curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_3);

另外@Preston PHX 在评论中提到一个很好的参考来自贝宝的这个问题:

https://github.com/paypal/TLS-update#php https://developer.paypal.com/docs/api/info-security-guidelines/

【讨论】:

感谢您的建议。 cUrl 确实返回错误:错误 35,错误消息如下:```error:1407742E:SSLroutines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version ``` 我还要补充一点,服务器安装了 curl 7.22.0 和 OpenSSL 1.0.1 @MusaffarPatel 感谢分享更多见解!你能分享一下编译成 PHP 的 OpenSSL 版本吗? php -i | grep OpenSSL。另一种选择是通过设置:curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); 来强制使用 TLS 而不是 SSL。我的假设是您编译的 php 版本的 curl 尝试选择 SSL 而不是 TLS。 @MusaffarPatel 作为补充:Paypal 的网络服务器不再支持 SSL 密码,并将其功能降低到 TLS1.2 和 TLS1.3。 OpenSSL 1.0.1 的哪个版本?您需要1.0.1c 或更高版本,这里有一些PHP 的特定指南github.com/paypal/TLS-update#php 另外,您还需要确保您能够验证PayPal 的SSL 证书。请参阅developer.paypal.com/docs/api/info-security-guidelines 除此之外,这基本上是您或有能力的系统管理员要解决的问题。做一些研究和故障排除

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

cURL Paypal IPN 脚本不工作

Paypal IPN 系统无法正常工作?

paypal 的IPN通知调用出错

Ipn 贝宝 curl_setopt

用于 paypal ipn 的 curl 或 fsockopen

即使我按照 PayPal 示例代码操作,PayPal IPN 总是返回 INVALID?