Статьи

Добавление продуктов в ваш магазин eBay с помощью Trading API

В этой третьей и последней части нашей серии eBay Trading API мы будем встраивать функции добавления продуктов в наше приложение.

Создание новых продуктов

Теперь, когда мы закончили с настройками магазина, мы можем начать с написания кода для контроллера, который будет обрабатывать создание продуктов. Под каталогом controllers создайте новый файл и назовите его Product.php .

 <?php class Product extends \SlimController\SlimController{ } 

Затем создайте метод newAction . Это отобразит файл new.twig каталоге templates/product . Это представление, которое отображает форму для создания новых продуктов.

 public function newAction(){ $page_data = array( 'is_productpage' => 'true' ); $this->render('product/new', $page_data); } 

Далее создайте вид:

 {% extends "/base.twig" %} {% block content %} {{ parent() }} <div class="row"> <div class="col-md-4"> <div class="alert alert-{{ flash.message.type }}"> {{ flash.message.text }} {% for r in flash.message.data %} <li>{{ r[0] }}</li> {% endfor %} </div> </div> </div> <div class="row"> <div class="col-md-6"> <form class="form-horizontal" method="POST" action="{{ baseUrl }}/products/create"> <fieldset> <legend>Create new Product</legend> <div class="form-group"> <label for="title" class="col-lg-2 control-label">Title</label> <div class="col-lg-10"> <input type="text" class="form-control" id="title" name="title" value="{{ flash.form.title }}"> </div> </div> <div class="form-group"> <label for="category" class="col-lg-2 control-label">Category</label> <div class="col-lg-10" id="categories-container"> </div> </div> <div class="form-group"> <label for="price" class="col-lg-2 control-label">Price</label> <div class="col-lg-10"> <input type="text" class="form-control" id="price" name="price" value="{{ flash.form.price }}"> </div> </div> <div class="form-group"> <label for="quantity" class="col-lg-2 control-label">Quantity</label> <div class="col-lg-10"> <input type="text" class="form-control" id="quantity" name="quantity" value="{{ flash.form.quantity }}"> </div> </div> <div class="form-group"> <label for="brand" class="col-lg-2 control-label">Brand</label> <div class="col-lg-10"> <input type="text" class="form-control" id="brand" name="brand" value="{{ flash.form.brand }}"> </div> </div> <div class="form-group"> <label for="description" class="col-lg-2 control-label">Description</label> <div class="col-lg-10"> <textarea class="form-control" rows="3" id="description" name="description" value="{{ flash.form.description }}">{{ flash.form.description }}</textarea> </div> </div> <div class="form-group"> <div class="col-lg-10 col-lg-offset-2"> <button type="submit" class="btn btn-primary">Add Product</button> </div> </div> </fieldset> </form> </div> <div class="col-md-6"> <h5>Upload Photos</h5> <form action="{{ baseUrl }}/upload" method="POST" class="dropzone" id="photosdropzone" enctype="multipart/form-data"></form> </div> </div> {% include 'partials/categories.html' %} {% endblock %} 

Разбивая его, в начале мы выводим предупреждающее сообщение. Мы передадим значения для этого позже, когда добавим код для создания продуктов. flash — это глобальная переменная, в которой данные сеанса, которые мы передаем, временно сохраняются:

 <div class="alert alert-{{ flash.message.type }}"> {{ flash.message.text }} {% for r in flash.message.data %} <li>{{ r[0] }}</li> {% endfor %} </div> 

Далее следует название продукта и другие необходимые сведения о продукте. Обратите внимание, что в большинстве случаев требуются только название продукта, описание, количество, цена и изображение продукта. Здесь мы добавили бренд, потому что в некоторых случаях это требуется. Общий термин для этого вида поля является условным полем. Обычно это зависит от категории продукта, требуется ли он или нет. Некоторые категории требуют больше полей, чем другие, поэтому обязательно ознакомьтесь с документацией по вызову AddItem API, чтобы убедиться, что вы ничего не пропустили.

 <input type="text" class="form-control" id="title" name="title" value="{{ flash.form.title }}"> 

Для категории продукта мы будем загружать ее позже через AJAX, поскольку она будет зависеть от названия продукта, введенного пользователем.

 <label for="category" class="col-lg-2 control-label">Category</label> <div class="col-lg-10" id="categories-container"> </div> 

