Google表格访问令牌

时间:2017-03-23 10:27:54

标签: php google-spreadsheet-api

我对Access令牌感到有点困惑。我编写了一个PHP脚本,它插入了我从POST请求获得的数据,我已经授权了应用程序,它确实在Sheet的末尾添加了Row。

我的问题是如何在服务器上实现令牌时刷新令牌,因为它会添加POST数据。

这是代码

<?php

// Load the Google API PHP Client Library.
require_once __DIR__ . '/vendor/autoload.php';

session_start();

$client = new Google_Client();
    $client->setAuthConfigFile(__DIR__ . '/client_secrets.json');  
    $client->addScope(Google_Service_Sheets::SPREADSHEETS);

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {

  $client->setAccessToken($_SESSION['access_token']);
$lead = array (
"first_name" => $_POST['name'],
"email" => $_POST['email']
);

$sid = "sheet id on which the row is added";

addRowToSpreadsheet($lead, $client , $sid);

} else {
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/fb/oauth2callback.php';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}






function addRowToSpreadsheet($ary_values = array(), $client , $sid) {

    $sheet_service = new Google_Service_Sheets($client);

    $fileId = $sid;

    $values = array();
    foreach( $ary_values AS $d ) {
        $cellData = new Google_Service_Sheets_CellData();
        $value = new Google_Service_Sheets_ExtendedValue();
        $value->setStringValue($d);
        $cellData->setUserEnteredValue($value);
        $values[] = $cellData;
    }
    // Build the RowData
    $rowData = new Google_Service_Sheets_RowData();
    $rowData->setValues($values);
    // Prepare the request
    $append_request = new Google_Service_Sheets_AppendCellsRequest();
    $append_request->setSheetId(0);
    $append_request->setRows($rowData);
    $append_request->setFields('userEnteredValue');
    // Set the request
    $request = new Google_Service_Sheets_Request();
    $request->setAppendCells($append_request);
    // Add the request to the requests array
    $requests = array();
    $requests[] = $request;
    // Prepare the update
    $batchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest(array(
        'requests' => $requests
    ));

    try {
        // Execute the request
        $response = $sheet_service->spreadsheets->batchUpdate($fileId, $batchUpdateRequest);
        if( $response->valid() ) {
            // Success, the row has been added
            return true;
        }
    } catch (Exception $e) {
        // Something went wrong
        error_log($e->getMessage());
    }

    return false;
}
?>

我已尝试在服务器上托管该应用,并且它没有在工作表中添加新行,我认为这是一个问题,因为访问令牌

请帮助

1 个答案:

答案 0 :(得分:3)

实际上有一个PHP Quickstart for Sheets API,其中包括如何刷新令牌。这是一个片段:

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

还有一个关于刷新令牌的Refreshing an access token (offline access)指南

  

访问令牌会定期到期。您可以刷新访问令牌   在没有提示用户许可的情况下(包括用户何时)   如果您请求离线访问相关的范围,则不存在)   用令牌。

     

如果您使用Google API客户端库,则会刷新客户端对象   只要您配置该对象,就需要访问令牌   离线访问。如果您没有使用客户端库,则需要进行设置   重定向时,access_type HTTP查询参数为脱机   用户使用Google的OAuth 2.0服务器。在那种情况下,谷歌的   授权服务器在您交换时返回刷新令牌   访问令牌的授权码。然后,如果访问令牌   到期(或在任何其他时间),您可以使用刷新令牌来获取   一个新的访问令牌。

     

如果您的应用需要离线访问Google API,请设置API   客户端的访问类型为离线:

$client->setAccessType("offline");