2015-12-20 15 views
6

Jestem stoi problem z skryptem quickstart php tutaj: https://developers.google.com/drive/v2/web/quickstart/phpProblem z Google-API-PHP Klienta, coraz błąd podczas uruchamiania szybki skrypt startowy

Kiedy biegnę po raz pierwszy skrypt, wykonuje doskonale i dostępem Token jest przechowywany w pliku o nazwie: pojazdów-php-quickstart.json

Kiedy biegnę po raz drugi skryptu, to daje mi błąd: start

błędu:

Uwaga: Niezdefiniowany indeks: expires_in w \ google-api-php-client \ src \ Google \ Client.php na linii 485

Błąd krytyczny: nieprzechwycony wyjątek "LogicException" z komunikatem "token odświeżający" musi zostać przekazany lub ustawiony jako część setAccessToken”w

koniec błąd:

Moje założenie jest, że żeton dostępu został zapisany w pliku nie jest w odpowiednim formacie.

Obecny format:

ya29.CODE-oN_Bearer36001/_ANOTHER-KOD-ANOTHER_ANOTHER_CODE

Jak widać, nie zawiera zmiennej "expires_in"

Wszelkie sugestie, gdzie idę źle? Uruchomiłem skrypt bez zmian.

+0

Co dokładnie są uruchomione na App Engine?Szybki start, na który wskażesz, i najwyraźniej cały tekst na Twoje pytanie, wskazuje, że działasz lokalnie, nie ma nic wspólnego z App Engine. Jeśli tak, czy możesz zmienić tagi? Jeśli nie, edytuj swoje pytanie, aby wyjaśnić, w jakim miejscu dostaje się App Engine? Dzięki. –

+0

Dziękuję Alex. Dokonałem zmian. Tak, obecnie wykonuję ją lokalnie, ale wkrótce będę przesyłać ją do Google App Engine. – CalmWinds

+0

Mam dokładny problem. Uruchamianie skryptu bez żadnych modyfikacji. Pierwszy raz działa idealnie dobrze, po raz drugi poradzi sobie z 'odświeżającym tokenem, który musi zostać przekazany lub ustawiony jako część setAccessToken'. – Erfan

Odpowiedz

12

Usunąłem błąd ... Osoba, która to napisała popełniła błąd, nie wywołując json_encode przed zapisaniem wyniku auth do pliku token.json.

Można go naprawić dodając json_encode na linii 45.

Więc ...

file_put_contents($credentialsPath, $accessToken); 

... powinno być:

file_put_contents($credentialsPath, json_encode($accessToken)); 

mam składać zwrotne więc miejmy nadzieję, to zostanie naprawione.

edit: sam problem dzieje się za symboliczną rozmowy odświeżania w tej samej metody

Edit2: Oto mój powiązany komentarz w dyskusji GitHub i odpowiedź od Google: https://github.com/google/google-api-php-client/issues/263#issuecomment-186557360

Zaproponowałem coś w następujących liniach :

if ($client->isAccessTokenExpired()) { 
    $refreshToken = $client->getRefreshToken(); 
    $client->refreshToken($refreshToken); 
    $newAccessToken = $client->getAccessToken(); 
    $newAccessToken['refresh_token'] = $refreshToken; 
    file_put_contents($credentialsPath, json_encode($newAccessToken)); 
} 

Zamiast:

// Refresh the token if it's expired. 
if ($client->isAccessTokenExpired()) { 
    $client->refreshToken($client->getRefreshToken()); 
    file_put_contents($credentialsPath, $client->getAccessToken()); 
} 
+0

Dziękujemy! Przesłałem również opinię. Chociaż wydaje się, że jest to linia 47 –

+0

@RoshanBhumbra ah tak, może to 47. W tym bilecie Githuba jest więcej informacji: https://github.com/google/google-api-php-client/issues/263#issuecomment -186557360 – Erfan

+0

@Erfan - Musiałem w zasadzie zastosować twoje ustawienie refresh_token do twojego komentarza github. Czy możesz wspomnieć o tym tutaj lub wkleić ten fragment tutaj? Czuję, że byłoby to przydatne. –

0

Google uaktualnili swoich PHP Quickstart, z ulepszonym sposobem na obsłużenie tego:

// Exchange authorization code for an access token. 
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode); 
$client->setAccessToken($accessToken); 

// Refresh the token if it's expired. 
if ($client->isAccessTokenExpired()) { 
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); 
file_put_contents($credentialsPath, json_encode($client->getAccessToken())); 
}