#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