首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么tlstest.paypal.com可以在浏览器中工作,但不能从我的PHP代码中工作(对于Paypal IPN很有用)?

为什么tlstest.paypal.com可以在浏览器中工作,但不能从我的PHP代码中工作(对于Paypal IPN很有用)?
EN

Stack Overflow用户
提问于 2018-06-20 07:07:01
回答 2查看 1.2K关注 0票数 -1

2018年6月30日之后,Paypal won't accept non-TLS 1.2 + HTTP 1.1 requests将不再使用。

他们创建了URL https://tlstest.paypal.com/来测试连接是否正常。如果我们在浏览器中打开这个URL,我们会得到一个成功的:

代码语言:javascript
运行
复制
PayPal_Connection_OK

问题:为什么在使用以下代码从PHP连接时会失败?(我根本没有得到任何响应,浏览器仍在等待“状态”like this,所以它甚至不会到达echo $errno; echo $errstr;)

代码语言:javascript
运行
复制
<?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);
}
?>

注意:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-23 04:14:21

它通过将tls://改成ssl://来工作,这对我来说完全没有意义,但这也是为什么使用fsockopen是一个太低级的库,不能只与它进行HTTP交换(你应该使用合适的HTTP客户端库),同时对于TLS的东西也没有足够的可配置性。

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

代码语言:javascript
运行
复制
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);,我得到的是:

代码语言:javascript
运行
复制
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 20
Date: Fri, 22 Jun 2018 20:05:35 GMT
Connection: keep-alive

然后它挂起,可能是因为它是一个保持活动的连接,并且缓冲区小于1024,因此您无法获得以下正文内容。可能是"PayPal_Connection_OK",因为它与Content-Length中显示的长度完全匹配。这再次表明您应该使用HTTP客户端库,而不是试图(糟糕地)在fsockopen之上重新实现HTTP。

票数 1
EN

Stack Overflow用户

发布于 2018-06-23 04:22:54

为了完整性,这里有一个有效的代码(完全归功于PatrickMevzek的答案):

代码语言:javascript
运行
复制
<?php
$req = '';
$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('ssl://tlstest.paypal.com', 443, $errno, $errstr, 3);

if (!$fp) {
    echo $errno;
    echo $errstr;
} else {
    fputs($fp, $header);
    while (!feof($fp))
    {
        $res = fgets($fp, 21);   // 21 because length of "PayPal_Connection_OK"
        echo $res;
    }
    fclose($fp);
}
?>

这是来自服务器的答案:

代码语言:javascript
运行
复制
# php -f test.php
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 20
Date: Fri, 22 Jun 2018 20:19:56 GMT
Connection: keep-alive

PayPal_Connection_OK
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50938090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档