Мой склад api php
Мой склад api php
Moysklad PHP JSON API library
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Библиотека для сервиса «Мой склад» JSON API 1.1. Некоторые примеры можно найти в «tests». Все ещё далека от завершения.
Используется для авторизации, явно передается параметром в большинство компонентов т.к. возможно использование нескольких аккаунтов моегосклада одновременно.
Основной объект библиотеки
Можно, например, сделать так
Или так
Или не сделать. Большая часть логики делегирована другим классам.
Получение всех сущностей:
Можно добавить параметры запроса. Описание параметров в описании класса QuerySpecs.
Фильтрация. Описание методов FilterQuery в комментариях.
Поиск по строке. К Query-объекту можно прицепить expand для получения связей с указанными названиями
Функции выше возвращают объект EntityList.
Получение по id.
Некоторым сущностям нужно указать связи при создании. Например для customerorder нужно указание counterparty и organization, и опционально массив позиций
Для обновления то-же самое
Чаще всего сущность полученная через api имеет какие-то связи
Зная что, к примеру, у продукта есть связанный employee, но не зная название этого поля можно получить его так
Так как связи обычно приходят в формате meta-объекта для получения полного объекта можно сделать так
Например получение assortment и превращение элементов в нужный тип
Или массовое создание сущностей
Можно превратить в массив
Работа с картинками
Прицепление изображений к сущности
Скачивание изображения
Классы для конфигурации различных действий
В метод create передаются поля конфигурации
LinkingSpecs используется для описания связывания сущности и других сущностей учавствующих в обновлении/создании первой
Имеет следующие поля:
Пример добавления доп. поля к контрагенту
QuerySpecs конфигурация EntityQuery и RelationQuery объектов
Документные сущности поддерживают публикации
Получение
Создание
Удаление
Получение публикации по id
Документные сущности поддерживают печать
Создание
При создании запроса на печать можно передать либо AbstractTemplate либо EntityList
Получение стандартных шаблонов
Получение пользовательских шаблонов
Получение стандартного шаблона по id
Получение пользовательского шаблона по id
Содержат статические методы для получения отчетов.
Некоторым можно указать особые поисковые запросы типо CounterpartyReportQuerySpecs
История событий системы
Получить последние 5 контекстов по заказам покупателей
Получить события по контексту
Получить события по сущности
Получить список фильтров
Статический класс RequestLog содержит ограниченную историю запросов/ответов в апи.
Можно получить последний запрос/ответ
По умолчанию для ограничения потребления памяти хранится 50 последних запросов, по достижению лимита старые запросы удаляются. Изменить лимит можно так:
МойСклад LoyaltyAPI
API для интеграции МоегоСклада с системами лояльности.
Сценарий работы
Запросы осуществляются на определенный эндпоинт относительно базового адреса. Каждый из запросов содержит в своем составе ключ доступа.
Обработка ошибок
Если вознникла ошибка при обработке запроса, то она должна приходить с HTTP кодом, отличным от 200 и 201
Структура ошибок
Ошибки представляют собой массив errors, содержащий объекты error, каждый из которых описывает отдельную ошибку.
Структура объекта error
Сущности
Покупатель
Создание покупателя
Запрос на создание нового покупателя.
Атрибуты сущности
Request
Поиск покупателя
Запрос на поиск существующего покупателя.
Параметры
Параметр | Описание |
---|---|
search | string Example: 9039993344 Строка с поисковым запросом |
Атрибуты сущности
GET /counterparty?search=9039993344
Request
Response
200 (application/json)
Получение баланса баллов покупателя
Запрос на получение баланса покупателя. Поиск и идентификация покупателя идет по идентификатору покупателя id из метаданных. Прочие реквизиты несут информационный характер и могут не предаваться. Передача нескольких покупателей в ответе не допускается.
Атрибуты сущности
Атрибуты ответа
POST /counterparty/detail
Request
Response
200 (application/json)
Продажа
Расчет скидок для продажи
Запрос на пересчет скидок для операции продажи. В запросе передается продажа без применения скидок. В ответе ожидается продажа со всеми примененными скидками. В случае округления суммы чека, допускается разбиение одной позии на две.
После расчета скидок, приложение уже никак не меняет состав чека и не применяет другие скидки.
Атрибуты сущности
POST /retaildemand/recalc
Request
Атрибуты ответа
Response
200 (application/json)
Создание продажи
Запрос на создание новой продажи. Если при продаже начислялись или списывались баллы, информация об этом указывается в секции bonusProgram
Атрибуты сущности
Request
Возврат
Создание возврата
Запрос на создание нового возврата. В составе запроса может быть указана ссылка на документ продажи. Операции с баллами в составе возврата не передаются. Система лояльности, на основании информации из связанной продажи, самостоятельно начисляет/списывает баллы при необходимости.
Атрибуты сущности
POST /retailsalesreturn
JSON API Мой Склад, самообучение
START UPDATE 2019-11-18
Заметил, что статья до сих пор для кого то служит источником информации.
Я сделал рефакторинг что бы сделать код более прямолинейным. По пути поправил пару досадных багов.
FINISH UPDATE 2019-11-18
Есть такой способ самообучения — как выполнение тестовых заданий. Его преимущество в том что объём задания конечен, сроки ограничены. Это не позволяет тянуть резину до бесконечности или самозабвенно вырисовывать завихрения и завитушки архитектурных изысков.
Приятный бонус такой тренировки скиллов заключается в знакомстве с новыми технологиями и бизнес процессами, которое кроме всего прочего востребованы в реальных задачах.
На этот раз надо было сделать страничку для формирования заказа покупателя в сервисе «Мой склад». Для меня это как полёт на Луну: в веб разработке я чуть меньше чем новичок, с фронтэндом знаком только по наслышке, а тут целую страницу надо разработать, ох ты Йожик!
Любая критика и советы приветствуются.
В коментах очень много ругательств, моё решение настолько ужасно, что для него сделали рефакторинг во что то приличное:
michael_vostrikov
От нечего делать сделал небольшой рефакторинг этого задания (хотя там много чего еще можно поменять), не столько для вас, сколько для тех, кто потом найдет в поиске эту статью:
коммиты, разметка, отправка формы.
Поехали!
Первым делом конечно гуглить, нагуглилась только ссылка на документацию, туториалов, примеров — ноль.
Ещё нагуглилось: «JSON API доступен для подписчиков на всех тарифах, кроме Бесплатного» уупс! Платного мне конечно ни кто не дал, покупать не камильфо, но я подумал что если дали такое задание, то наверное на Бесплатном что то там функционирует и продолжил работу.
И конечно нагуглилось «moysklad-client — npm — JavaScript клиент для комфортной работы с API сервиса МойСклад», но я с JS исключительно на «Вы», и по условиям задания, написать надо на PHP. Так что даже разбираться не стал, что там на JS можно делать.
Первое
Первое что надо сделать, это познакомиться с документацией. Познакомился.
Второе — составить план. Составил.
План, начало.
Действие первое — авторизация.
Действие второе — показать список Номенклатур.
Действие третье — добавить Заказ покупателя.
Действие четвёртое — добавить Позиции в Заказ покупателя.
Цель достигнута, конец плана.
Авторизация
Я видел код в котором для общения с API использовался cUrl. Я не знаю что такое cUrl, я не знаю как принято общаться с API, но если есть код который можно скопипастить, то проверить его пригодность не сложно. Скопировал вставил, обработал напильником — получилось.
Не буду утомлять вас интимными подробностями о дружбе напильника с копипастой, вот работающий код:
Итак, это была инициализация объекта curl для обмена сообщениями с сервером API.
Чистая копипаста, не спрашивайте меня почему так.
Показать список Номенклатур
Одних номенклатур оказалось мало, для Заказа покупателя, надо указать юридическое лицо Поставщика и контрагента Покупателя. У владельца учётки «Мой склад» может быть несколько юридических лиц, контрагентов — ясно понятно 100500, но конкретный Заказ покупателя, это заказ конкретного Контрагента в адрес конкретного Юридического лица.
Поэтому с номенклатурами обождём, займёмся сторонами «договора» — сделки.
Извиняюсь за ужасные названия констант, но мне с такими спокойней, точно ни с чем не перепутаю. Да я знаю что у case (switch) есть ветка default, но мне спокойней вбетонировать в код значение по умолчанию и не надеяться на превратности судьбы с case.
У каждой команды API свой адрес и свой метод, setCurl — устанавливает адрес и метод.
После этого методом getJuridicalPerson исполняем curl, получаем ответ в JSON, из ответа забираем только массив ‘rows’. Получили, сохранили, отложили.
С Контрагентами поступаем аналогично: setCurl => getCounterparty, Номенклатуры по тому же алгоритму: setCurl => getNomenclature.
Если бы это было не тестовое на два вечера после работы, а на два дня безработного специалиста, то можно было бы это автоматизировать, но это было тестовое в стиле — «лишь бы работало», поэтому я не стал изгаляться.
Для меня цель тестового была в том что бы пригубить и попробовать на вкус JSON API, рисовать красоту — цели не было.
Данные получили — это вообще не вопрос, дело дурацкое — дело не хитрое, интересней было как то это вывести на страничку, а потом со странички забрать, вот это была задачка.
Фронтэнд
Не знаю как правильно, я сделал так:
По клику на кнопку «Сформировать заказ покупателя», форма не отправляется — «return false;», но вызывается функция — «sendOrder();».
Примеры работы с API через PHP
Можно ли где то увидеть простейшие примеры работы с API через PHP? Только начинаю разбираться со складом и пока мало что понятно.
Комментарии
Видел я тот SDK. Дело в том что я PHP знаю постольку поскольку, скажем на троечку, и мне он показался сложноватым для понимая.
Опять же там речь идет о работе с API используя этот SDK, а я прошу простой пример работы на чистом PHP.
Короче, помогите какими-то примитивами, а то вообще не знаю как к этому подступиться.
По вопросам php не консультируем.
Для авторизации в АПИ используется такой же логин как и на сайте, то есть из вашего примера, логин в АПИ будет admin@emshop.
Наши интеграторы пишут на разных языках программирования, поэтому в привязке к конкретному языку консультаций мы не даем. Но в качестве рекомендации даем ссылки на СДК наших интеграторов.
С авторизацией я разобрался, а так же научился создавать новый заказ и доп. поля к нему.
«Но в качестве рекомендации даем ссылки на СДК наших интеграторов.»
У вас к сожалению лишь одна ссылка на какой-то мутный SDK, автор которого написал, что там еще пилить его и пилить. Лучше бы вы давали так же ссылки на конкретные примеры работы со Складом по данному языку.
А на вопрос общего плана вы можете ответить? Не касаемо конкретной реализации.
При добавлении товара если не указать его цену, то она автоматически не подставляется из самого товара. Хотя она в нем указана. И в результате цена заказа 0. Можно ли сформировать такой запрос API чтобы цена бралась та, что задана у товара по умолчанию?
Можете предоставить более подробную информацию о том куда и как вы добавляете товар?
Вот кусок 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
Да, все верно, при создание заказа покупателя в нем нужно явно указывать стоимость продажи.
Если вы хотите создать заказ покупателя в котором в стоимости продажи будет проставлена цена товара, то вы можете предварительно запросить сам товар, и полученую в нем цену передать как стомоисть продажи.
Выглядит немного странным что у товара есть цена, но чтобы ее проставить в заказе надо сделать дополнительный отдельный запрос на ее получение. Казало бы куда уж логичнее дать возможность подставить ее из товара. Ну ок. Если никак иначе, значит так.
Но оказалось, что это не так. С таким ID товар не выбирается при создании заказа. А выбирается только вот с таким ID: 56474ec4-a355-11e8-9ff4-31500042cb83
Этот ID товара я смог получить только путем запроса к API. Как видите эти 2 ID очень похожи, но все же разные. Почему так? Почему нельзя использовать для товара тот же ID что и в URL при его редактировании? И откуда нам брать «правильный» ID, чтобы по нему добавлять товар в заказ?
Откуда мы можем взять тот ID, по которому можно получить цену товара и потом по нему же добавить товар в заказ? Он где то доступен в интерфейсе?
Нет, данный ID доступен только через АПИ
Предполагается, что если вы строите интеграцию через АПИ, вам нет смысла завязываать на UUID с UI. В таком кейсе uuidHref носит чисто справочную информацию
Смотрите, я создаю добавляю товар в заказ как написано в документации. Там есть вот такая строка
Может товар можно добавить в заказ по другому? Чтобы вместо этого ID использовать что-то, что видно при редактировании товара через интерфейс пользователя?
Запросить ID товаров в АПИ вы можете только через запрос списка товаров. И далее выбирать например по имени, какой подставлять в заказ
Тут приходится строить более сложную интеграцию.
Мы выгружаем на сайт id всех товаров из МС и цены, чтобы сайт при отправке заказа мог использовать эти id.
Сопоставление товаров при выгрузке у нас делается по полю «код товара» (в МС нужно включить флажок, чтобы проверялась уникальность этого поля).
Создаю счет на основе заказа покупателю:
В ответ получаю ошибку
Что делать? Путь-то вроде верный, скопирован из доков.
Приведенной вами части кода недостаточно, что бы определить в чем заключается проблема.
Можете предоставить выполняемый вами запрос в виде curl-запроса?
Проблема была в том, что запрос на создание шаблона счета должен идти методом PUT, а я посылал его методом POST.
Поменял POST на PUT и в результате получил некий новый шаблон созданный на основании заказа покупателя. Что мне с ним дальше делать? Как создать счет на основании этого шаблона?
Для создания счета на основе шаблона, вам необходимо отправить полученый объект в запросе к ендпоинту
Не забудьте задать в полученном объекте значение поля name, так как в шаблоне оно отсутвует, но является обязательным для создания.
В ответ на запрос создания счета покупателю, вам прийдет json объект созданного счета, вам необходимо скопировать объект meta созданного счета, он потребуется далее.
Я так полагаю, что вы хотите привязать полученный счет покупателю к заказу покупателя, а после его оплаты, установить статус заказа как оплаченный.
Для привязки полученного счета покупателя к заказу, через ендпоинт
Передаем в поле invoicesOut, в массиве, полученный ранее объект метаданных счета покупателю. Таким образом счет покупателя будет привязан к заказу покупателя.
Для того что бы изменить статус заказа покупателя, необходимо, через тот же ендпоинт изменить заказ, передав в поле «state» объект метаданных требуемого статуса заказа.
Получить список доступных состояний заказов покупателя и их метаданные можно через ендпоинт
МойСклад API
Принцип работы
Наши разработчики уже разобрались как работает API для системы МойСклад и создали готовый коннектор. По такому же принципу мы сделали коннекторы с другими онлайн сервисами, всего их у нас уже более 200!
Теперь Вам не нужно тратить время на написание программного кода самостоятельно, связать 2 и более сервиса можно через наш онлайн интерфейс в несколько кликов!
Вот как выглядит работа нашей системы с другими системам
Готовые интеграции
Как интегрировать МойСклад и другие системы
c помощью ApiX Drive по API
Возможности автоматизации МойСклад
с другими системами по API
Популярные вопросы про интеграцию с МойСклад
Как происходит интеграция МойСклад?
Сколько времени нужно на интеграцию?
Сколько стоит интеграция МойСклад с другими системами?
Сколько готовых интеграций доступно для МойСклад?
«МойСклад» — это функциональная CRM-система для автоматизации склада на вашем предприятии и управления запасами. Система позволяет увеличить эффективность работы ваших складских комплексов в разы, снизить количество просроченной продукции, если речь идет о продуктовом бизнесе и сократить издержки на персонал, штрафные санкции со стороны контролирующих органов, и др.
«МойСклад»: интеграция по API
Чтобы использовать систему еще более удобно, можно интегрировать ее возможности с необходимыми сторонними сервисами и приложениями. Задачи могут быть самые разные. Например, нужно связать «Мой склад» с сайтом интернет-магазина, чтобы автоматически загружались данные об остатках на складе, эта информация синхронизировалась, в зависимости от продаж и заказов в режиме реального времени, и всегда была актуальной, в том числе изображения товаров.
Плюс еще нужно вести базу клиентов, и чтобы каждый заказанный товар бронировался для оплаты, и все это отображалось в «МоемСкладе». Еще может понадобиться настроить автоматическое поступление в систему данных от торгового и складского оборудования. Интеграция по API — это возможность объединить работу всех систем, которые вы используете в своей деятельности в одном интерфейсе. И разработчики «МоегоСклада» предусмотрели для этого широкие возможности: https://dev.moysklad.ru/ Осталось решить, кто их реализует.
Как интегрировать «МойСклад» по API
Чтобы выполнить апи-интеграцию «МоегоСклада» с другими сервисами и приложениями, можно воспользоваться услугами разработчиков. Но для этого потребуется время и средства. Более эффективное решение — онлайн-коннектор ApiXDrive. Он позволяет за считанные минут объединить работу любых сервисов с «МоимCкладом». Настраивается всё без специальных знаний и навыков, за 5 минут. С задачей справится любой сотрудник, благодаря простому и понятному интерфейсу. Попробовать работу сервиса можно совершенно бесплатно.