Paypal получает неверный запрос токена доступа от php-curl, но работает нормально с терминала - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь отправить запрос на керлинг в песочницу Paypal, чтобы получить токен доступа, но каждый раз, когда я делаю запрос на этот URL,

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

Он отправляет обратно 400Ответ. Я попытался отправить запрос curl на любой тестовый URL-адрес, и я получил ответ 200. Более того, если я отправляю запрос через терминал, отклик 200 возникает только с php-curl. Еще одна заметная вещь - этот запрос работает нормально.на локальном хосте он получает только 400 на живом сервере.

Вот так я делаю запрос curl

        $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 голосов
/ 23 января 2019

Как уже отмечалось в комментариях, это трудно отладить удаленно.Мне не хватает репутации, чтобы добавить комментарий, поэтому я предложу этот ответ.Это сложная проблема, поэтому я боюсь, что этот ответ, в лучшем случае, направит вас в правильном направлении, а не даст вам конкретный обзор.

Во-первых, вам было бы намного лучше использоватьPayPal PHP SDK, который на момент написания статьи можно найти на этой странице:

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

Если эта ссылка не работает, я уверен, что Google поможет.Это почти наверняка решит ваши проблемы.

Однако, чтобы ответить на ваш вопрос (или вопрос кого-либо еще, кто по какой-то причине не может использовать каноническую библиотеку) - как видно из ссылки выше,Paypal довольно строго относится к своей безопасности.Я сильно подозреваю, что ваш curl командной строки использует протоколы соединения SSL, отличные от вашего php-curl.Я был бы удивлен, если бы эта страница не ответила, чтобы решить вашу проблему:

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

Я воспроизвел это здесь в случае разрыва ссылки:

Требования PHP

PHP использует системную библиотеку cURL, для которой требуется OpenSSL 1.0.1c или более поздняя версия.Вам может потребоваться обновить библиотеки SSL / TLS.

Guidelines

Найдите OpenSSL в следующих местах:

OpenSSL установлен в версии openssl вашей операционной системы.

Расширение OpenSSL установлено в вашем PHP.Найдите это в своем php.ini.

OpenSSL, используемый PHP_CURL - curl_version ().

Эти расширения OpenSSL могут отличаться, и вы обновляете каждое из них отдельно.

PayPalи другие PHP SDK используют то же расширение OpenSSL, которое PHP_CURL использует для создания HTTP-соединений.Расширение PHP_CURL OpenSSL должно поддерживать TLSv1.2.

Библиотека php_curl использует свою собственную версию библиотеки OpenSSL, которая отличается от версии PHP, то есть файла openssl.so в php.ini.

Чтобы проверить версии PHP и TLS

Чтобы найти информацию openssl_version для cURL, выполните:

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

Примечания:

Убедитесь, что в тесте командной строки используется тот жеуегзИоны библиотек PHP и SSL / TLS, которые использует ваш веб-сервер.Если вы используете MAMP или XAMPP в качестве вашей разработки, PHP, который поставляется вместе с ними, использует более раннюю версию OpenSSL, которую вы не можете легко обновить.Дополнительные сведения об этой проблеме и временном обходном пути см. В разделе Неизвестная ошибка протокола SSL.

И последнее: если это является причиной вашей ошибки, я предполагаю, что ваш работающий сервер работает по адресухотя бы пару лет.Это совершенно не связано, и это не мое дело, но если это так, то вы, вероятно, имеете множество других уязвимостей.Я настоятельно рекомендую обновить или даже ускорить работу нового сервера (что может быть легче сказать, чем сделать ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...