Шаг 2: Создание заказа¶
Примечание
Примеры ответов и запросов в данном разделе упрощены. Тем не менее этого достаточно для интеграции. Детальная информация по каждому разделу присутствует в блоках См. также
Создание¶
Запрос
POST
/v2/resources/orders
¶
JSON Parameters:
- event – Обязателен
Ответ
Объект заказа
{ "data": { "id": objectid "status": 'executed' | 'in_progress' | 'done' | 'cancelled' | 'expired' "created_at": isodatetime "done_at": isodatetime "expired_after": isodatetime "event": objectid "number": int "org": objectid "origin": 'api' | 'salespoint' | 'widget' | 'control_panel' "promocodes": [ str ] "settings": { "invitation": bool "send_tickets": bool "courier": bool "customer": { "name": str "email": email "phone": str "lang": 'en' | 'ru' } } "tickets": [ { "id": objectid "serial": str "number": int "seat": { "row": str "number": str "sector": objectid } "status": str "price": money "nominal": money "discount": money "extra": money "full": money }, ] "values": { "discount": money "extra": money "full": money "nominal": money "price": money "sets_values": { id: { "discount": money "id": objectid "nominal": money // price with discount "price": money "promocode": objectid | None }, ... } "viral_promocodes": [...] }, "vendor": objectid "vendor_data": { "order_id": str "raw": { ... } } }, "refs": { "events": { id: { "id": objectid "lifetime": { "finish": isodatetime "start": isodatetime }, "org": objectid "status": str "timezone": str "title": { "desc": str "text": str } "venue": objectid "age_rating": int } }, "partners": { id: { "id": objectid "name": str } }, "promocodes": { id: { "code": str "discount": { "percentage" | "fix": str }, "id": objectid "lifetime": { "start": isodatetime "finish": isodatetime }, "viral": bool }, }, "sets": { id: { "id": objectid "name": str "price": money "with_seats": bool }, }, "venues": { id: { "address": str "city": { "_id": int, "name": { "default": str "en": str "ru": str }, "timezone": str }, "country": { "_id": str "name": { "default": str "en": str "ru": str } }, "desc": str "id": objectid "name": str } } } }
Пример запроса
POST /v2/resources/orders HTTP/1.1 Authorization: key 9bd8359943b545500278875r49c5b96d Content-Type: application/json { "event": "5d31fbdd27649b0dff076117" }
Пример ответа
HTTP/1.1 200 OK Content-Type: application/json { "data": { "created_at": "2019-07-25 14:41:11", "event": "5d31fbdd27649b0dff076117", "expired_after": "2019-07-25 14:56:11", "id": "5d39bf878cd381a4891e07b7", "number": 54877, "org": "5b04229196c055000d87c2b5", "origin": "api", "promocodes": [], "settings": { "invitation": false, "send_tickets": false, "subscribe_agree": false }, "status": "executed", "tickets": [], "values": { "discount": "0.00", "extra": "0.00", "full": "0.00", "nominal": "0.00", "price": "0.00", "sets_values": { "5d31fbfa27649b0dff07611b": { "discount": "0.00", "id": "5d31fbfa27649b0dff07611b", "nominal": "150.00", "price": "150.00", "promocode": null }, "5d31fbfa8a75c12c9d64de13": { "discount": "0.00", "id": "5d31fbfa8a75c12c9d64de13", "nominal": "1050.00", "price": "1050.00", "promocode": null } }, "viral_promocodes": [] }, "vendor": "5b02d6e9517565000d9cb1ce", "vendor_data": {} }, "refs": { "events": { "5d31fbdd27649b0dff076117": { "id": "5d31fbdd27649b0dff076117", "lifetime": { "finish": "2019-08-28 21:50:00", "start": "2019-08-15 21:20:00" }, "org": "5b04229196c055000d87c2b5", "status": "public", "timezone": "Europe/Moscow", "title": { "desc": "1", "text": "1234567890" }, "age_rating": 16, "venue": "552322649cb5384154e028b2" } }, "partners": { "5b02d6e9517565000d9cb1ce": { "id": "5b02d6e9517565000d9cb1ce", "name": "Rasp new" }, "5b04229196c055000d87c2b5": { "id": "5b04229196c055000d87c2b5", "name": "My best org" } }, "promocodes": {}, "sets": {}, "venues": { "552322649cb5384154e028b2": { "address": "ул. Родионова, 4", "city": { "_id": 520555, "name": { "default": "Nizhniy Novgorod", "en": "Nizhny Novgorod", "ru": "Нижний Новгород" }, "timezone": "Europe/Moscow" }, "country": { "_id": "RU", "name": { "default": "Russia", "en": "Russia", "ru": "Россия" } }, "desc": "MILO Concert Hall - новая большая профессиональная площадка в Нижнем Новгороде", "id": "552322649cb5384154e028b2", "name": "MILO Concert Hall" } } } }
Примечание
ШК появляется только у заказа в статусе done
- Возможные ошибки при создании заказа
При ошибках возвращается список текстовых сообщений:
HTTP/1.1 400 Content-Type: application/json { "errors": [ "Event <event_id> not found" ] }
Сообщение | Причина |
---|---|
Event <event_id> not found | не найдено мероприятие для заказа |
Deal not found | не найдена сделка |
Promokey needed | промоключ должен быть |
Promokey not founded | промоключ не найден |
Promokey expired | промоключ истек |
Promokey fully reserved | промоключ полностью зарезервирован |
Promokey already reserved | промоключ уже зарезервирован |
Only one of tickets or random can be set | только один: tickets или random может быть установлено |
„tickets“ or „random“ must be | обязан быть: tickets или random |
Cant use promocode when event have promotion | нельзя использовать промокод, пока на мероприятии действует промоакция |
expired_after is not changable | время жизни не может быть изменено |
max expired_after is {dt} | время жизни истекло <dt :%Y-%m-%d %H:%M:%S> |
Promokey needed to add these tickets | необходим промоключ, чтобы добавить эти билеты |
ticket (id = {}) does not belong to current event | билет не относится к текущему мероприятию |
value should be formatted „YYYY-MM-DD“ | для дополнительного поля «Дата», значение имеет неверный формат |
value should be True or False | для дополнительного поля «Галочка», значение должно быть булевым |
value is not a list | для дополнительного поля «Выбор нескольких вариантов», значение должно быть списком |
list length is less than <len> | для дополнительного поля «Выбор нескольких вариантов», значение должно быть длиннее чем <len> |
list length is greater than <len> | для дополнительного поля «Выбор нескольких вариантов», значение должно быть короче чем <len> |
value is less than <value> | для дополнительного поля «Выбор одного варианта», значение должно быть больше чем <value> |
value is greater than <value> | для дополнительного поля «Выбор одного варианта», значение должно быть меньше чем <value> |
value should be less than <value> | для дополнительного поля «Выбор одного варианта», значение должно быть меньше либо равно <value> |
value should be greater than <value> | для дополнительного поля «Выбор одного варианта», значение должно быть больше либо равно <value> |
value is not a string | для дополнительного поля «Текст/Длинный текст», значение должно быть представлено строкой |
blank value is not allowed | для дополнительного поля «Текст/Длинный текст», значение не должно быть пустым |
String is shorter than <len> characters | для дополнительного поля «Текст/Длинный текст», значение должно быть длиннее <len> символов |
String is longer than <len> characters | для дополнительного поля «Текст/Длинный текст», значение должно быть короче <len> символов |
does not match pattern <pattern> | для дополнительного поля «Текст/Длинный текст», значение должно соответствовать формату <pattern> |
Резервирование билетов¶
Примечание
Все действия с заказом, кроме его создания, делаются по запросу PATCH /v2/resources/orders/:id
.
В один запрос одновременно может быть добавленно нескольно действий.
Все запросы на изменение конкретного заказа, должны делаться синхронно.
В случае получения запроса до конца обработки предыдущего,
будет возвращена ошибка 409 Conflict.
Это ограничение касается только работы с одним заказом, а работать одновременно с несколькими заказами можно.
За резервирование билетов отвечают три поля:
Поле tickets
¶
В поле tickets передаются все id билетов, которые должны быть зарезервированы текущим заказом. Если заказ изменяется (покупатель решил добавить ещё один билет), то в обязательном порядке передаются все билеты, которые должны быть в заказе (в т.ч. те, что уже зарезервированы). Для удаления конкретного билета из заказа, нужно передать все билеты, кроме удаляемого.
Предупреждение
Нельзя использовать в одном запросе с random.
Запрос
PATCH
/v2/resources/orders/:id
¶
JSON Parameters:
- tickets – список id билетов
Пример запроса
PATCH /v2/resources/orders/5b0eab671b2042000ea83850 HTTP/1.1 Authorization: key 9bd8359943b545500278875r49c5b96d Content-Type: application/json { "tickets": [ "5b0e8af09adc660001b0ab25", "5b0e8afa9adc660001b0ab6c" ] }
Поле random
¶
Поле random предназначено для резервирования случайных билетов из указанных категорий. Оно нужно для того, чтобы добавлять в заказ билеты без мест. Имеет вид объекта, где ключ является id категории, а значение — количество билетов. Так же, как и в tickets, всегда нужно передавать желаемое состояние. Т.е. если пользователь удалил один билет из категории, то передать надо random со всеми категориями и количествами, только в одной из категорий будет на один билет меньше. В ответе от сервера всегда будет список забронированных билетов в поле tickets.
Предупреждение
Нельзя использовать в одном запросе с tickets.
Запрос
PATCH
/v2/resources/orders/:id
¶
JSON Parameters:
- random – массив: ключ – id категории, значение – кол-во мест
Пример запроса
PATCH /v2/resources/orders HTTP/1.1 Authorization: key 9bd8359943b545500278875r49c5b96d Content-Type: application/json { "random": { "5d31fbfa27649b0dff07611b": 1 } }
Пример ответа
HTTP/1.1 200 OK Content-Type: application/json { "data": { "created_at": "2019-07-25 14:41:11", "event": "5d31fbdd27649b0dff076117", "expired_after": "2019-07-25 14:56:11", "id": "5d39bf878cd381a4891e07b7", "number": 54877, "org": "5b04229196c055000d87c2b5", "origin": "api", "settings": { "invitation": false, "send_tickets": false, "subscribe_agree": false }, "status": "executed", "tickets": [ { "barcode": null, "discount": "0.00", "extra": "6.00", "full": "156.00", "id": "5d31fbfb306fdcc187b91179", "nominal": "150.00", "number": 157495, "price": "150.00", "serial": "OOX", "set": "5d31fbfa27649b0dff07611b", "status": "reserved" } ], "values": { "discount": "0.00", "extra": "6.00", "full": "156.00", "nominal": "150.00", "price": "150.00", "sets_values": { "5d31fbfa27649b0dff07611b": { "discount": "0.00", "id": "5d31fbfa27649b0dff07611b", "nominal": "150.00", "price": "150.00", "promocode": null }, "5d31fbfa8a75c12c9d64de13": { "discount": "0.00", "id": "5d31fbfa8a75c12c9d64de13", "nominal": "1050.00", "price": "1050.00", "promocode": null } }, "viral_promocodes": [] }, "vendor": "5b02d6e9517565000d9cb1ce", "vendor_data": {} }, "refs": { "events": { "5d31fbdd27649b0dff076117": { "id": "5d31fbdd27649b0dff076117", "lifetime": { "finish": "2019-08-28 21:50:00", "start": "2019-08-15 21:20:00" }, "org": "5b04229196c055000d87c2b5", "status": "public", "timezone": "Europe/Moscow", "title": { "desc": "1", "text": "1234567890" } } }, "partners": { "5b02d6e9517565000d9cb1ce": { "id": "5b02d6e9517565000d9cb1ce", "name": "Rasp new" }, "5b04229196c055000d87c2b5": { "id": "5b04229196c055000d87c2b5", "name": "My best org" } }, "sets": { "5d31fbfa27649b0dff07611b": { "id": "5d31fbfa27649b0dff07611b", "name": "обычные", "price": "150.00", "with_seats": false } } } }
Примечание
Хотя tickets
и random
нельзя использовать в одном запросе, передать все билеты можно.
Алгоритм такой:
- Запрос с
random
. - Получить из ответа id билетов в поле
tickets
. - Расширить список полученных id новым билетом.
- Отправить запрос с полем
tickets
, заполненным списком id билетов. - Проверить в ответе, что всё забронировалось корректно.
Поле all_or_nothing
¶
Если значение поля all_or_nothing
равно true
, то резервируются либо все билеты, либо ни одного.
При изменении заказа с одновременным разрезервированием и резервированием билетов, в случае неудачи с резервированием хотя бы одного билета, разрезервирования не происходит, т.е. список зарезервированных билетов не изменяется.
Если значение не указано, или false
, то билеты,
которые не удалось забронировать пропускаются и
отсутствуют поле tickets в ответе.
Примечание
Можно использовать, как с tickets
, так и с random