2016-01-12 84 views
0

我试图使用谷歌API购物(商家),我坚持这个问题。在PHP 401 Google API OAuth登录要求

我对PHP不是很熟悉,但对我来说代码看起来很好,我想要做的就是尝试从我的商店获取物品。我已经在开发者控制台中按照google的建议步骤设置了客户端ID和客户端密码,但是仍然在日志记录后出现错误。

下面的代码我使用:

<?php 

/* 
* Uses google API to make an authorized request trough a google dev console project. 
*/ 

require_once __DIR__ . '/../../google-api-php-client-master/vendor/autoload.php'; 
//require_once 'Google/Client.php'; 
//require_once 'Google/Service/ShoppingContent.php'; 
require_once '../Config.php'; 

$redirect_uri = $actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; //this is used during the auth process 
//$merchantId = $_POST['merchantId']; 
$merchantId = Config::MERCHANT_ID; 
$service; 

$client = Config::getGoogleClient(); 

$client->setRedirectUri($redirect_uri); 
doOAuth($client); 
echo "TOKEN : " + $client->getAccessToken() . " " . $_SESSION['oauth_access_token']; 
//after authentication we can create a service object 
$service = new Google_Service_ShoppingContent($client); 

$products = $service->products->listProducts($merchantId); 
$parameters = array(); 
while (!empty($products->getResources())) { 
    foreach ($products->getResources() as $product) { 
     printProduct($product); 
    } 
    if (!empty($products->getNextPageToken())) { 
     break; 
    } 
    $parameters['pageToken'] = $products->nextPageToken; 
    $products = $service->products->listProducts($merchantId, $parameters); 
} 

printf("\nEnd"); 

//////////////////////// 
//$_SESSION['oauth_access_token'] = null; 
function doOAuth(&$client) { 
    if (isset($_SESSION['oauth_access_token'])) { 
     $client->setAccessToken($_SESSION['oauth_access_token']); 
    } elseif (isset($_GET['code'])) { 
//  $client->setAccessType("offline"); //IMPORTANT 
     $token = $client->authenticate($_GET['code']); 
     $_SESSION['oauth_access_token'] = $token; 
    } else { 
     header('Location: ' . $client->createAuthUrl()); 
     exit; 
    } 
} 

function printProduct($product) { 
    printf("%s %s\n", $product->getId(), $product->getTitle()); 
} 

而且我得到以下错误:

0 Array Fatal error: Uncaught exception 'Google_Service_Exception' with message '{ "error": { "errors": [ { "domain": "global", "reason": "required", "message": "Login Required", "locationType": "header", "location": "Authorization" } ], "code": 401, "message": "Login Required" } } ' in C:\Program Files (x86)\Apache Software Foundation\Apache24\htdocs\google-api-php-client-master\src\Google\Http\REST.php:123 Stack trace: #0 C:\Program Files (x86)\Apache Software Foundation\Apache24\htdocs\google-api-php-client-master\src\Google\Http\REST.php(82): Google_Http_REST::decodeHttpResponse(Object(GuzzleHttp\Psr7\Response), Object(GuzzleHttp\Psr7\Request), 'Google_Service_...') #1 [internal function]: Google_Http_REST::doExecute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), 'Google_Service_...') #2 C:\Program Files (x86)\Apache Software Foundation\Apache24\htdocs\google-api-php-client-master\src\Google\Task\Runner.php(181): call_user_func_array(Array, Array) #3 C:\Program Files (x86)\Apac in C:\Program Files (x86)\Apache Software Foundation\Apache24\htdocs\google-api-php-client-master\src\Google\Http\REST.php on line 123

感谢所有帮助

编辑:进一步信息 我能检测$ token对象内的这个错误

[error] => redirect_uri_mismatch [error_description] => Bad Request

Blockquote

+0

您必须设置在谷歌API控制台重定向URI。它应该与您尝试接收令牌的位置相同。 – dikesh

回答

0
/** 
* IMPORTANT: this url is used during both two phases of OAuth. 
* If a mistmatch of the redirect uri occours during the two phases, the login 
* fails. Must ignore the code (get) parameter in the second phase. 
**/ 
$redirect_uri = "http://localhost/gshop/action/list.php"; 

老URI是动态的,并与代码参数

+0

所以它解决了? – dikesh

+0

是的,谢谢你的帮助 – Pievis