php - 为什么 tlstest.paypal.com 可以在浏览器中运行,但不能在我的 PHP 代码中运行(对 Paypal IPN 有用)?

标签 php ssl paypal paypal-ipn tls1.2

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);
}
?>

注意:

最佳答案

它通过将 tls:// 更改为 ssl:// 在我这边工作,这对我来说完全没有意义,但这也是使用 的原因fsockopen 是一个级别太低的库,无法仅与其进行 HTTP 交换(您应该使用适当的 HTTP 客户端库),同时在 TLS 方面的配置不够。

$fp = fsockopen('tls://tlstest.paypal.com', 443, $errno, $errstr, 30); 我得到:

HTTP/1.1 426 Unknown
Server: AkamaiGHost
Mime-Version: 1.0
Content-Type: text/html
Content-Length: 267
Expires: Fri, 22 Jun 2018 19:49:46 GMT
Date: Fri, 22 Jun 2018 19:49:46 GMT
Connection: keep-alive
Upgrade: TLS/1.2

<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>

You don't have permission to access "http&#58;&#47;&#47;tlstest&#46;paypal&#46;com&#47;" on this server.<P>
Reference&#32;&#35;18&#46;8024a17&#46;1529696986&#46;1fc51318
</BODY>
</HTML>

但使用 $fp = fsockopen('ssl://tlstest.paypal.com', 443, $errno, $errstr, 30); 我得到:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 20
Date: Fri, 22 Jun 2018 20:05:35 GMT
Connection: keep-alive

然后就挂了,可能是因为是keep-alive连接,buffer小于1024,所以收不到后面的body内容。 这可能是“PayPal_Connection_OK”,因为它与 Content-Length 中显示的长度完全匹配。 这再次表明您应该使用 HTTP 客户端库,而不是尝试(糟糕地)在 fsockopen 之上重新实现 HTTP。

关于php - 为什么 tlstest.paypal.com 可以在浏览器中运行,但不能在我的 PHP 代码中运行(对 Paypal IPN 有用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50938090/

相关文章:

php - MySQL 删除多列

php - 如何检查响应 TWIG 中是否存在记录 - 表格格式的数据

javascript - Web 套接字连接无法通过 SSL 工作

wordpress - 跨源资源共享策略 : No 'Access-Control-Allow-Origin

php - 安全警告 Paypal

php - Paypal 订阅代码出错,错误 : 10474

php - 如何从 php 中的 popen 打开的进程中获取输出?

php - 使用 PHP 将日期添加到 MySQL

cakephp - 带有 extensions=php_openssl 取消注释的 cakaPHP 中的 SSL 错误

Paypal - 允许客户在“立即购买”按钮上输入值(value)