Задать вопрос
@nikitapop

Как превратить запрос с cURL в Guzzle?

Есть апи amo crm, перед использованием надо авторизоваться. На curl все работает нормально, но хочу использовать guzzle. И вот на него переложить код не выходит.

Код AMO:
$subDomain = 'url';
$link = 'https://' . $subDomain . '.amocrm.ru/oauth2/access_token';

$data = [
    'client_id' => 'xxx,
    'client_secret' => xxx,
    'grant_type' => 'authorization_code',
    'code' => 'code',
    'redirect_uri' => 'url'
];

$curl = curl_init();
curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
curl_setopt($curl,CURLOPT_URL, $link);
curl_setopt($curl,CURLOPT_HTTPHEADER,['Content-Type:application/json']);
curl_setopt($curl,CURLOPT_HEADER, false);
curl_setopt($curl,CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl,CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);
$out = curl_exec($curl); 
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);

$response = \json_decode($out, true);


Код на Guzzle:

$client = new Client([
    'headers' => [
        'Content-Type' => 'application/json',
        'User-Agent' => 'amoCRM-oAuth-client/1.0'
    ],
]);

$subDomain = 'url';
$link = 'https://' . $subDomain . '.amocrm.ru/oauth2/access_token';

$data = [
    'client_id' => 'xxx,
    'client_secret' => xxx,
    'grant_type' => 'authorization_code',
    'code' => 'code',
    'redirect_uri' => 'url'
];

try {
    $response = $client->request('POST', $link, ['form_params' => $data]);
} catch (GuzzleHttp\Exception\GuzzleException | Exception $e) {
    echo $e->getMessage() . \PHP_EOL;
}


Вылетает ошибка 400 Bad Request. Подскажите, пожалуйста, как мне поправить запрос?
  • Вопрос задан
  • 2816 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 4
@Nujabes37
:DEATH
Попробуй так отправить
$response = $client->post(
    $link,
    [
        GuzzleHttp\RequestOptions::JSON => $data,
    ]
);
Ответ написан
kspitfire
@kspitfire
Webdev: PHP (Symfony, Laravel), JS (Vue.js), Go.
А так?

$response = $client->post($link, [ 'body' => json_encode($data)]);
Ответ написан
artemiy_karkusha
@artemiy_karkusha
Гость в этой жизни.
Участок объявления use:
use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\RequestOptions;

Я работал не с oauth2, но данный код работает.
$user = [
            'USER_LOGIN' => $this->getLogin(),
            'USER_HASH' => $this->getKey()
        ];
        try {
        $response = $this->getClient()->request('Post', '/private/api/auth.php?type=json', [
            'headers' => [
                'User-Agent' => 'amoCRM-API-client/1.0',
                'Content-Type' => 'application/json'
            ],
            RequestOptions::JSON => $user
        ]);
        } catch (GuzzleException | Exception $e) {
            echo $e->getMessage() . \PHP_EOL;
            exit;
        }
Ответ написан
Комментировать
Hy_ok
@Hy_ok
Может быть кому то и пригодится, кто будет искать это в сл раз как я)
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\RequestOptions;
use Exception;

            $client = new Client();
            $subdomain = 'subdomain'; //Поддомен нужного аккаунта
            $link = 'https://' . $subdomain . '.amocrm.ru/oauth2/access_token'; //Формируем URL для запроса

            /** Соберем данные для запроса */
            $data = [
                'client_id' => 'client_id',
                'client_secret' => 'client_secret',
                'grant_type' => 'authorization_code',
                'code' => 'code',
                'redirect_uri' => 'redirect_uri',
            ];

            try {
                $response = $client->request('POST', $link, [
                    'headers' => [
                        'Content-Type' => 'application/json',
                        'User-Agent' => 'amoCRM-oAuth-client/1.0'
                    ],
                    RequestOptions::JSON => $data
                ]);
                $resp = json_decode($response->getBody()->getContents()); # возвращается у нас stdClass, и обращение к элементам идет $resp->token_type, $resp->expires_in, $resp->access_token, $resp->refresh_token
                print_r($resp->token_type);
                print_r($resp->expires_in);
                print_r($resp->access_token);
                print_r($resp->refresh_token);
            } catch (GuzzleException | Exception $e) {
                print_r($e->getMessage());
            }

сам пока допер прошло не мало времени) может кому поможет)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