我尝试向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
非常感谢您提供有关此问题的任何帮助。
答案 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协议错误。
最后一件事-如果这是导致您出错的原因,我将假设您的活动服务器至少已经使用了两年。这完全无关,与我无关,但如果过时,您可能还存在许多其他漏洞。我强烈建议您更新甚至升级新服务器(说起来容易做起来难……)