Публикация

подписчиков: 7 Подписаться
0
Avatar

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

Здравствуйте.

Можно ли где то увидеть простейшие примеры работы с API через PHP? Только начинаю разбираться со складом и пока мало что понятно...

Андрей Тарасов

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

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

0
Avatar

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

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

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

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

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

Добрый день!

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

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

Дмитрий 0 проголосовали
Действия с комментариями Постоянная ссылка
1
Avatar

Добрый день!

 

Все примеры запросов и ответов представлены в документации 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 голос
Действия с комментариями Постоянная ссылка
1
Avatar

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

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

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

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

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

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

Добрый день!

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

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

Куда - создаю новый заказ в него и добавляю.

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

Вот кусок 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
Avatar

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

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

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

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

Помоги пожалуйста еще с таким моментом. Чтобы добавить в новый заказ какой-то существующий товар, надо знать его 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 проголосовали
Действия с комментариями Постоянная ссылка
0
Avatar

Добрый день!

 

Указанный вами 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 проголосовали
Действия с комментариями Постоянная ссылка
0
Avatar

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

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

Нет, данный ID доступен только через АПИ

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

Екатерина Евтухова 0 проголосовали
Действия с комментариями Постоянная ссылка
0
Avatar

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

"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 проголосовали
Действия с комментариями Постоянная ссылка
0
Avatar

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

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

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

 

Вася Садовников 0 проголосовали
Действия с комментариями Постоянная ссылка
0
Avatar

Создаю счет на основе заказа покупателю:

$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 проголосовали
Действия с комментариями Постоянная ссылка
0
Avatar

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

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

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

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

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

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

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

POST /entity/invoiceout

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

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

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

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

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

PUT /entity/customerorder/{id}

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

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

GET /entity/customerorder/metadata

 

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

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

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

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

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

 

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

И третий, самый важный вопрос - как средствами 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
Avatar

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

Екатерина Евтухова 0 проголосовали
Действия с комментариями Постоянная ссылка
0
Avatar

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

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

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

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

$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 проголосовали
Действия с комментариями Постоянная ссылка
0
Avatar

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

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