Далее следует форма, которую пользователь будет использовать для загрузки изображений товара:

 <form action="{{ baseUrl }}/upload" method="POST" class="dropzone" id="photosdropzone" enctype="multipart/form-data"></form> 

Используется маршрут /upload для обработки загруженных файлов. Объявите метод для обработки этого маршрута в классе Product :

 public function uploadAction(){ $storage = new \Upload\Storage\FileSystem('uploads'); $file = new \Upload\File('file', $storage); $new_filename = uniqid(); $file->setName($new_filename); $_SESSION['uploads'][] = $new_filename . '.' . $file->getExtension(); $file->addValidations(array( new \Upload\Validation\Mimetype(array('image/png', 'image/gif', 'image/jpg')), new \Upload\Validation\Size('6M') )); $errors = array(); try{ $file->upload(); }catch(Exception $e){ $errors = $file->getErrors(); } $response_data = array( 'errors' => $errors ); echo json_encode($response_data); } 

Разбивая метод uploadAction() , сначала мы указываем путь загрузки. В этом случае мы используем каталог uploads . Убедитесь, что вы предоставили ему необходимые права доступа к каталогу, чтобы мы могли загружать в него файлы:

 $storage = new \Upload\Storage\FileSystem('uploads'); 

Далее мы указываем поле, которое мы используем для загрузки файлов. Возвращаясь к форме для загрузки, мы не указали там никаких полей <input type="file"> . Это потому, что нам не нужно. По умолчанию dropzone использует file качестве имени поля по умолчанию для загрузки файлов, поэтому мы указываем его в качестве первого аргумента для метода File , второй аргумент — это хранилище, которое мы создали ранее:

 $file = new \Upload\File('file', $storage); 

Далее мы даем файлу уникальное имя. Вы можете проявить креативность здесь, если хотите, но если вы не чувствуете креативности, тогда просто используйте метод uniqid() для генерации уникального имени файла:

 $new_filename = uniqid(); $file->setName($new_filename); 

Вставьте имя файла в элемент сеанса uploads чтобы мы могли использовать его позже.

 $_SESSION['uploads'][] = $new_filename . '.' . $file->getExtension(); 

Далее мы добавим некоторые проверки файлов. Мы просто говорим, что он принимает только изображения в формате png, gif и jpg, и максимальный размер файла должен быть всего 6 Мб.

 $file->addValidations(array( new \Upload\Validation\Mimetype(array('image/png', 'image/gif', 'image/jpg')), new \Upload\Validation\Size('6M') )); 

Наконец, мы пытаемся загрузить файл и назначить все ошибки, которые мы получаем, и вернуть их клиентской стороне. Но мы на самом деле не будем использовать эту ошибку на стороне клиента, так как dropzone уже окрыли нас. Он отображает метку x для загруженного файла, если файл не прошел проверку:

 $errors = array(); try{ $file->upload(); }catch(Exception $e){ $errors = $file->getErrors(); } $response_data = array( 'errors' => $errors ); echo json_encode($response_data); 

Возвращаясь к шаблону для добавления новых продуктов, мы включаем частичное. Это шаблон, который будет использоваться для отображения предлагаемых категорий продуктов.

 {% include 'partials/categories.html' %} 

