Я создал прототип системы синхронизации календарей с использованием API календаря Google, и он работает хорошо, за исключением обновления токенов доступа. Это те шаги, которые я прошел:
1) Авторизовал мой API и получил код авторизации.
2) Обменный код авторизации для Access Token и RefreshToken.
3) Используется API календаря до тех пор, пока токен доступа не истечет.
На этом этапе я пытаюсь использовать токен обновления, чтобы получить еще один токен доступа, поэтому моим пользователям не нужно предоставлять доступ, потому что синхронизация дневника происходит, когда они находятся в автономном режиме.
Вот код PHP, я использую curl-запросы по всей системе.
$requestURL = "https://accounts.google.com/o/oauth2/token"; $postData = array("grant_type" => "refresh_token", "client_id" => $clientID, "client_secret" => $clientSecret, "refresh_token" => $refreshToken); $headers[0] = 'Content-Type: application/json'; $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_URL, $requestURL); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); $response = curl_exec($ch); $responseArray = json_decode($response, TRUE);
Ответ, который я получаю:
[error] => invalid_request [error_description] => Required parameter is missing: grant_type
Об ошибках скручивания не сообщается.
Я пробовал тип содержимого заголовка: application / x-www-form-urlencoded и многое другое, с тем же результатом.
Я подозреваю, что это что-то очевидное в моих настройках завивки или заголовках, так как каждый параметр, упомянутый в документации Google для этого запроса, установлен. Тем не менее, я собираюсь в кругах, поэтому буду признателен за любую помощь, включая указание на очевидные ошибки, которые я забыл.
ваш запрос не должен публиковать данные JSON, а скорее кодировать данные формы запроса, как в:
$requestURL = "https://accounts.google.com/o/oauth2/token"; $postData = "grant_type=refresh_token&client_id=$clientID&client_secret=$clientSecret&refresh_token=$refreshToken"; $headers[0] = 'Content-Type: application/x-www-form-urlencoded'; $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_URL, $requestURL); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); $response = curl_exec($ch); $responseArray = json_decode($response, TRUE);