我开始编写一个 PHP 脚本,该脚本将作为 cron 作业运行,并通过 Google Shopping API 定期更新产品列表。
我下载了适用于 PHP 的 GSC 客户端库,并试图通过Google Shopping API 文档来获取令牌。但是,感觉文档中的某处缺少关于在生成 URL 后如何实际请求令牌的步骤。
到目前为止,这是我的代码:
require ("./lib/shoppingclient/GShoppingContent.php");
const G_MERCHANT_ID = '**********';
const G_CLIENT_ID = '**********';
const G_CLIENT_SECRET = '**********';
$obj_client = new GSC_Client (G_MERCHANT_ID);
// Obtain an OAuth2 token to access the API with
$obj_token = new GSC_OAuth2Token (G_CLIENT_ID, G_CLIENT_SECRET, USER_AGENT);
$str_url = $obj_token -> generateAuthorizeUrl ('urn:ietf:wg:oauth:2.0:oob');
echo ($str_url . PHP_EOL);
/* @var $obj_response _GSC_Response */
$obj_response = $obj_token -> makeAuthenticatedRequest (curl_init ($str_url));
echo ($obj_response);
当我从命令行运行上述内容时,我得到:
https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=blah-blah-blah-etc-etc-etc ...
<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
Fatal error: Uncaught exception 'GSC_TokenError' with message 'invalid_request' in /var/samba/GoogleShoppingTest/lib/shoppingclient/GShoppingContent.php on line 624
GSC_TokenError: invalid_request in /var/samba/GoogleShoppingTest/lib/shoppingclient/GShoppingContent.php on line 624
Call Stack:
0.0002 321888 1. {main}() /var/samba/GoogleShoppingTest/logintest.php:0
0.0065 1446196 2. GSC_OAuth2Token->makeAuthenticatedRequest() /var/samba/GoogleShoppingTest/logintest.php:19
0.2797 1446684 3. GSC_OAuth2Token->refresh() /var/samba/GoogleShoppingTest/lib/shoppingclient/GShoppingContent.php:722
0.3992 1448152 4. GSC_OAuth2Token::raiseFromJson() /var/samba/GoogleShoppingTest/lib/shoppingclient/GShoppingContent.php:565
我相当肯定初始化一个 CURL 对象不是必需的,但我无法弄清楚我是如何从生成的 URL 到解析的实际响应的。
如果我访问由 generateAuthorizeUrl() 生成的 URL,我会得到一个带有按钮的页面,要求我授予权限。如果我这样做,我会得到一个页面,上面有一个令牌,据我所知是有效的。
但是,这是一个 cron 脚本,它显然无法要求用户单击按钮并确认他们想要授予权限,所以显然我在某个地方偏离了轨道。
有没有人设法让 GSC_Client 在完全自动的脚本中与 OAuth 一起工作?如果是这样,我在这里做错了什么?
更新:对于此应用程序,我已将 API 类型配置为“已安装的应用程序”,这似乎是此应用程序的正确 API 类型。这意味着我为脚本提供了共享密钥并使用https://localhost
orurn:ietf:wg:oauth:2.0:oob
作为 URL。
更新 2:我认为 GSC 客户端的支持库不支持服务器到服务器的方案。进一步的研究表明,如果我想使用私钥身份验证方法 ,我需要Google API 客户端库。
这是我迄今为止设法编写的代码:
require ("./lib/google/oauthclient/Google_Client.php");
require ("./lib/google/shoppingclient/GShoppingContent.php");
const G_MERCHANT_ID = '********';
const G_CLIENT_ID = '********';
const G_CLIENT_EMAIL = '********';
const G_CLIENT_KEY_PATH = '/path/to/the/privatekey.p12';
const G_CLIENT_KEY_PW = 'notasecret';
$obj_client_auth = new Google_Client ();
$obj_client_auth -> setApplicationName ('test');
$obj_client_auth -> setClientId (G_CLIENT_ID);
$obj_client_auth -> setAssertionCredentials (new Google_AssertionCredentials (
G_CLIENT_EMAIL,
array (OAUTH_SCOPE),
file_get_contents (G_CLIENT_KEY_PATH),
G_CLIENT_KEY_PW));
$obj_client_auth -> getAuth () -> refreshTokenWithAssertion ();
// Get a token
$obj_token = json_decode ($obj_client_auth -> getAccessToken ());
print_r ($obj_token);
当我运行上面的代码时,我得到类似于以下内容的回报:
stdClass Object
(
[access_token] => ya29.AHES6ZRJohl2AfbQCKbFxNlagSqLGcjHwiylqASX1ygmwg
[expires_in] => 3600
[created] => 1359123809
)
我猜这是一个有效的访问令牌响应。
但是,我还没有弄清楚如何将返回的令牌与 GSC_Client 库一起使用。虽然我知道这两个库都来自谷歌,但我得到的明显印象是它们是由不同的团队开发的,他们之间几乎没有什么关系,最终结果是这些库不是交叉兼容的. 如果有人知道在这里做什么,我会很感激你的任何建议。
更新 3
我已经设法使用 oAuth 库从 Google 实际提取数据,但它来自用于购物的搜索 API。我需要使用 Content API 来处理产品列表以进行购物。oAuth 库似乎没有提供用于执行此操作的类,即使在 contrib 目录中也是如此!
仅供参考,这是执行搜索 API 请求的代码(减去常量):
$obj_client_auth = new Google_Client ();
$obj_client_auth -> setApplicationName ('test');
$obj_client_auth -> setClientId (G_CLIENT_ID);
$obj_client_auth -> setAssertionCredentials (new Google_AssertionCredentials (
G_CLIENT_EMAIL,
array (
//'https://www.googleapis.com/auth/structuredcontent',
'https://www.googleapis.com/auth/shoppingapi'
),
file_get_contents (G_CLIENT_KEY_PATH),
G_CLIENT_KEY_PW));
$obj_client_api = new Google_ShoppingService ($obj_client_auth);
$arr_results = $obj_client_api -> products -> listProducts ('public', array (
'country' => 'GB',
'q' => '"mp3 player" | ipod',
'rankBy' => 'relevancy'
));
print_r ($arr_results);