Он содержит следующее:

 {% raw %} <script id="categories-template" type="text/x-handlebars-template"> {{#each categories}} <div class="radio"> <label> <input type="radio" name="category_id" id="category_id" value="{{id}}"> {{name}} </label> </div> {{/each}} </script> {% endraw %} 

В приведенном выше шаблоне мы используем Handlebars. Его синтаксис вступает в противоречие с синтаксисом ветки, поэтому мы должны заключить его в теги {% raw %} чтобы ветка не анализировала его.

Затем создайте файл dropzone-options.js каталоге /assets/js и добавьте следующее:

 (function(){ Dropzone.options.photosdropzone = { acceptedFiles: "image/*", autoProcessQueue: true, uploadMultiple: false, maxFiles: 5 }; })(); 

Это позволяет нам указать параметры для dropzone. Вот разбивка каждого варианта:

  • acceptedFiles — тип файла, который можно загрузить.
  • autoProcessQueue — логическое значение, указывающее, обрабатывать ли очередь немедленно или нет.
  • uploadMultiple — логическое значение, указывающее, разрешать ли загрузку нескольких файлов. В этом случае мы выбрали false но это не значит, что мы не можем загрузить более одного изображения. Это означает, что мы не можем загрузить более одного изображения одновременно.
  • maxFiles — целочисленное значение для указания максимального количества файлов, которые могут быть загружены.

Затем создайте файл new-product.js и добавьте следующее:

 (function(){ var categories_template = Handlebars.compile($("#categories-template").html()); $('#title').blur(function(){ var title = $(this).val(); $.post( '/tester/ebay_trading_api/categories', { 'title' : title }, function(response){ var categories = JSON.parse(response); var html = categories_template({'categories' : categories}); $('#categories-container').html(html); } ); }); })(); 

Код выше делает POST-запрос каждый раз, когда пользователь выходит из поля названия продукта. Затем запрос возвращает массив объектов, содержащих предложенные категории, на основе названия продукта. Метод, который используется в этом вызове, находится в классе Product . Он вызывает метод getSuggestedCategories() в классе Ebay , передавая название продукта в качестве аргумента. Затем ответ преобразуется в строку JSON и выводится:

 public function categoriesAction(){ $suggested_categories = $this->app->ebay->getSuggestedCategories($_POST['title']); echo json_encode($suggested_categories); } 

Откройте класс Ebay и добавьте следующий метод:

 public function getSuggestedCategories($title){ $requestBody = '<?xml version="1.0" encoding="utf-8"?> <GetSuggestedCategoriesRequest xmlns="urn:ebay:apis:eBLBaseComponents"> <RequesterCredentials> <eBayAuthToken>' . $this->user_token . '</eBayAuthToken> </RequesterCredentials> <Query>' . $title . '</Query> </GetSuggestedCategoriesRequest>'; $response = $this->request('GetSuggestedCategories', $requestBody); $suggested_categories = array(); if($response->Ack == 'Success'){ foreach($response->SuggestedCategoryArray->SuggestedCategory as $category){ $suggested_categories[] = array( 'id' => json_decode(json_encode($category->Category->CategoryID), true)[0], 'name' => json_decode(json_encode($category->Category->CategoryName), true)[0] ); } } return $suggested_categories; } 

Вышеуказанный метод делает запрос к методу API GetSuggestedCategories . Этот вызов принимает название продукта в качестве аргумента, как передано в поле Query . Если вызов успешен, он возвращает массив предложенных категорий. Нам просто нужно извлечь идентификатор категории и название категории из результата, который она возвращает.

Теперь мы готовы написать метод createAction . Здесь мы сохраняем информацию о продукте в базу данных и создаем продукт на Ebay.

 public function createAction(){ $v = new Valitron\Validator($_POST); $v->rule('required', array('title', 'category_id', 'price', 'quantity', 'brand', 'description')); $v->rule('numeric', 'price'); $v->rule('integer', 'quantity'); if($v->validate()){ if($query = $this->app->db->prepare("INSERT INTO products SET title = ?, category_id = ?, price = ?, qty = ?, brand = ?, description = ?")){ $store_settings_result = $this->app->db->query("SELECT payment_profile, return_profile, shipping_profile, out_of_stock_control, get_it_fast, category_prefill, category_mapping, condition_type, country_code_type, currency_code, dispatch_time, optimal_picturesize, listing_duration, listing_type, item_location, postal_code, store_name, county, street, ebay_website, shippingservice_priority, shipping_service, shippingservice_cost, shippingservice_additionalcost FROM store_settings WHERE id = 1"); $store_settings = $store_settings_result->fetch_object(); $response = $this->app->ebay->addItem($store_settings, $_POST); if($response->Ack == 'Success'){ $title = $_POST['title']; $category_id = $_POST['category_id']; $price = $_POST['price']; $qty = $_POST['quantity']; $brand = $_POST['brand']; $description = $_POST['description']; $query->bind_param("ssdiss", $title, $category_id, $price, $qty, $brand, $description); $query->execute(); $this->app->flash('message', array('type' => 'success', 'text' => 'Product was created!')); }else{ $long_message = json_decode(json_encode($response->Errors->LongMessage), true); $this->app->flash('message', array('type' => 'danger', 'text' => $long_message[0])); } } }else{ $this->app->flash('form', $_POST); $this->app->flash('message', array( 'type' => 'danger', 'text' => 'Please fix the following errors', 'data' => $v->errors()) ); } $this->app->redirect('/tester/ebay_trading_api/products/new'); } 

Разбивая это. Сначала мы объявляем новый экземпляр valitron, передавая все значения, которые в данный момент хранятся в глобальной переменной $_POST :

 $v = new Valitron\Validator($_POST); 

Далее мы добавим правила. В основном все поля обязательны для заполнения, цена должна быть числовым значением, а количество — целым числом. Мы указали это, используя метод rule который принимает фактическое правило в качестве первого аргумента, и имя поля в качестве второго аргумента:

 $v->rule('required', array('title', 'price', 'quantity', 'brand', 'description')); $v->rule('numeric', 'price'); $v->rule('integer', 'quantity'); 

Далее мы проверяем, используя метод validate() . Если это возвращает true тогда проверка прошла успешно, в противном случае это не так. Если он возвращает false тогда мы берем все данные POST и сохраняем их в сеансе вместе с сообщениями об ошибках, возвращенными valitron.

 $this->app->flash('form', $_POST); $this->app->flash('message', array( 'type' => 'danger', 'text' => 'Please fix the following errors', 'data' => $v->errors()) ); 

Если проверка прошла addItem() , мы извлекаем настройки хранилища из базы данных и предоставляем их в качестве аргумента для addItem() вместе с содержимым переменной $_POST . Метод addItem() создает продукт на eBay. Если вызов успешен, мы создаем подготовленное заявление для добавления информации о продукте в базу данных. Как только это будет сделано, мы отправим сообщение о том, что продукт создан. Если вызов не был успешным, мы передаем ответ, возвращенный API, вместе с сообщением о том, что продукт не был создан.

 $store_settings_result = $this->app->db->query("SELECT payment_profile, return_profile, shipping_profile, out_of_stock_control, get_it_fast, category_prefill, category_mapping, condition_type, country_code_type, currency_code, dispatch_time, optimal_picturesize, listing_duration, listing_type, item_location, postal_code, store_name, county, street, ebay_website, shippingservice_priority, shipping_service, shippingservice_cost, shippingservice_additionalcost FROM store_settings WHERE id = 1"); $store_settings = $store_settings_result->fetch_object(); $response = $this->app->ebay->addItem($store_settings, $_POST); if($response->Ack == 'Success'){ if($query = $this->app->db->prepare("INSERT INTO products SET title = ?, category_id = ?, price = ?, qty = ?, brand = ?, description = ?")){ $title = $_POST['title']; $category_id = $_POST['category_id']; $price = $_POST['price']; $qty = $_POST['quantity']; $brand = $_POST['brand']; $description = $_POST['description']; $query->bind_param("ssdiss", $title, $category_id, $price, $qty, $brand, $description); $query->execute(); } $this->app->flash('message', array('type' => 'success', 'text' => 'Product was created!')); }else{ $this->app->flash('message', array('type' => 'danger', 'response' => $response, 'text' => 'Product was not created!')); } $this->app->redirect('/tester/ebay_trading_api/products/new'); 

Далее мы определим метод addItem в классе Ebay . Определите 2 параметра: $store_settings и $item_data . Внутри метода объявите переменную с именем $boolean_value . Это позволяет нам преобразовать целочисленное значение 0 в строку false а целочисленное значение 1 в строку true . Нам это нужно, потому что API принимает только true или false для логических параметров.

Затем назначьте элемент сеанса uploads для переменной. Если вы помните ранее, этот элемент сеанса — это то, где мы выдвигали имена файлов изображений, загруженных пользователем. Далее идет $baseupload_url , он содержит базовый URL, в котором можно найти все загруженные изображения. Нам это нужно, потому что UploadSiteHostedPictures API UploadSiteHostedPictures принимает только URL для загрузки на ebay. Это также означает, что вам нужен реальный сервер, доступный через общедоступный интернет. Метод UploadSiteHostedPictures принимает только один URL-адрес за один раз, поэтому нам нужно UploadSiteHostedPictures по всем изображениям и указать фактический URL-адрес в качестве значения для поля ExternalPictureURL . Если запрос выполнен успешно, мы просто добавляем новый URL-адрес изображения, который возвращается в переменную $picture_details . Это будет использоваться в качестве одного из аргументов, переданных в вызов для фактического создания продукта на eBay.

Далее мы делаем запрос на добавление товара на eBay. Это можно сделать с помощью метода AddItem или метода VerifyAddItem . Метод AddItem — это тот, который вы хотели бы использовать в производстве, поскольку он добавляет продукт на ebay. Если есть какие-либо сборы, они также применяются. VerifyAddItem с другой стороны, действует как метод песочницы, фактически не добавляет элемент на ebay. Вы можете использовать его, если хотите протестировать вызов AddItem . Когда вы звоните, сборы не взимаются, но он позволяет узнать, какая сумма будет взиматься или будет ли запрос действительно успешным. Обратите внимание, что вам не нужно использовать версию API песочницы для вызова метода VerifyAddItem . Вы можете использовать его даже в реальной версии API.

 public function addItem($store_settings, $item_data){ $boolean_value = array('false', 'true'); $product_images = $_SESSION['uploads']; $baseupload_url = 'http://somewhere.com/uploads/'; $picture_details = ''; if(!empty($product_images)){ foreach($product_images as $img){ $requestBody = '<?xml version="1.0" encoding="utf-8"?> <UploadSiteHostedPicturesRequest xmlns="urn:ebay:apis:eBLBaseComponents"> <RequesterCredentials> <eBayAuthToken>' . $this->user_token . '</eBayAuthToken> </RequesterCredentials> <ExternalPictureURL>' . $baseupload_url . '' . $img . '</ExternalPictureURL> </UploadSiteHostedPicturesRequest>'; $response = $this->request('UploadSiteHostedPictures', $requestBody); if(!empty($response->Ack) && $response->Ack != 'Failure'){ $uploaded_img = json_decode(json_encode($response->SiteHostedPictureDetails->PictureSetMember[3]->MemberURL), true); $picture_details .= '<PictureURL>' . $uploaded_img[0] . '</PictureURL>'; } } } $requestBody = '<?xml version="1.0" encoding="utf-8"?> <AddItemRequest xmlns="urn:ebay:apis:eBLBaseComponents"> <RequesterCredentials> <eBayAuthToken>' . $this->user_token . '</eBayAuthToken> </RequesterCredentials> <Item> <SellerProfiles> <SellerPaymentProfile> <PaymentProfileID>' . $store_settings->payment_profile . '</PaymentProfileID> </SellerPaymentProfile> <SellerReturnProfile> <ReturnProfileID>' . $store_settings->return_profile . '</ReturnProfileID> </SellerReturnProfile> <SellerShippingProfile> <ShippingProfileID>' . $store_settings->shipping_profile . '</ShippingProfileID> </SellerShippingProfile> </SellerProfiles> <OutOfStockControl>' . $store_settings->out_of_stock_control . '</OutOfStockControl> <GetItFast>' . $boolean_value[$store_settings->get_it_fast] . '</GetItFast> <CategoryBasedAttributesPrefill>' . $boolean_value[$store_settings->category_prefill] . '</CategoryBasedAttributesPrefill> <CategoryMappingAllowed>' . $boolean_value[$store_settings->category_mapping] . '</CategoryMappingAllowed> <ConditionID>' . $store_settings->condition_type . '</ConditionID> <Country>' . $store_settings->country_code_type . '</Country> <Currency>' . $store_settings->currency_code . '</Currency> <Description>' . $item_data['description'] . '</Description> <DispatchTimeMax>' . $store_settings->dispatch_time . '</DispatchTimeMax> <ListingDesigner> <OptimalPictureSize>' . $boolean_value[$store_settings->optimal_picturesize] . '</OptimalPictureSize> </ListingDesigner> <ListingDuration>' . $store_settings->listing_duration . '</ListingDuration> <ListingType>' . $store_settings->listing_type . '</ListingType> <Location>' . $store_settings->item_location . '</Location> <PictureDetails>' . $picture_details . '</PictureDetails> <PostalCode>' . $store_settings->postal_code . '</PostalCode> <PrimaryCategory> <CategoryID>' . $item_data['category_id'] . '</CategoryID> </PrimaryCategory> <Quantity>' . $item_data['quantity'] . '</Quantity> <SellerContactDetails> <CompanyName>' . $store_settings->store_name . '</CompanyName> <County>' . $store_settings->county . '</County> <Street>' . $store_settings->street . '</Street> </SellerContactDetails> <Site>' . $store_settings->ebay_website . '</Site> <StartPrice currencyID="' . $store_settings->currency_code . '">' . $item_data['price'] . '</StartPrice> <Title>' . $item_data['title'] . '</Title> <ShippingDetails> <ShippingServiceOptions> <ShippingServicePriority>' . $store_settings->shippingservice_priority . '</ShippingServicePriority> <ShippingService>' . $store_settings->shipping_service . '</ShippingService> <ShippingServiceCost currencyID="' . $store_settings->currency_code . '">' . $store_settings->shippingservice_cost . '</ShippingServiceCost> <ShippingServiceAdditionalCost currencyID="' . $store_settings->currency_code . '">' . $store_settings->shippingservice_additionalcost . '</ShippingServiceAdditionalCost> </ShippingServiceOptions> </ShippingDetails> </Item> </AddItemRequest>'; $response = $this->request('AddItem', $requestBody); return $response; } 

Чтобы прояснить ситуацию, вот разбивка параметров, которые мы передали запросу AddItem . Здесь мы проходим в профилях продавца. Единственное требование для каждого профиля продавца — это идентификатор профиля. Мы уже получили их раньше, когда выбирали настройки магазина, поэтому мы просто получаем их из базы данных.

 <SellerProfiles> <SellerPaymentProfile> <PaymentProfileID>' . $store_settings->payment_profile . '</PaymentProfileID> </SellerPaymentProfile> <SellerReturnProfile> <ReturnProfileID>' . $store_settings->return_profile . '</ReturnProfileID> </SellerReturnProfile> <SellerShippingProfile> <ShippingProfileID>' . $store_settings->shipping_profile . '</ShippingProfileID> </SellerShippingProfile> </SellerProfiles> 

OutOfStockControl — это логическое значение, указывающее, следует ли сохранить список в активном состоянии после того, как он достигнет значения 0. Установка значения true означает, что список исключается из результатов поиска и просмотра.

 <OutOfStockControl>' . $store_settings->out_of_stock_control . '</OutOfStockControl> 

GetItFast — это логическое значение, указывающее, включена ли доставка «get it fast» или нет.

 <GetItFast>' . $boolean_value[$store_settings->get_it_fast] . '</GetItFast> 

CategoryBasedAttributesPrefill — это логическое значение, указывающее, нужно ли предварительно заполнять некоторые данные элемента на основе выбранной категории.

 <CategoryBasedAttributesPrefill>' . $boolean_value[$store_settings->category_prefill] . '</CategoryBasedAttributesPrefill> 

CategoryMappingAllowed — это логическое значение, указывающее, будет ли eBay искать текущий идентификатор категории, сопоставленный с той же категорией, и использовать новый идентификатор категории для листинга или нет.

 <CategoryMappingAllowed>' . $boolean_value[$store_settings->category_mapping] . '</CategoryMappingAllowed> 

ConditionID позволяет вам указать условие товара. eBay назначил числовые значения каждому возможному состоянию товара. Проверьте таблицу на этой странице .

 <ConditionID>' . $store_settings->condition_type . '</ConditionID> 

Country позволяет указать страну, в которой находится товар. Вы можете проверить список кодов стран и их соответствующих стран на этой странице .

 <Country>' . $store_settings->country_code_type . '</Country> 

Currency позволяет указать валюту, в которой выражена цена товара.

 <Currency>' . $store_settings->currency_code . '</Currency> 

Description — это описание предмета. Вы также можете передать HTML в это поле.

 <Description>' . $item_data['description'] . '</Description> 

DispatchTimeMax — это максимальное количество дней, в течение которых товар будет отправлен или отправлен покупателю по почте. Указание 0 означает, что товар отправляется клиенту сразу после получения заказа.

 <DispatchTimeMax>' . $store_settings->dispatch_time . '</DispatchTimeMax> 

OptimalPictureSize — это логическое значение, указывающее, будет ли изображение продукта увеличено в соответствии с описанием элемента или нет.

 <ListingDesigner> <OptimalPictureSize>' . $boolean_value[$store_settings->optimal_picturesize] . '</OptimalPictureSize> </ListingDesigner> 

ListingDuration позволяет вам указать количество дней, когда вы хотите, чтобы листинг был активным. Допустимые значения можно найти на этой странице .

 <ListingDuration>' . $store_settings->listing_duration . '</ListingDuration> 

ListingType позволяет вам указать тип листинга. Допустимые значения можно найти на этой странице . Обычное значение для этого поля — Auction или FixedPriceItem .

 <ListingType>' . $store_settings->listing_type . '</ListingType> 

Location — это местоположение объекта. Это условное поле; если вы не знаете значение для PostalCode тогда вы можете просто указать значение для этого поля.

 <Location>' . $store_settings->item_location . '</Location> 

PictureDetails — это то, где мы помещаем URL-адреса изображений продуктов, которые мы загрузили на eBay.

 <PictureDetails>' . $picture_details . '</PictureDetails> 

Почтовый индекс — это почтовый индекс области, в которой находится товар. Вы можете использовать Location или это поле, чтобы указать местоположение элемента.

 <PostalCode>' . $store_settings->postal_code . '</PostalCode> 

CategoryID — это идентификатор основной категории элемента.

 <PrimaryCategory> <CategoryID>' . $item_data['category_id'] . '</CategoryID> </PrimaryCategory> 

Quantity — это целочисленное значение количества единиц определенного предмета в вашем инвентаре.

 <Quantity>' . $item_data['quantity'] . '</Quantity> 

SellerContactDetails — это место, где вы указываете контактные данные продавца. Это необязательное поле, по умолчанию используется информация о продавце. Но вы можете использовать это, чтобы переопределить настройки.

 <SellerContactDetails> <CompanyName>' . $store_settings->store_name . '</CompanyName> <County>' . $store_settings->county . '</County> <Street>' . $store_settings->street . '</Street> </SellerContactDetails> 

Site — это идентификатор сайта eBay, на котором указан продукт. Примеры включают США для США и Великобританию для Великобритании. Список допустимых значений для этого поля можно найти на этой странице .

 <Site>' . $store_settings->ebay_website . '</Site> 

StartPrice — это начальная цена предмета, когда он указан в первый раз, или когда пересматривается или пересматривается.

 <StartPrice currencyID="' . $store_settings->currency_code . '">' . $item_data['price'] . '</StartPrice> 

Title — это название продукта.

 <Title>' . $item_data['title'] . '</Title> 

ShippingDetails — это место, где вы указываете детали доставки для продукта, такие как служба доставки, которая будет использоваться, и дополнительные расходы, если таковые имеются.

 <ShippingDetails> <ShippingServiceOptions> <ShippingServicePriority>' . $store_settings->shippingservice_priority . '</ShippingServicePriority> <ShippingService>' . $store_settings->shipping_service . '</ShippingService> <ShippingServiceCost currencyID="' . $store_settings->currency_code . '">' . $store_settings->shippingservice_cost . '</ShippingServiceCost> <ShippingServiceAdditionalCost currencyID="' . $store_settings->currency_code . '">' . $store_settings->shippingservice_additionalcost . '</ShippingServiceAdditionalCost> </ShippingServiceOptions> </ShippingDetails> 

Вывод

Это оно! В этом уроке мы рассмотрели торговый API eBay. Мы узнали, что можем общаться с их API, приобретая токен для пользователя. Мы также изучаем пользовательские настройки, загружаем изображения и добавляем продукты с помощью API. Но это еще не все, что вы можете сделать с помощью Торгового API Ebay. Это довольно огромный API и почти все, что вы можете придумать, что вы можете сделать с eBay в отношении продажи продуктов, вы также можете сделать с API. Так что не забудьте проверить документы, если вам интересно. Вы можете проверить исходный код проекта, который мы создали в этом репозитории github .

Обратная связь приветствуется!