shop.product.add - оно работает? На рассмотрении

3

https://developers.webasyst.ru/api/explorer/shop/shop.product.add/
http://blog.megazubr.ru/2015/07/shop-script-apiv1.html
https://developers.webasyst.ru/forum/1620/api-funktsiya-shopproductadd/

Вот 3 ссылки, первая из которых это официальная документация, на которую, вроде как, мы должны ориентироваться. Надо ли говорить, что как в документации ничего не заработало, ибо {"error":"invalid_param","error_description":"Invalid param skus"}. Окей, пробуем как написано в 2 других статьях и результат абсолютно тот же. А теперь внимание вопрос: а сами разработчики вообще знают как работает их собственная система? И если да, то не могли бы они поделиться этими темными знаниями?

14 комментариев

  • 0
    Михаил Ушенин Михаил Ушенин 11 декабря 2017 15:26 #

    Заполните параметр 'skus' по вот такому образцу:

    [{sku: 'some-sku-code', name: 'some-sku-name', price: 100, available: 1}]

    Список полей, которые можно добавлять в этот массив для создания основного артикула при добавлении товара, можно посмотреть в описании метода product.skus.add.

    Спасибо, что сообщили о недочёте в документации! Скоро исправим.

    • +2
      Степан Родионов Степан Родионов 27 декабря 2017 12:11 #
      Внимательному читателю, конечно же, сразу очевидно, что то, что вы предложили, по сути аналогично конструкции из второй ссылки из 3, что я указал, только вы используете JSON представление того же массива.
       'skus' => array(
           '0' => array(
                'sku' => $product['articul'],
                'name' => $product['name'],
                'price' => $product['price'],
            ),
      ),

      Оба варианта: ваш и указанный порождают все то же {"error":"invalid_param","error_description":"Invalid param skus"}. И вот тут мне уже стало интересно, пришлось лезть в код самостоятельно. Опытным путем удалось установить, что скрипт падает в файле shop.product.add.method.php на вызове $this->checkSku($data). Но почему?

      Метод этот находится в классе shopProductUpdateMethod, от которого наследуется shopProductAddMethod - мы работаем с ним при добавлении продукта. И в этом методе ошибка происходит в фрагменте, который я привожу ниже

      if (!is_array($data['skus'])) {
      	throw new waAPIException('invalid_param', 'Invalid param skus');
      }

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

      [{sku: 'some-sku-code', name: 'some-sku-name', price: 100, available: 1}]

      порождает ошибку, она не массив. НО почему же тогда передача массива в $_POST тоже приводит к ошибке?

      Ответ прост - где-то на пути от файла api.php и до shop.product.add.method.php наш $_POST['skus'] превращается в Array. ShopScript приводит поля поста к строке!

      Что это значит для нас, как пользователей? А то, что в SS7 добавить товар с помощью API невозможно В ПРИНЦИПЕ!!! Ибо в checkSku() должен оказаться массив, а он туда никак и никогда не попадет. Мне правда очень интересно узнать - вы никогда не тестировали такую очевидно минорную для интернет-магазина функциональность, как добавление товаров через API или это какой-то хитрый план по продаже услуг сторонних интеграторов? Ведь чинится все в итоге элементарно. Мы передаем skus как в вашем примере, а непосредственно перед использованием прогоняем ее через json_decode. И чудо - все работает! Но обновление скорее всего убьет наше изменение. Возможно это досадное недоразумение пофиксили в каком-то из обновлений (у меня не самая актуальная версия шопскрипта), но это не избавляет разработчиков от ответственности за то, что они выпустили нерабочий продукт - эта фича должна работать "из коробки"!

      Кстати, в добавлении товаров есть еще одна фишка и на этот раз (сюрприз, сюрприз!), она имеет позитивный окрас. Мы можем заполнять features товара и тогда он создастся сразу с этими характеристиками. Не знаю, почему это не написано в документации, тем более, что как раз там все работает без плясок с бубном.

      И последнее - на случай, если кто-то из разработчиков будет это читать. Самый лучший способ понять, что от нас хочет получить API шопскрипта это не ныть тут и не читать туториал, который либо безнадежно устарел, либо никогда не задумывался как рабочий, а открыть вкладку network в консоли и сделать из админки то, что хочется сделать через API. Вот вам и список полей в правильном формате.

      • +1
        Михаил Ушенин Михаил Ушенин 27 декабря 2017 18:06 #
        НО почему же тогда передача массива в $_POST тоже приводит к ошибке?

        В тестовом магазине этого не происходит. Нужно диагностировать проблему в вашем частном случае. Или покажите, как она проявляется в магазине, созданном с помощью последней версии Shop-Script и Webasyst, потому что у вас

        не самая актуальная версия шопскрипта
      • +1
        Владимир Владимир 3 февраля 2023 18:33 #

        Какое сейчас актуальное заполнение параметра 'sku'? Желательно пример, который сработает в Postman.

      • +1
        Владимир Владимир 4 февраля 2023 18:03 #

        Прикладываю скриншот как заполнил параметр skus. И пробовал еще с десяток разных вариантов. Просьба подсказать верный.

        • +1
          Михаил Ушенин Михаил Ушенин 6 февраля 2023 11:06 #

          Попробуйте вместо «x-www-form-urlencoded» выбрать «raw» и вписать содержимое POST-запроса в формате JSON.

        • 0
          Den Den 5 июля 2022 16:02 #

          Столкнулся с такой же проблемой, отправляю:

          data = {
              "type_id": 1,
              "name": "Тестовый товар",
              "price": 100,
              "sku_type": 1,
              "skus": [
                  {
                      "sku": "abc",
                      "name": "abc",
                      "price": 100,
                      "count": 5,
                      "available": 1,
                  }
              ]
          }

          Получаю:

          {
              "error": "invalid_param",
              "error_description": "Invalid param skus"
          }

          Если поменять sku_type=1 и удалить skus то всё работает

          data = {
              'type_id': 1,
              'name': 'Тестовый товар',
              'price': 100,
              'sku_type': 1
          }

          Если просто поменять sku_type=0 то будет ругаться на обязательный параметр skus, кстати в документации к API он необязательный (skus POST Необязательно):

          {
              "error": "invalid_param",
              "error_description": "Required parameter is missing: skus"
          }

          Замкнутый круг какойто

          Кстати ещё про документацию к API в ней кода ошибки "invalid_request" не описано



          • +1
            Den Den 5 июля 2022 16:26 #

            *Опечатка, код ошибки который не описан: invalid_param

          • +1
            Anton F Anton F 6 июля 2022 22:09 #
            Для товаров в режиме «Выбор параметров» (sku_type = 1) параметр 'skus' оправлять не нужно.

          • +1
            Динар Калимуллин Динар Калимуллин 9 сентября 2022 12:50 #

            Добрый день! Возможно кто-то сможет подсказать.

            У меня ошибка не возникает, товар создается, но без цены. Указываю sku_type=1 и не передаю skus

            Отравляю post в http_build_query($queryData)

            Получается такая строка:

            name=Жидкая+добавка+GBS+Amino+Liquid+Тутти-фрутти+0,5л&type_id=12&meta_title=Купить+Жидкая+добавка+GBS+Amino+Liquid+Тутти-фрутти+0,5л&meta_keywords=Купить+Жидкая+добавка+GBS+Amino+Liquid+Тутти-фрутти+0,5л&status=1&price=390&sku_type=1

            Цены нет: http://joxi.ru/brReEP8HBl85EA

            • +1
              Anton F Anton F 12 сентября 2022 02:55 #
              Отравляю post в http_build_query($queryData)

              а не надо отправлять POST данные как GET

              попробуйте указать валюту и заполнить остальные "price" поля - помню с этим раньше возникали проблемы

              • +1
                Динар Калимуллин Динар Калимуллин 13 сентября 2022 10:42 #


                а не надо отправлять POST данные как GET

                Я и не передаю POST как GET данные или как их передавать?

                Я передаю сейчас вот так, и все остальные методы работают: http://joxi.ru/KAxYd85SVPeE8r

                Пробовал в json и Content-Type:application/json - не работает

                Добавил currency=RUB, остальных параметров не нашел связанных с ценой. Кроме скидок, но это уж явно не обязательное, я надеюсь. currency=643 тоже пробовал.

                currency=RUB&name=Жидкая+добавка+GBS+Amino+Liquid+Тутти-фрутти+0,5л&type_id=12&meta_title=Купить+Жидкая+добавка+GBS+Amino+Liquid+Тутти-фрутти+0,5л&meta_keywords=Купить+Жидкая+добавка+GBS+Amino+Liquid+Тутти-фрутти+0,5л&status=1&price=390.00&sku_type=1

                • +1
                  Anton F Anton F 14 сентября 2022 08:44 #

                  лучше передавать массив, curl сам установит нужный заголовок Content-Type

                  остальных параметров не нашел связанных с ценой

                  base_price_selectable, min_price, max_price

                  • +1
                    Динар Калимуллин Динар Калимуллин 14 сентября 2022 10:38 #

                    Добрый день! сделал все по вашим рекомендациям. Цена в товаре не появилась.

                    Убрал CURLOPT_HTTPHEADER и в CURLOPT_POSTFIELDS передаю массив:

                    Array ( [currency] => RUB [name] => Жидкая добавка GBS Amino Liquid Тутти-фрутти 0,5л [type_id] => 12 [meta_title] => Купить Жидкая добавка GBS Amino Liquid Тутти-фрутти 0,5л [meta_keywords] => Купить Жидкая добавка GBS Amino Liquid Тутти-фрутти 0,5л [status] => 1 [price] => 390.00 [base_price_selectable] => 390.00 [min_price] => 390.00 [max_price] => 390.00 [sku_type] => 1 )

                    Код:

                    function ssrequest($method, $params, $type, $queryData=[]) {    $link = 'http://localhost:8888/api.php/'.$method.'?'.$params;     $curl = curl_init();    curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);    curl_setopt($curl,CURLOPT_URL, $link);    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $type);  if ($type == 'POST') {    echo '<br><br>';    echo $link;    echo '<br><br>';    echo print_r($queryData);    echo '<br><br>';    curl_setopt($curl, CURLOPT_POSTFIELDS, $queryData);  }    curl_setopt($curl,CURLOPT_HEADER, false);    $out = curl_exec($curl);    $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);    curl_close($curl);    if ($type == 'POST') echo $out;  $result = json_decode($out, 1);   return $result; }

                    Ответ:

                    {"id":"963","name":"Жидкая добавка GBS Amino Liquid Тутти-фрутти 0,5л","summary":null,"meta_title":"Купить Жидкая добавка GBS Amino Liquid Тутти-фрутти 0,5л","meta_keywords":"Купить Жидкая добавка GBS Amino Liquid Тутти-фрутти 0,5л","meta_description":null,"description":null,"contact_id":"1","create_datetime":"2022-09-14 07:37:25","edit_datetime":null,"status":"1","type_id":"12","image_id":null,"image_filename":"","video_url":null,"sku_id":"2458","ext":null,"url":"963","rating":"0.00","price":"0.0000","compare_price":"0.0000","currency":"RUB","min_price":"0.0000","max_price":"0.0000","tax_id":null,"count":null,"count_denominator":"1","order_multiplicity_factor":"1.000","stock_unit_id":"0","base_unit_id":"0","stock_base_ratio":"1.00000000","order_count_min":"1.000","order_count_step":"1.000","base_price":"0.0001","min_base_price":"0.0001","max_base_price":"0.0001","cross_selling":null,"upselling":null,"rating_count":"0","total_sales":"0.0000","category_id":null,"badge":null,"sku_type":"1","base_price_selectable":"390.0000","compare_price_selectable":"0.0000","purchase_price_selectable":"0.0000","sku_count":"1","skus":[{"id":"2458","product_id":"963","sku":"","sort":"1","name":"","image_id":null,"price":0,"primary_price":0,"purchase_price":0,"compare_price":0,"count":null,"available":"1","status":"1","stock_base_ratio":null,"order_count_min":null,"order_count_step":null,"dimension_id":null,"file_name":"","file_size":"0","file_description":null,"virtual":"0","stocks":[]}],"categories":[],"images":[],"features":{"general":"","lampy":"","razmery":"","colour_and_material":"","additional":""}}

                    Добавить комментарий

                    Чтобы добавить комментарий, зарегистрируйтесь или войдите