Подключение квестов

Мы будем рады подключить ваши квесты одним из следующих способов:

  1. подключение/изменение квеста через интерфейс сайта осуществляется бесплатно по ссылке: fast2exit.com/my/quests/add/. При добавлении квеста впервые, вы будете перенаправлены на страницу добавления организатора: fast2exit.com/my/vendor/add. После того, как вы добавите новый квест, ему будет присвоен статус «на модерации», и после проверки нашими администраторами, он будет добавлен в каталог. Интеграция расписания через интерфейс добавления квестов недоступна.
  2. подключение на базе API осуществляется бесплатно, но вам необходимо реализовать у себя описанный API и сообщить адреса для подключения администрации. Если у вас нет возможности обратиться к вашим разработчикам, вы можете попросить команду Fast2exit.com реализовать API для вас.

Общая информация

Кодировка для всех запросов должна быть utf-8.


1. Добавление организатора

Сообщить название сети, сайт и описание в группе vk.com/questokru администрации или написать https://vk.com/im?media=&sel=-95454365.

Вы должны предоставить следующие URL’ы


2. Получение списка квестов

URL по которому мы будем забирать список квестов, например, http://user:password@domain.ru/api/quests.json (желательна basiс авторизация). Пример формата ответа:

[  
   {  
      "id":1,
      "name":"Квест номер 1",
      "description":"Описание квеста",
      "images":[  
         "http:\/\/domain.ru\/1.jpg",
         "http:\/\/domain.ru\/2.jpg"
      ],
      "videos":[  
         "http:\/\/youtube.com\/..."
      ],
      "city":"Санкт-Петербург",
      "url":"http:\/\/domain.ru\/quest-1.html",
      "lat":55.749395,
      "lon":37.721184,
      "phone":"+7(812)1231212",
      "metro":"Пионерская",
      "complexity":1,
      "duration":90,
      "age":14,
      "address":"Аллея Поликарпова д. 1",
      "people_from":2,
      "people_to":4,
      "currency":"RUB",
      "created": "2015-01-01"
      "tags": ["Побег из тюрьмы", "Исторические"] 
   }
]

id — id квеста в вашей системе, обычно он числовой и не меняется при любых изменениях квеста, например, переименовании.
complexity — от 0, 1 или 2
address — адрес без указания города
duration — длительность в минутах (можно не указывать тогда будет 60 минут по-умолчанию)
age — минимальный возраст участников
tags — до 3х категорий из набора
Автомобильные,
Антуражные,
Апокалипсис,
Большая компания,
Детективные,
Исторические,
Музейные,
Нестандартный формат,
Ограбление,
Пешеходные,
По фильмам,
Побег из тюрьмы,
С актерами,
С детьми,
Сложные,
Страшные,
Фантастические.

Все поля должны быть просто текстовыми, html разметка не поддерживается. Переводы строк будут сконвертированы в <br/> на нашей стороне.
Видео пока не отображаются на сайте но планируются, поэтому можете начать их передавать если они у вас есть.
Если у вас нет некоторой информации, например даты создания, не передавайте это поле.


3. Получение расписания

Например, по url http://user:password@domain.ru/api/slots.json (желательна basiс авторизация). Пример ответа:

[  
   {  
      "id":1
      "quest_id":1,
      "date":"2015-06-01",
      "time":"20:00",
      "full_date":"2015-06-01T20:00:00"
      "price":2000
   }
]

id — id временного слота
full_date — дата в формате iso относительно Московского часового пояса.
Требуется отдавать слоты начиная от текущего момента времени на 15 дней вперед для всех квестов сразу, если не передан параметр quest_id, и по конкретному квесту, если он передан. Т.е. те которые реально можно забронировать и на которые можно попасть.
price может быть просто числом, либо массивом вида:

   {  
      2: 1000,
      3: 1500,
      4: 2000
   }

т.е. общая цена с команды в зависимости от кол-ва человек.


4. Создание брони

Вы должны предоставить URL c basic авторизацией на который мы будем делать запрос в случае брони и передавать туда следующие параметры с помощью POST запроса (например, http://user:password@domain.ru/api/order.php):

  • slot_id — id слота (текстовое поле, но может содержать число)
  • quest_id — id квеста (текстовое поле, но может содержать число)
  • price — цена в валюте квеста
  • currency — валюта квеста (RUB и т.д.)
  • name — фио бронирующего (текстовое поле)
  • phone — телефон бронирующего (текстовое поле)
  • email — email (опциональное текстовое поле)
  • people — количество участников игры
  • own_booking_code — код бронирования в нашей системе (текстовое поле)
  • comment — комментарий (текстовое поле)
  • crc — подпись

Ответ должен быть либо

{"response": {"booking_code": 123}}

либо, если не удалось сделать бронирование

{"error": {"code": "wrong_crc"}}

code — одно из значений:

  • wrong_crc — неверный код crc
  • wrong_quest_id — неверный id квеста
  • wrong_price — неверная цена
  • wrong_date — заданной даты в расписании не существует
  • busy — игра уже забронирована
  • other — прочее

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


5. Обновление расписания

Вы сможете уведомлять нас о том, что статус доступности слота времени изменился, т.е. о бронировании для улучшения актуальности расписания.
Адрес: URL http://fast2exit.com/api/set-slot-status
В него нужно передать параметры с помощью POST запроса

vendor_id=1 - который мы вам сообщим
quest_id=1 - ваш id квеста
time=20:30
date=2015-09-01
status=booked или available
crc подпись


6. Формироване подписи

Для подписки, вы получаете от администрации сайта приватный ключ, которым вы будете подписывать запросы.
Для вычисления контрольной суммы необходимо отсортировать поля в соответствии с алфавитным порядком имен полей, сложить (конкатенировать) значения полей в одну строку, в конец добавить приватный ключ, после чего от полученной строки вычислить md5, кодировка при вычислении crc должна быть utf-8.
Пример вычисления crc для создания брони, значение приватного ключа 617063cb7e04aa6dfa52d77651c50f89:

time=20:30
date=2015-09-01
quest_id=1
comment=
phone=+79211111111
name=Вася Пупкин
email=email@questok.ru
own_booking_code=123
price=2000
currency=RUB

email — необязательное поле, может передаваться либо не передаваться, booking_num — номер бронирования в нашей системе

Значение crc будет

md5("КомментарийRUB2015-09-01email@questok.ruВася Пупкин123+792111111112000120:30617063cb7e04aa6dfa52d77651c50f89")
 = "76655c57e70a73da35af020d497a2722"

Код на языке Python будет следующим:

import hashlib

private_key = '617063cb7e04aa6dfa52d77651c50f89'
params = {'time': '20:30', 'date': '2015-09-01', 'quest_id': 1, 'name': u'Вася Пупкин', 'price': 2000, 'currency': 'RUB'}

s = ''
for key in sorted(params.keys()):
    value = params[key]
    s += ('%s' % value).encode('utf-8')
s += private_key
print s

m = hashlib.md5()
m.update(s)
print m.hexdigest()