Интеграция Oauth С API Просмотра eBay

#php #api #curl #ebay-api

Вопрос:

eBay вносит изменения в свои API, закрывая API поиска в конце года. Я использую очень простое приложение на своем сайте WordPress, которое отображает продукты на основе определенного запроса, который я жестко кодирую. Я могу копировать свою страницу с помощью API просмотра, но я действительно борюсь с частью Oauth. Насколько я понимаю, для запросов на просмотр get требуется только маркер доступа к приложению (а не маркер доступа пользователя). Я просто все еще пытаюсь разобраться во всем этом. Я пытаюсь добавить функцию, которая генерирует токен аутентификации, но она не работает, и я не думаю, что вызываю эту функцию correctly…so ищу здесь помощь по нескольким вопросам. Самое главное-могу ли я сделать это таким образом? И правильно ли я ввожу переменные и как именно я могу вызвать функцию Oauth?

 <?php 
/* Template Name: XXXX */ 

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

function getOAuthCreds() {
    $endpoint = 'https://api.ebay.com/identity/v1/oauth2/token';
     
    $request = "grant_type=client_credentials";
    $request .= "scope=https://api.ebay.com/oauth/api_scope"; 

    $session = curl_init($endpoint);
     
    curl_setopt($session, CURLOPT_POST, true);
    curl_setopt($session, CURLOPT_POSTFIELDS, $request);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
     
    $headers = [
    'Content-Type: application/json',
    'Authorization = Bearer CODE HERE// I'm using the auth code generated from the application access token (not sure if thats' right?
    ];
     
    curl_setopt($session, CURLOPT_HTTPHEADER, $headers);
    $response = curl_exec($session);
    curl_close($session);
    return $response;
    }

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL => "https://api.ebay.com/buy/browse/v1/item_summary/search?q=iphoneamp;sort=-",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => array(
        "Content-Type:application/json",
        "Authorization:" getOAuthCreds(),///am i calling this correctly?
        "X-EBAY-C-MARKETPLACE-ID:EBAY_US",
        "X-EBAY-C-ENDUSERCTX:affiliateCampaignId=xx,affiliateReferenceId=xx",
    ),
  ));
  $response = curl_exec($curl);
  $err = curl_error($curl);
  curl_close($curl);

  
//print_r($response);

  if ($err) {
    if ($debug) echo "cURL Error #:" . $err;
    else echo "Oops, something went wrong.  Please try again later.";
  } else {
    //Create an array of objects from the JSON returned by the API
    $jsondata = json_decode($response);
    $resp = $jsondata->itemSummaries;

     //Create a simple grid style for the listings
     $pageCSS = "<style>
     .netflix-wrapper{
       display:grid;
       grid-template-columns: 200px 200px 200px;
     }
     .show-wrapper{padding:10px;}
     </style>";
//Create the WordPress page content HTML
$pageHTML="<h2>test</h2>";
$pageHTML.="<div class='test-wrapper'>";
//Loop through the API results
foreach($resp as $item) {
//Put each show into an html structure
//  Note: if your theme uses bootstrap use responsive classes here
$pageHTML.="<div class='show-wrapper'>";
//Not all items have a 'poster', so in that case use the img field
$pic = $item->image->imageUrl;
$itemID = $item->legacyItemId;
$link  = 'https://www.ebay.com/itm/'.$itemID.'?mkrid=ss-0amp;siteid=0amp;mkcid=1amp;campid=ssamp;toolid=ssamp;mkevt=1amp;customId=ss';
$title = $item->title;
$price = $item->price->value;
$bids =  $item->bidCount;
if(empty($bids)){
    $bids = 0;
}

// For each SearchResultItem node, build a link and append it to $results
$results .= "<div class="item"><div class="ui small image"><a href="$link" target="_blank"><img height="200px" width="130px" src="$pic"></a></div><div class="content"><div class="header"><a href="$link" target="_blank">$title</a></div><div class="meta" style="margin-top:1.1em"><span class="price"><a href="$link" target="_blank"><button class="ui teal button">watch watchers</button></a></span><div class="extra"><button class="ui button"><a href="$link" target="_blank"><b>Current Bids:</b> $bids </a></button></div><div class="extra"><a href="$link" target="_blank"><button class="ui orange button">Current Price: $price</button></a></div><div class="description"></div></div></div></div>";
 
        
//Show the image first to keep the top edge of the grid level
$pageHTML.="<img style='max-width:166px;float:left;' src='".$pic."' />";
$pageHTML.="<h3>".$item->title."</h3>";
// $pageHTML.="<span>added to netflix ".$showObj->titledate."</span>";
// $pageHTML.="<div style='float:left;'>".$showObj->synopsis."</div>";
$pageHTML.="</div>";
}
$pageHTML.="</div>";
  }
