Примеры работы с API через PHP

Комментарии

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

  • Ivan Pivkin

    Добрый день!
    Неплохой пример вот здесь https://github.com/Tooyz/moysklad

    0
    Действия с комментариями Постоянная ссылка
  • Видел я тот SDK... Дело в том что я PHP знаю постольку поскольку, скажем на троечку, и мне он показался сложноватым для понимая.

    Опять же там речь идет о работе с API используя этот SDK, а я прошу простой пример работы на чистом PHP.

    Хотя бы пример как вообще подключиться к этому API, ну никак не могу разобраться! У меня есть логин и пароль для входа на сайт https://www.moysklad.ru - эти же логин и пароль использовать для API ? Потому что логин выглядит вот так admin@emshop - то есть в нем есть символ @, и мне кажется что для подключения к API не должно быть такого символа в логине...

    Короче, помогите какими-то примитивами, а то вообще не знаю как к этому подступиться. 

    0
    Действия с комментариями Постоянная ссылка
  • Дмитрий

    Добрый день!

    По вопросам php не консультируем.

    Для авторизации в АПИ используется такой же логин как и на сайте, то есть из вашего примера, логин в АПИ будет admin@emshop.

    0
    Действия с комментариями Постоянная ссылка
  • Отлично. Примеров нет, консультаций не даем - разбирайтесь сами как хотите. Волшебная тех. поддержка.

    0
    Действия с комментариями Постоянная ссылка
  • Добрый день!

     

    Все примеры запросов и ответов представлены в документации https://online.moysklad.ru/api/remap/1.1/doc/index.html - их можно опробовать через curl, если интересует формат обмена.

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

     

    По вопросу авторизации выше - в нашем АПИ используется basic-авторизация по логину-парою от МоегоСклада, отдельных credentials для АПИ нет. Для подклчения к АПИ символ @ никак не мешает - вам нужно исопльзовать именно этот логин. Подробнее об авторизации - https://online.moysklad.ru/api/remap/1.1/doc/index.html#header-аутентификация

    1
    Действия с комментариями Постоянная ссылка
  • С авторизацией я разобрался, а так же научился создавать новый заказ и доп. поля к нему.

    "Но в качестве рекомендации даем ссылки на СДК наших интеграторов."

    У вас к сожалению лишь одна ссылка на какой-то мутный SDK, автор которого написал, что там еще пилить его и пилить. Лучше бы вы давали так же ссылки на конкретные примеры работы со Складом по данному языку.

    А на вопрос общего плана вы можете ответить? Не касаемо конкретной реализации.

    При добавлении товара если не указать его цену, то она автоматически не подставляется из самого товара. Хотя она в нем указана. И в результате цена заказа 0. Можно ли сформировать такой запрос API чтобы цена бралась та, что задана у товара по умолчанию?

    1
    Действия с комментариями Постоянная ссылка
  • Дмитрий

    Добрый день!

    Можете предоставить более подробную информацию о том куда и как вы добавляете товар?

    0
    Действия с комментариями Постоянная ссылка
  • Куда - создаю новый заказ в него и добавляю.

    Как - стандартным описанным в документации способом.

    Вот кусок PHP кода:

    $product_id = '56474ec4-a355-11e8-9ff4-31500042cb83';
    $post['positions'][0]['quantity'] = 5;
    $post['positions'][0]['assortment']['meta']['href'] = "https://online.moysklad.ru/api/remap/1.1/entity/product/$product_id";
    $post['positions'][0]['assortment']['meta']['type'] = "product";
    $post['positions'][0]['assortment']['meta']['mediaType'] = "application/json";

    То есть, как видите я указываю количество, но не указываю стоимость товара. Потому что стоимость у товара задана уже вот здесь https://yadi.sk/i/52mdXB75EjI6EA

    Но после выполнения запроса получаю новый заказ с пустым значением цены в товаре: https://yadi.sk/i/h_Rn-pZLXL9q-g

     

    0
    Действия с комментариями Постоянная ссылка
  • Дмитрий

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

    Если вы хотите создать заказ покупателя в котором в стоимости продажи будет проставлена цена товара, то вы можете предварительно запросить сам товар, и полученую в нем цену передать как стомоисть продажи.

    0
    Действия с комментариями Постоянная ссылка
  • Выглядит немного странным что у товара есть цена, но чтобы ее проставить в заказе надо сделать дополнительный отдельный запрос на ее получение... Казало бы куда уж логичнее дать возможность подставить ее из товара. Ну ок. Если никак иначе, значит так.

    Помоги пожалуйста еще с таким моментом. Чтобы добавить в новый заказ какой-то существующий товар, надо знать его ID и потом использовать его как в моем примере выше. Вопрос - где взять этот ID?

    Мы предполагали, этот ID указывается в URL при редактировании товара, вот пример https://online.moysklad.ru/app/#good/edit?id=564746e4-a355-11e8-9ff4-31500042cb81

    Но оказалось, что это не так. С таким ID товар не выбирается при создании заказа. А выбирается только вот с таким ID: 56474ec4-a355-11e8-9ff4-31500042cb83

    Этот ID товара я смог получить только путем запроса к API. Как видите эти 2 ID очень похожи, но все же разные. Почему так? Почему нельзя использовать для товара тот же ID что и в URL при его редактировании? И откуда нам брать "правильный" ID, чтобы по нему добавлять товар в заказ?

    0
    Действия с комментариями Постоянная ссылка
  • Добрый день!

     

    Указанный вами ID из ссылки https://online.moysklad.ru/app/#good/edit?id=564746e4-a355-11e8-9ff4-31500042cb81 фигурирует в параметре uuidHref - Ссылка на объект на UI. Присутствует не во всех сущностях. Может быть использована для получения uuid

    Подробнее - https://online.moysklad.ru/api/remap/1.1/doc/index.html#header-метаданные 

    0
    Действия с комментариями Постоянная ссылка
  • Откуда мы можем взять тот ID, по которому можно получить цену товара и потом по нему же добавить товар в заказ? Он где то доступен в интерфейсе?

    0
    Действия с комментариями Постоянная ссылка
  • Нет, данный ID доступен только через АПИ

    Предполагается, что если вы строите интеграцию через АПИ, вам нет смысла завязываать на UUID с UI. В таком кейсе uuidHref носит чисто справочную информацию

    0
    Действия с комментариями Постоянная ссылка
  • Андрей Тарасов

    Смотрите, я создаю добавляю товар в заказ как написано в документации. Там есть вот такая строка

    "href": "https://online.moysklad.ru/api/remap/1.1/entity/product/8b382799-f7d2-11e5-8a84-bae5000003a5",

    Вот эта часть строки 8b382799-f7d2-11e5-8a84-bae5000003a5 - это как раз тот ID, который можно получить как вы говорите только через API. Но откуда мне их взять для каждого товара? Писать какой то отдельный скрипт, который будет получать и выводить все ID для всех товаров?

    Может товар можно добавить в заказ по другому? Чтобы вместо этого ID использовать что-то, что видно при редактировании товара через интерфейс пользователя?

    0
    Действия с комментариями Постоянная ссылка
  • Запросить ID товаров в АПИ вы можете только через запрос списка товаров. И далее выбирать например по имени, какой подставлять в заказ

    0
    Действия с комментариями Постоянная ссылка
  • Тут приходится строить более сложную интеграцию.
    Мы выгружаем на сайт id всех товаров из МС и цены, чтобы сайт при отправке заказа мог использовать эти id.

    Сопоставление товаров при выгрузке у нас делается по полю "код товара" (в МС нужно включить флажок, чтобы проверялась уникальность этого поля).

    Да, неудобно, что в АПИ нет возможности при создании заказа указывать коды товаров или артикулы, и что он не ставит сам цены по умолчанию.
    Однако указывать цены самим - это вполне правильно. Цена в заказе может быть со скидкой. Цены на товар могут меняться - заказ добавляли в корзину вчера, а подтвердили сегодня - а цены вдруг оп - другие. У клиента могут быть персональные цены. Заказ на сайте может обновиться и т.д. В итоге очень удобно, когда у каждого заказа тупо свои цены.

     

    0
    Действия с комментариями Постоянная ссылка
  • Создаю счет на основе заказа покупателю:

    $post['customerOrder']['meta']['href'] = "https://online.moysklad.ru/api/remap/1.1/entity/customerorder/1032c0df-b371-11e8-9109-f8fc00113870";
    $post['customerOrder']['meta']['type'] = 'customerorder';
    $post['customerOrder']['meta']['mediaType'] = 'application/json';
    $url = 'https://online.moysklad.ru/api/remap/1.1/entity/invoiceout/new';

    В ответ получаю ошибку 

    [error] => Неопознанный путь: invoiceout/new
    [code] => 1002

    Что делать? Путь-то вроде верный, скопирован из доков...

    0
    Действия с комментариями Постоянная ссылка
  • Дмитрий

    Приведенной вами части кода недостаточно, что бы определить в чем заключается проблема.
    Можете предоставить выполняемый вами запрос в виде curl-запроса?

    0
    Действия с комментариями Постоянная ссылка
  • Проблема была в том, что запрос на создание шаблона счета должен идти методом PUT, а я посылал его методом POST.

    Поменял POST на PUT и в результате получил некий новый шаблон созданный на основании заказа покупателя. Что мне с ним дальше делать? Как создать счет на основании этого шаблона?

    Моя конечная цель - отметить, что заказ покупателя был оплачен.

    0
    Действия с комментариями Постоянная ссылка
  • Дмитрий
    Поменял POST на PUT и в результате получил некий новый шаблон созданный на основании заказа покупателя.
    Что мне с ним дальше делать? Как создать счет на основании этого шаблона?

    Для создания счета на основе шаблона, вам необходимо отправить полученый объект в запросе к ендпоинту

    POST /entity/invoiceout

    Не забудьте задать в полученном объекте значение поля name, так как в шаблоне оно отсутвует, но является обязательным для создания.

    В ответ на запрос создания счета покупателю, вам прийдет json объект созданного счета, вам необходимо скопировать объект meta созданного счета, он потребуется далее.

    Моя конечная цель - отметить, что заказ покупателя был оплачен.

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

    Для привязки полученного счета покупателя к заказу, через ендпоинт

    PUT /entity/customerorder/{id}

    Передаем в поле invoicesOut, в массиве, полученный ранее объект метаданных счета покупателю. Таким образом счет покупателя будет привязан к заказу покупателя.

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

    GET /entity/customerorder/metadata

     

    0
    Действия с комментариями Постоянная ссылка
  • Андрей Тарасов
    Не забудьте задать в полученном объекте значение поля name,
    так как в шаблоне оно отсутвует, но является обязательным для создания.

    Почему обязательным? Ведь пустой обычный счет создается и без него отлично. Требует только поля Организация и Контрагент.

    При этом номер счета автоматически нумеруется дальше - и это отлично.

    0
    Действия с комментариями Постоянная ссылка
  • Андрей Тарасов
    Для привязки полученного счета покупателя к заказу,
    через ендпоинт передаем в поле invoicesOut, в массиве,
    полученный ранее объект метаданных счета покупателю.
    Таким образом счет покупателя будет привязан к заказу покупателя.

    Зачем? Мы же создали счет на основе шаблона и он автоматически привязался к заказу. У вас и в документации про это написано. Собственно ради этого шаблон и создавался, чтобы в него автоматически подтянулись позиции заказа и автоматически привязался счет.

     

    0
    Действия с комментариями Постоянная ссылка
  • Андрей Тарасов

    И третий, самый важный вопрос - как средствами API привязать входящий платеж к конкретному заказу покупателя?

    Пробовал создать входящий платеж на основании заказа покупателю, в надежде, что он как и счет сам привяжется, но почему то привязки не происходит. Как это правильнее и проще сделать? Создавая шаблон платежа или создавая отдельно платеж и потом как-то привязывая его к заказу?

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

    $post['operations']['meta']['href'] = "https://online.moysklad.ru/api/remap/1.1/entity/customerorder/$order_id";
    $post['operations']['meta']['metadataHref'] = 'https://online.moysklad.ru/api/remap/1.1/entity/customerorder/metadata';
    $post['operations']['meta']['type'] = 'customerorder';
    $post['operations']['meta']['mediaType'] = 'application/json';

    и отправляю PUT на адрес https://online.moysklad.ru/api/remap/1.1/entity/paymentin/new

    В ответ получаю некий шаблон, который заполнен как бы частично. Например в нем не стоит сумма (ожидалось, что она подтянется из заказа). Организация указана, но нет контрагента.

    Вот полный код полученного шаблона https://yadi.sk/d/tZWZspXGUqOc7A

    0
    Действия с комментариями Постоянная ссылка
  • Добрый день!

     

    Все верно, если данное поле не указать, оно будет заполнено автоматически

    0
    Действия с комментариями Постоянная ссылка
  • Привязать входящий платеж к заказу покупателя вы можете через метод создания нового платежа https://online.moysklad.ru/api/remap/1.1/doc/index.html#документ-входящий-платеж-входящие-платежи-post, заполнив массив operations - Массив ссылок на связанные операции в формате Метаданных, и указав в нем meta - Ссылка на операцию, к которой привязан этот платёж в формате метаданных и linkedSum - Сумма, оплаченная по данному документу из этого платежа

    0
    Действия с комментариями Постоянная ссылка
  • Eri Meilis

    Андрей, доброго дня! Не поделитесь кусочком для создания заказа?

    Только-только удалось победить обновление товарных остатков, - заказы пока не двигаются (создать бы тестовый и пойдет...). На php

    0
    Действия с комментариями Постоянная ссылка
  • Андрей Тарасов

    Создание нового пустого заказа с минимумом полей:

    $url = 'https://online.moysklad.ru/api/remap/1.1/entity/customerorder';
    $post['organization']['meta']['href'] = 'https://online.moysklad.ru/api/remap/1.1/entity/organization/3bad9f83-89cf-11e8-9107-50480038f8cf';
    $post['organization']['meta']['type'] = "organization";
    $post['agent']['meta']['href'] = "https://online.moysklad.ru/api/remap/1.1/entity/counterparty/288771c6-ad18-11e8-9ff4-34e80008c496";
    $post['agent']['meta']['type'] = "counterparty";

    В принципе все как в документации. Только данные свои подставьте.

    0
    Действия с комментариями Постоянная ссылка
  • Андрей, добрый день!
    Не могли бы вы привести пример работающего кода авторизации на PHP? Тоже только разбираюсь с API. Работающих примеров не могу найти.

    0
    Действия с комментариями Постоянная ссылка
  • Добрый день, нам тоже нужно сделать создание счета при достижении определенного статуса, кто-то может такое сделать?

     

    0
    Действия с комментариями Постоянная ссылка
  • Eri Meilis
     
    Я могу, у меня получилась синхронизация на php через API и товаров, и заказов. Если у вас не битрикс, а какая-то вменяемая cms, могу адаптировать под вас. Напишите на eri@redshoes.pro, обсудим
    0
    Действия с комментариями Постоянная ссылка

Войдите в службу, чтобы оставить комментарий.