2016-12-11 7 views
1

Я пытаюсь подключиться к API-интерфейсам eBay через их новый REST API.eBay REST API: invalid_request при обмене кодом авторизации для токена доступа

Я использую очень простой скрипт для проверки потока, и я использую Guzzle.

Руководство, которым я следую, является this.

Но когда пришло время, чтобы обменять код авторизации с маркером доступа я когда-либо получить следующий ответ:

{"error":"invalid_request","error_description":"request is invalid","error_uri":null} 

Я действительно не знаю, что, чтобы попытаться сделать эту работу.

Это код, я использую:

<?php 

... 

if (isset($_GET['code'])) { 
    $client = new \GuzzleHttp\Client(); 

    $authorization = base64_encode($appId . ':' . $certId); 
    $code = urlencode($_GET['code']); 
    $body = 'grant_type=authorization_code&code=' . $code . '&redirect_uri=' . $ruName; 

    $options = [ 
     \GuzzleHttp\RequestOptions::HEADERS => [ 
      'Content-Type' => 'application/x-www-form-urlencoded', 
      'Authorization' => 'Basic ' . $authorization, 
     ], 
     \GuzzleHttp\RequestOptions::BODY => $body, 
     \GuzzleHttp\RequestOptions::DEBUG => true, 
    ]; 

    try { 
     $response = $client->post('https://api.sandbox.ebay.com/identity/v1/oauth2/token', $options); 
     die(dump($response->getBody()->__toString(), $response)); 
    } catch (\Exception $e) { 
     die(dump($e,$_GET, $authorization, $body, $options)); 
    } 
} 

// Start the authentication redirecting the user to the eBay's sign-in page 
$get_request_token_url = 'https://signin.sandbox.ebay.com/authorize' 
    . '?client_id=' . $appId 
    . '&redirect_uri=' . $ruName 
    . '&response_type=code' 
    // Scope for User 
    . '&scope=' . urlencode(
     'https://api.ebay.com/oauth/api_scope '. 
     'https://api.ebay.com/oauth/api_scope/sell.account.readonly '. 
     'https://api.ebay.com/oauth/api_scope/sell.account ' 
    ); 
header('Location: ' . $get_request_token_url); 

Поскольку документация Неоднозначная, я также попытался установить время включения/временный code возвращенного eBay непосредственно в строке запроса (с все остальные параметры, которые должны быть в body). Я попытался также отправить их обоих в body и добавить их в query_string, но ничего не работает ...

Я действительно не знаю, что еще попробовать.

Кто-нибудь может помочь?

ответ

2

Я использовал The League of Extraordinary Packages OAuth 2.0 Client но заплата это немного для совместимости Ebay:

Ebay Provider класс:

namespace Library\Ras\OAuth2\Client\Provider; 

use League\OAuth2\Client\Provider\GenericProvider; 

/** 
* Class Ebay 
* @package Library\Ras\OAuth2\Client\Provider 
*/ 
class EbayProvider extends GenericProvider 
{ 

    protected function getAccessTokenOptions(array $params) 
    { 
     $options = [ 
      'headers' => [ 
       'Accept' => 'application/json', 
       'Content-Type' => 'application/x-www-form-urlencoded', 
       'Authorization' => sprintf(
        'Basic %s', 
        base64_encode(sprintf('%s:%s', $params['client_id'], $params['client_secret'])) 
       ), 
      ], 
     ]; 

     unset($params['client_id'], $params['client_secret']); 

     if ($this->getAccessTokenMethod() === self::METHOD_POST) { 
      $options['body'] = $this->getAccessTokenBody($params); 
     } 

     return $options; 
    } 
} 

Если вы используете жрать < 6.0, то пользовательский запрос завод необходим:

namespace Library\Ras\OAuth2\Tool; 

use GuzzleHttp\Message\MessageFactory; 
use GuzzleHttp\Message\Request; 
use League\OAuth2\Client\Tool\RequestFactory as BaseRequestFactory; 

/** 
* Class RequestFactory 
* @package Library\Ras\OAuth2\Tool 
*/ 
class RequestFactory extends BaseRequestFactory 
{ 

    /** 
    * Creates a request using a simplified array of options. 
    * 
    * @param null|string $method 
    * @param null|string $uri 
    * @param array $options 
    * 
    * @return Request 
    */ 
    public function getRequestWithOptions($method, $uri, array $options = []) 
    { 
     $factory = new MessageFactory(); 
     return $factory->createRequest($method, $uri, $options); 
    } 
} 

И наконец:

require __DIR__ . '/../vendor/autoload.php'; 

$client = new \Library\Ras\OAuth2\Client\Provider\EbayProvider([ 
    'clientId' => '<clientId>', 
    'clientSecret' => '<clientSecret>', 
    'redirectUri' => '<RUName>', 
    'urlAuthorize' => 'https://signin.ebay.com/authorize', 
    'urlAccessToken' => 'https://api.ebay.com/identity/v1/oauth2/token', 
    'urlResourceOwnerDetails' => '', 
    'scopeSeparator' => ' ', 
    'scopes' => [ 
     'https =>//api.ebay.com/oauth/api_scope', 
     'https =>//api.ebay.com/oauth/api_scope/buy.order.readonly', 
     'https =>//api.ebay.com/oauth/api_scope/buy.order', 
    ], 
]); 

// Only if your Guzzle version is < 6.0 
$client->setRequestFactory(new \Library\Ras\OAuth2\Tool\RequestFactory()); 

if (array_key_exists('code', $_GET)) { 
    $applicationToken = $_GET['code']; 
    $accessToken = $client->getAccessToken('authorization_code', [ 
     'code' => $applicationToken, 
    ]); 
    echo 'User access token: ' . $accessToken; 
} else { 
    $url = $client->getAuthorizationUrl(); 
    header('Location: ' . $url); 
} 
+0

привет, он хорошо работает, вы можете объяснить, как генерировать токен –

+0

привет Ололо, вы можете присылать коды. я пытаюсь получить токен, сгенерированный CODE, kepp говорит invalid_request –

+0

@manokarthickkarthick, напишите новый вопрос и свяжите его здесь: мы поможем вам ... – Aerendir

 Смежные вопросы

  • Нет связанных вопросов^_^