?>

<?php get_header(); ?>
<!-- Build the HTML page with values from the call response -->
<html>
<head>
<div class="wrp cnt"><div class="spr"></div>
<section class="bSe fullWidth">
<article><div class="awr lnd">
<title>Most Watched <?php echo $query; ?> on eBay</title>
<style type="text/css">body { font-family: arial,sans-serif;} </style>
<link
  rel="stylesheet"
  href="//cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css"
/>

</head>
<body>
 

Комментарии:

1. "Authorization:" getOAuthCreds(),///am i calling this correctly? — скорее всего: Нет. Конечная точка токена, скорее всего, возвращает не «голый» токен, а структуру данных JSON, содержащую сам токен, а также дополнительную информацию, например, когда срок его действия истечет.

2. И пытаться запрашивать новый токен при каждой загрузке страницы (если это то, что вы сейчас делаете?), Вероятно, также не очень хорошая идея. И если вам не нужны фактические данные «свежие» с точностью до секунды, то, вероятно, ни один из них не делает этот второй запрос при каждой загрузке страницы … результаты действительно должны быть кэшированы на некоторое время.

3. @CBroe спасибо за ответ. Я выяснил, по крайней мере, создав часть токена, и вы были на 100% правы в том, что возвращаемый объект необходимо отделить для самого токена. Как бы то ни было, я предполагаю, что запрашиваю токен при загрузке страницы, первый раз, когда я когда-либо делал это, так казалось бы в данном случае. Данные не обязательно должны быть свежими, но несколько updated…as это объявления на ebay. Есть ли у вас какие-либо советы по запросу токена, когда это действительно необходимо, или по кэшированию результатов?

4. Что касается кэширования, изучите переходные процессы. И получение нового токена, для этого, вероятно, достаточно получить новый, после того как один из ваших запросов API не удался , потому что срок действия токена истек. Затем обновите маркер и сделайте запрос еще раз.

Ответ №1:

Для справки: https://developer.ebay.com/api-docs/static/oauth-client-credentials-grant.html

Я мало что знаю о php, но, судя по вашему коду, есть несколько неправильных вещей.

1. Раздел заголовки

В function getOAuthCreds()

Заголовки должны быть:

 Content-Type = application/x-www-form-urlencoded

Authorization = Basic [B64-encoded_oauth_credentials]
 

Тип содержимого = заголовок приложения/x-www-форма-url-кодированный. eBay хочет, чтобы вы разместили сообщение на своем сервере, поэтому вам это понадобится. Не уверен, что curl автоматически добавится в заголовок.

Заголовок авторизации. Из приведенной выше ссылки на eBay в заголовке будет использоваться базовая схема аутентификации. Затем следует кодировка Base64 вашего «client_id»:»client_secret».

[B64-encoded_oauth_credentials] = Base64Encode(client_id:client_secret)

Образец:

 Authorization = Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ=
 

В случае, если вы не уверены, где взять «client_id» и «client_secret». Посетите эту страницу.
https://developer.ebay.com/api-docs/static/creating-edp-account.html

Если все правильно, вы получите следующий ответ от eBay

Образец:

 {
"access_token": "v^1.1#i^1#p^1#r^0#I^3#f^0#t^H4s ... wu67e3xAhskz4DAAA",
"expires_in": 7200,
"token_type": "Application Access Token"
}
 

Ответ » access_token От » будет действителен в течение 7200 секунд. Кэшируйте и повторно используйте его, как упоминалось в предыдущем комментарии. Когда срок его действия истечет, получите новый access_token .

2. При вызове API просмотра

Вы будете использовать access_token заголовок авторизации (в вызове API просмотра) следующим образом.

Образец:

 Authorization: Bearer v^1.1#i^1#p^1#r^0#I^3#f^0#t^H4s ... wu67e3xAhskz4DAAA