Пишу на Drupal авторизацию на Zoho Books
Вывод отладочных сообщений
Для начала я столкнулся с проблемой, что не могу выводить отладочные сообщения — т.е. выполнять трассировку, как я привык, работая с разработкой на скриптовых языках.
Погугли и попробовал использовать drupal_set_message — не работает, выдает ошибку «Call to undefined function Drupal\zohobooks\Controller\drupal_set_message».
Тогда решил выводить сообщения в итоговую страницу (markup):
Но тут внезапно обнаружил, что print_r выводит сразу на экран:
Чем и воспользовался, упростив вывод:
Первые запрос по OAuth
Далее я начал заниматься запросами к API Zoho Books.
Сначала я ошибочно использовал пример с post, потом переделал его на get, обильно расставив отладочные сообщения:
$params = [ 'scope' => 'ZohoBooks.fullaccess.all', 'redirect_uri' => $redirect_uri, 'client_id' => $client_id, 'client_secret' => $client_secret, 'access_type' => 'online' ]; $response = http("https://accounts.zoho.com/oauth/v2/auth", $params); function http($url, $params) { $ch = curl_init($url . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //curl_setopt($ch, CURLINFO_HEADER_OUT, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); $url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); $header = curl_getinfo($ch, CURLINFO_HEADER_OUT); print_r('CURL: url: ' . $url . ' header: ' . $header. ' res: ' . $res . "<BR>" ); return json_decode($res); }
В итоге получил саму строку запроса и то, что она выдает:
Проверил, ввел адрес в адресную строку, получил такую же ошибку. Ну что же, нужно теперь написать правильный get-запрос.
Оказывается в коде выше я забыл знак вопроса «?» между адресом и параметрами.
После этого я получил какой-то ответ от ZB, хотя и не совсем понятный о чем это:
Проблема решилась добавлением типа ответа:
Но теперь я получил странную ошибку «Переданный идентификатор клиента не существует»:
Пришлось обратиться за подсказкой к более опытному товарищу в команде.
Оказалось, нужно было выбирать другой тип приложения — server-based:
С ним все заработало.
Дальнейшие шаги OAuth
При попытке получить refresh токен из grant токена получил непонятную ошибку «An error occurred while processing your request. Please try again later.»:
Минут 30 тупил, и только потом, когда начал гуглить подобные вопросы, дошло, что запрос должен быть POST, а не GET.
Но в ответ я получаю сообщение, что code ошибочный:
Array ( [code] => 1000.* [client_id] => 1000.* [client_secret] => * [redirect_uri] => https://myfirm.com/404 [grant_type] => authorization_code ) Refresh token result:
stdClass Object ( [error] => invalid_code )
Мой код получения refresh token выглядит так:
//Access Token if (empty($access_token)) { $params = [ 'code' => $grant_token, 'client_id' => $client_id, 'client_secret' => $client_secret, 'redirect_uri' => $redirect_uri, 'grant_type' => 'authorization_code', ]; $response = http_post("https://accounts.zoho.com/oauth/v2/token", $params); //drupal_set_message('TST'); //$html = $html . 'PARAMS: ' . print_r($params) . '<BR>'; print_r('Refresh token query: <BR>'); print_r($params); print_r('Refresh token result: <BR>'); print_r($response); //$html = $html . 'RESULT: ' . print_r($response) . '<BR>'; } function http_post($url, $params) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params, '', '&')); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); $url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); $header = curl_getinfo($ch, CURLINFO_HEADER_OUT); print_r('CURL: url: ' . $url . ' header: ' . $header. ' res: ' . $res . "<BR>" ); return json_decode($res); }
Зайдя тут в тупик, решил набрать эту последовательность запросов в POSTMAN (онлайн-версии), полностью повторить то, что делает этот программист в видео:
На самом деле я не особо вслушивался в его слова и просто промотал к моменту получения refresh-токена. И решил сделать то же самое.
И все равно у меня не получилось, даже когда я выполнять POST через онлайн-форму пост-запроса.
Я психанул и написал статью об OAuth2 на свой сайт, хабр и на инфостарт.
Пришлось обратиться к админу, он мне выдал refresh токен для тестового аккаунта Zoho, чтобы я мог писать код дальше. Почему не работала авторизация, мне так и не стало понятно, возможно, code живет очень мало? В любом случае, вопросы авторизации решили отложить до продакшна.
А я принялся писать продуктивный код по загрузке инвойсов в Друпал.
Свежие комментарии