cURL работает в почтальоне, а не в терминале (для базового лагеря)

Я пытаюсь обновить access_tokens через API базового лагеря. Но я сталкиваюсь со странной ошибкой.

Запрос cURL отлично работает на POSTMAN (tab: form-data). Но я попробовал каждую конфигурацию cURL в PHP, но не смог заставить ее работать.

Это код, который я использую:

$refresh_token = func_to_get_refresh_token();

$data='redirect_uri=xxxxmyredirecturixxxx&client_id=xxxxmyclientidxxx&client_secret=xxxxmyclientsecretxxxxx&refresh_token='.$refresh_token.'&type=refresh';
curl_setopt($ch, CURLOPT_URL, 'https://launchpad.37signals.com/authorization/token');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$resp = curl_exec($ch);

Я получаю следующий результат с сервера Basecamp:

* upload completely sent off: 448 out of 448 bytes
< HTTP/1.1 400 Bad Request
* Server nginx is not blacklisted
< Server: nginx
< Date: Mon, 09 Feb 2015 08:05:51 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Status: 400 Bad Request
< X-Request-Id: aaec3a6c61eb5e603672a7a2e004ea7a
< Cache-Control: no-cache
< Set-Cookie: _launchpad_session=BAh7BiIPc2Vzc2lvbl9pZCIlOTEwZTEyOTY0N2M1ZDMxNjM4YjJlZTI2MmRjODE0MTI%3D--7ba9863975db8a7d2c97425300abab8d5405c17a; path=/; HttpOnly; secure
< X-Frame-Options: SAMEORIGIN
< X-Runtime: 0.011202
< Strict-Transport-Security: max-age=31536000
< X-UA-Compatible: IE=Edge,chrome=1
<
* Connection #0 to host launchpad.37signals.com left intact
{"error":"authorization_expired"}

Я уже перепробовал почти все возможные конфигурации cURL из того, что я могу найти в stackoverflow.

Ваша помощь будет принята с благодарностью.

0

Решение

Построить свой $data как массив вроде:

$data = array(
'redirect_uri' => 'xxxxmyredirecturixxxx',
'client_id' => 'xxxxmyclientidxxx',
'client_secret' => 'xxxxmyclientsecretxxxxx',
'refresh_token' => 'xxxrefreshtokenofmyaccountxxx',
'type' => 'refresh'
);

и передать это:

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

Это гарантирует, что ваши значения правильно закодированы в URL и что Content-Type заголовок установлен в multipart/form-data что, видимо, то, что работает с POSTman.

Я подозреваю, что проблема действительно с URL-кодировкой redirect_uri так что если Basecamp потребуется Content-Type из application/x-www-form-urlencoded скорее, чем multipart/form-data вы можете использовать то же самое $data конструкция массива, как указано выше, но затем используйте:

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query ($data));

установить тип содержимого application/x-www-form-urlencoded, Это все равно будет корректно URL-кодировать параметры.

1

Другие решения

Следующее небольшое изменение сделало свое дело:

$refresh_token = rtrim($refresh_token);

Как оказалось, мне пришлось удалить лишний невидимый символ (в данном случае символ End Of String) перед отправкой его в basecamp.

0

Я видел точно такое же сообщение об ошибке, и ни один из ответов здесь не помог мне. Как оказалось, Basecamp использует очень маркеры длинных обновлений и столбец базы данных, который я использовал для их хранения, были установлены только на VARCHAR (255), и это урезало токен обновления. Увеличение размера столбца решило проблему.

0