【发布时间】:2018-11-28 23:44:27
【问题描述】:
2018 年 6 月 30 日之后,Paypal won't accept non-TLS 1.2 + HTTP 1.1 requests 不再。
他们创建了 URL https://tlstest.paypal.com/ 来测试连接是否正常。如果我们在浏览器中打开这个 URL,就会成功:
PayPal_Connection_OK
问题:使用以下代码从 PHP 连接时为什么会失败?(我根本没有得到任何响应,浏览器仍处于等待“状态”like this,所以它没有甚至到达echo $errno; echo $errstr;)
<?php
$req = ''; // usually I use $req = 'cmd=_notify-validate'; for IPN
$header .= "POST / HTTP/1.1\r\n";
$header .= "Host: tlstest.paypal.com\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen('tls://tlstest.paypal.com', 443, $errno, $errstr, 30);
if (!$fp) {
echo $errno;
echo $errstr;
} else {
fputs($fp, $header);
while (!feof($fp))
{
$res = fgets($fp, 1024);
echo $res;
}
fclose($fp);
}
?>
注意:
这不是Paypal IPN HTTP/1.1 - doesn't provide any response at all, it is an empty string的复制品,后者已经过时了。
我有 PHP 5.6.33-0+deb8u1 (cli)(构建时间:2018 年 1 月 5 日 15:46:26)和
openssl version text: OpenSSL 1.0.1t 3 May 2016
【问题讨论】:
-
您可能应该在
if的第一个分支中添加一些调试内容,该分支当前为空。fsockopen可能不使用 TLS1.2,它可能取决于许多事情,例如您未披露的 PHP 版本,以及 openssl 的安装方式。我认为另一个问题的主要建议也适用于这里:fsockopen作为 API 太低,请使用真正的 HTTP 客户端,如curl。 -
why does it fail什么失败了?您实际上还没有解释错误是什么。是否设置了errno或errstr?它们包含什么? -
基于此 - 我假设实际发生的情况是页面加载将挂起 30 秒( fsock 超时 ),然后返回连接超时错误。您是否能够打开与任何其他主机的连接?在任何港口?你在VPS上运行吗?或者在一些共享的网络主机上?防火墙规则/访问限制策略可能会阻止来自主机的出站请求。将 30 减少到 5 并确认页面挂起 5 秒后再报错 -
-
您至少需要 openssl 1.0.1 来支持 TLS 1.2,打印 OPENSSL_VERSION_NUMBER 它应该至少为 0x1000100。你的版本可能太旧了,PHP 5.5 已经 2 年不支持了...
-
你为什么不想使用 PHP 中的
curl库?在同一主机上,您是否尝试过命令行wget、curl甚至openssl s_client来确定问题出在您的代码/库还是网络问题?或者您是否尝试将您的代码用于另一台主机?请注意,实际上您可能需要 SNI,您检查了吗?
标签: php ssl paypal paypal-ipn tls1.2