我对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;
}
?>
我已尝试在服务器上托管该应用,并且它没有在工作表中添加新行,我认为这是一个问题,因为访问令牌
请帮助
答案 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");