贝宝(Paypal)从php-curl获取访问令牌错误请求,但在终端上正常运行

时间:2019-01-23 11:53:07

标签: php curl paypal

我尝试向Paypal沙盒发出curl请求以获取访问令牌,但每次我对此URL发出请求

https://api.sandbox.paypal.com/v1

它发送回400作为响应。我也尝试将curl请求发送到任何测试url并得到200响应。此外,如果我通过终端发送请求,则响应为200的问题仅在php-curl中发生另一个值得注意的是,此请求在localhost上运行正常,在实时服务器上只能获取400。

这就是我发出卷曲请求的方式

        $username = $params['paypal_client_id'];
        $password = $params['paypal_secret'];
        $headers = array(
            "Accept-Language: en_US",
            "Accept: application/json"
            );      
        $ch = curl_init(); 
        curl_setopt($ch, CURLOPT_URL,$url); 
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt($ch, CURLOPT_TIMEOUT, 60);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
        curl_setopt($ch, CURLOPT_USERPWD, trim($username) . ':' . trim($password));
        curl_setopt($ch, CURLOPT_POST, 1); 
        $data = curl_exec($ch); 

这就是我通过终端发出请求的方式

curl https://api.sandbox.paypal.com/v1/oauth2/token -H "Accept: application/json" -H "Accept-Language: en_US" -u "{Client_id}:{Client_secret}" -d "grant_type=client_credentials" 

我得到的答复是

Verbose info :* About to connect() to api.sandbox.paypal.com port 443 (#1)
*   Trying 173.0.82.78...
* Connected to api.sandbox.paypal.com (173.0.82.78) port 443 (#1)
* warning: ignoring value of ssl.verifyhost
* skipping SSL peer certificate verification
* NSS: client certificate not found (nickname not specified)
* SSL connection using TLS_RSA_WITH_AES_256_CBC_SHA256
* Server certificate:
*   subject: CN=api.sandbox.paypal.com,OU=PayPal Production,O="PayPal, Inc.",L=San Jose,ST=California,C=US
*   start date: Aug 21 00:00:00 2018 GMT
*   expire date: Aug 20 12:00:00 2020 GMT
*   common name: api.sandbox.paypal.com
*   issuer: CN=DigiCert Global CA G2,O=DigiCert Inc,C=US
* Server auth using Basic with user 'client_id'
> POST /v1/oauth2/token?grant_type=client_credentials HTTP/1.1
Authorization: Basic 'client_id'
Host: api.sandbox.paypal.com
Accept-Language: en_US
Accept: application/json
Content-Length: -1
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue

< HTTP/1.1 400 Bad Request
< Date: Wed, 23 Jan 2019 12:23:30 GMT
< Server: Apache
< Content-Length: 338
< Connection: close
< Content-Type: text/html; charset=iso-8859-1
< 
* Closing connection 1

非常感谢您提供有关此问题的任何帮助。

1 个答案:

答案 0 :(得分:0)

正如评论所指出的那样,很难对其进行远程调试。我缺乏信誉,无法添加评论,因此建议您给出答案。这是一个复杂的问题,因此恐怕此答案充其量只能为您指明正确的方向,而不是给您具体的演练。

首先,使用贝宝PHP SDK可能会更好,该工具在撰写本文时可在此页面上找到:

https://github.com/paypal/PayPal-PHP-SDK/

如果该链接断开,我相信Google会帮助您。几乎可以肯定会解决您的问题。

但是,为回答您的问题(或由于某种原因而无法使用规范库的任何其他人的问题)-从上面的链接可以看出,Paypal对其安全性非常严格。我强烈怀疑您的命令行curl使用与php-curl不同的SSL连接协议。如果此页面不回答您的问题,我会感到惊讶:

https://github.com/paypal/tls-update#php

在链接断开的情况下,我已在此处复制了它:

  

PHP要求

     

PHP使用系统提供的cURL库,该库需要OpenSSL 1.0.1c或更高版本。您可能需要更新SSL / TLS库。

     

准则

     

在以下位置找到OpenSSL:

     

已在操作系统的openssl版本中安装的OpenSSL。

     

PHP中安装了OpenSSL扩展。在您的php.ini中找到它。

     

PHP_CURL使用的OpenSSL-curl_version()。

     

这些OpenSSL扩展名可以不同,并且您分别更新每个扩展名。

     

PayPal和其他PHP SDK使用与PHP_CURL用于建立HTTP连接的相同OpenSSL扩展。 PHP_CURL OpenSSL扩展必须支持TLSv1.2。

     

php_curl库使用自己的OpenSSL库版本,该版本与PHP使用的版本不同,后者是php.ini中的openssl.so文件。

     

要验证您的PHP和TLS版本

     

要查找cURL的openssl_version信息,请运行:

     

php -r'echo json_encode(curl_version(),JSON_PRETTY_PRINT);'

     

返回的php_curl版本可能与openssl版本不同,因为它们是不同的组件。

     

更新OpenSSL库时,必须更新php_curl OpenSSL版本而不是OS OpenSSL版本。

     

下载cacert.pem和TlsCheck.php。

     

在生产系统的外壳中,运行:

     

php -f TlsCheck.php

     

成功:

     

PayPal_Connection_OK

     

失败时:

     

curl_error信息

     

注意:

     

请确保您的命令行测试使用与Web服务器使用的相同版本的PHP和SSL / TLS库。   如果使用MAMP或XAMPP作为开发设置,则与它们一起打包的PHP使用的是OpenSSL的早期版本,您无法轻易对其进行更新。有关此问题和临时解决方法的详细信息,请参阅未知SSL协议错误。

最后一件事-如果这是导致您出错的原因,我将假设您的活动服务器至少已经使用了两年。这完全无关,与我无关,但如果过时,您可能还存在许多其他漏洞。我强烈建议您更新甚至升级新服务器(说起来容易做起来难……)