API подключения

API подключения систем онлайн-бронирования

к системе реестра туров (от 31.05.2022)

Общие условия

Система реестра туров имеет программный шлюз для автоматического добавления туров из приложений онлайн-бронирования туроператоров. Шлюз использует HTTPS-протокол и JSON-формат передачи данных с аутентификацией через переменные внутри JSON-структуры.

Подключение производится по стандартному для HTTPS-протокола порту 443/tcp (production) и HTTP-протокол 80/tcp для тестирования (для удобства отладки). В HTTP-заголовках должны присутствовать заголовки Content-Type со значением application/json и User-Agent со произвольным значением, позволяющим однозначно определить программу онлайн-бронирования и версию ПО. Используется HTTP-метод POST. Запрос производится на корень сервера. В теле запроса должна быть валидная JSON-структура запроса.

Тестовая платформа:

  • Адрес: http://test.fondkamkor.kz
  • Логин: test
  • Пароль: test

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

Создание туркода с одним местом пребывания

wget -q -O - 'http://test.fondkamkor.kz' -S --post-file=create.json --header 'Content-Type: application/json'

При этом файл create.json содержит следующее:

{
    "input":{
        "q_touragent":"ADIYA TRAVEL",
        "q_touragent_bin":"123456789012",
        "q_country":"Россия",
        "q_countryen":"Russia",
        "q_airport_start":"ALA",
        "q_airlines":"DV",
        "q_airport":"AAQ",
        "q_date_from":"17.11.2018",
        "q_date_to":"24.11.2018",
        "q_days":8,
        "q_remark":"tour notes here",
        "clientcounter":0,
        "c_name_0":"Client_$CID",
        "c_borned_0":"01.01.1970",
        "c_doc_date_0":"02.11.2016",
        "c_doc_number_0":"N08462365",
        "c_doc_production_0":"MIA OF RK"
    },
    "module":"voucher",
    "section":"partner",
    "object":"queries",
    "param1":"163",
    "param2":"save",
    "formid":163,
    "agentlogin":"test",
    "agentpass":"test",
    "return":"q_number"
}

Ответ сервиса будет примерно таким:

  HTTP/1.1 200 OK
  Server: nginx/1.1.4
  Content-Type: application/json;charset=UTF-8
  Connection: close
  Cache-Control: no-store, no-cache, must-revalidate
  Pragma: no-cache
  Date: Sat, 19 Nov 2016 22:57:01 GMT
  FastCGI-PID: 17961{"status":200,"string":"4Ru61117-33"}

Подробное объяснение структур запроса и ответа:

Запрос

Переменная Назначение поля Обяз. Формат Описание
module Название модуля системы Да строка для работы с турами и справочниками значение должно быть «voucher»
section Режим аутентификации Да строка для подключения систем туроператоров значение должно быть «partner»
object Название метода Да строка Может быть «queries» или «dictionaries»
param1, formid ID шаблона данных Да число для подключения систем туроператоров значение должно быть равно 163
param2 Действие над туром Да строка save — при сохранение тура, bad — при порче тура
return Возвращаемое поле тура Да строка Название возвращаемой переменной. q_number содержит ТурКод.
agentlogin Логин туроператора Да строка На тестовой платформе — test
agentpass Пароль туроператора Да строка На тестовой платформе — test

Хэш (объект) input:

Переменная Назначение поля Обяз. Формат Описание
q_touragent Название турфирмы-агента Да строка Название, позволяющее найти турагента.
q_touragent_bin БИН турфирмы-агента Да строка БИН компании-турагента (12 цифр).
q_country Русскоязычное название страны Да строка Должно присутствовать в справочнике стран.
q_countryen Англоязычное название страны Да строка Должно присутствовать в справочнике стран.
q_airlines IATA-код авиалиний Да [A-Z0-9]{2} Должно присутствовать в справочнике. Указывайте код последней авиакомпании (возврат).
q_airport_start IATA-код аэропорта вылета Да [A-Z]{3} Должно присутствовать в справочнике (Казахстан).
q_airport IATA-код аэропорта прилета Да [A-Z]{3} Должно присутствовать в справочнике (страна отдыха).
q_date_from Дата начала тура (вылет) Да ДД.ММ.ГГГГ Дата должна быть в будущем.
q_date_to Дата конца тура (прилет) Да ДД.ММ.ГГГГ Дата должна быть больше даты начала.
q_days Число дней тура Нет число Не должно быть меньше единицы.
q_remark Заметки по туру Нет строка
q_hotel Название отеля Нет строка Название отеля проживания.
q_flight Номер авиарейса туда Нет строка Номер рейса из Казахстана в страну отдыха.
q_flight_from Номер авиарейса обратно Нет строка Номер обратного рейса (последний перелет в турпакете).
clientcounter Счетчик туристов Да число Число меньше на единицу, чем число туристов (для 1 туриста = 0).
c_name_0 Имя туриста 1 Да строка ФИО. Если не передается, то «Client_$CID».
c_borned_0 Дата рождения туриста 1 Да ДД.ММ.ГГГГ Должна быть в прошлом. Если не сообщается, то «01.01.1970».
c_doc_date_0 Дата выдачи паспорта туриста 1 Нет ДД.ММ.ГГГГ Дата должна быть в прошлом.
c_doc_number_0 Номер паспорта туриста 1 Да строка Допустимы цифры и буквы, до 15 символов.
c_doc_production_0 Госорган, выдавший паспорт Нет строка Аббревиатура органа государства.

Ответ

Название поля Назначение поля Формат Описание
status Код ответа число 200 — успешно, другое значение — ошибка.
string Текст ответа строка Если ошибка — ее текст, если успешно — ТурКод.

Только один турист допустим в присланном туре, иначе сервис вернет ошибку. ПО туроператора должно присвоить возвращенный туркод каждому туристу и отобразить в соответствующих печатаемых документах.

Создание туркода с несколькими местами пребывания

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

Дополнительные поля в input

Переменная Назначение поля Обяз. Формат Описание
offercounter Счетчик доп. перелетов Да число Число, меньшее на 1, чем кол-во доп. перелетов. (Например, для 3 доп. перелетов = 2).
offertype_0 Тип доп. трансфера Да строка Единственное поддерживаемое значение «flight».
o_date_from_0 Дата начала (доп. страна) Да ДД.ММ.ГГГГ Дата прилета этого доп. перелета.
o_date_to_0 Дата конца (доп. страна) Да ДД.ММ.ГГГГ Дата покидания новой локации.
o_airlines_0 Код авиакомпании (доп.) Да строка То же, что q_airlines, но для доп. перелета.
o_airport_0 Код аэропорта (доп. страна) Да строка То же, что q_airport, но для доп. перелета.
o_flight_0 Номер авиарейса (доп.) Нет строка То же, что q_flight, но для доп. перелета.
o_country_0 Страна пребывания (рус) (доп.) Да строка То же, что q_country, но для доп. перелета.
o_hotel_0 Название отеля (доп.) Нет строка То же, что q_hotel, но для доп. перелета.

В конце имени переменной (_0) для каждого последующего перелета увеличивать значение на единицу (_1, _2 и т.д.).

Пример create.json для сложного тура:

{
    "input":{
        "q_touragent":"ADIYA TRAVEL",
        "q_touragent_bin":"123456789012",
        "q_country":"Россия",
        "q_countryen":"Russia",
        "q_airport_start":"ALA",
        "q_airlines":"DV",
        "q_airport":"AAQ",
        "q_date_from":"17.11.2018",
        "q_date_to":"24.11.2018",
        "q_days":8,
        "q_remark":"tour notes here",
        "clientcounter":0,
        "c_name_0":"Client_$CID",
        "c_borned_0":"01.01.1970",
        "c_doc_date_0":"02.11.2016",
        "c_doc_number_0":"N08462365",
        "c_doc_production_0":"MIA OF RK",
        
        "offercounter":1,
        "offertype_0":"flight",
        "o_date_from_0":"19.11.2018",
        "o_date_to_0":"21.11.2018",
        "o_airlines_0":"TK",
        "o_airport_0":"IST",
        "o_country_0":"Турция",
        
        "offertype_1":"flight",
        "o_date_from_1":"21.11.2018",
        "o_date_to_1":"24.11.2018",
        "o_airlines_1":"TG",
        "o_airport_1":"BKK",
        "o_country_1":"Таиланд"
    },
    "module":"voucher",
    "section":"partner",
    "object":"queries",
    "param1":"163",
    "param2":"save",
    "formid":163,
    "agentlogin":"test",
    "agentpass":"test",
    "return":"q_number"
}

Порча туркода

Если тур видоизменился, необходимо отменить старый тур (пометить на «порчу»), создать новый и получить новый ТурКод. Если не отменить старый, взнос будет списан дважды.

wget -q -O - 'http://test.fondkamkor.kz' -S --post-file=bad.json --header 'Content-Type: application/json'

При этом файл bad.json содержит следующее:

{
    "input":{
        "msg":"Аннулируйте туркод - в нем неправильно указан город прилета. Верный туркод - 123456-7890",
        "replyto":"manager@touroperator.kz"
    },
    "module":"voucher",
    "section":"partner",
    "object":"queries",
    "param1":"4Ru61117-32",
    "param2":"bad",
    "agentlogin":"test",
    "agentpass":"test"
}

Ответ сервиса будет примерно таким:

  HTTP/1.1 200 OK
  Server: nginx/1.1.4
  Content-Type: application/json;charset=UTF-8
  Connection: close
  Cache-Control: no-store, no-cache, must-revalidate
  Pragma: no-cache
  Date: Sat, 19 Nov 2016 22:57:01 GMT
  FastCGI-PID: 17961{"target":"/Voucher/partner/queries/33/view","status":200,
"string":"
Вы будете перенаправлены на запрошенный адрес
..."}

Подробное объяснение структур запроса и ответа:

Запрос

Переменная Назначение поля Обяз. Формат Описание
param1 ТурКод Да число ТурКод, по которому будет найден тур в реестре.
param2 Действие над туром Да строка bad — при порче тура.

Хэш (объект) input:

Переменная Назначение поля Обяз. Формат Описание
msg Текст описания Да строка Объяснение причины отмены. Должно быть осмысленным.
replyto E-mail оператора Да строка Обратный адрес для связи.

Ответ

Название поля Назначение поля Формат Описание
target Ссылка на отмененный тур строка URL-адрес для просмотра в браузере.

Функция повтора создания туркода

При недоступности сервиса или ошибках ПО туроператора должно попытаться позже (спустя время, не мгновенно) еще раз получить туркод, либо оповестить сотрудников.

Не создавайте бесконечные циклы запросов. ПО должно ограничивать попытки (например, сутками или N-количеством) и оповещать сотрудников. Причины ошибок могут быть разными:

  • Аккаунт туроператора заблокирован.
  • Закончились деньги на счету.
  • Ошибки в полях запроса.

Бесконечные попытки могут привести к перегрузке одной или обеих систем.

Справочные методы

Для синхронизации названий (стран, аэропортов) в параметрах туров нужны справочники. Туры с неизвестными значениями не будут обработаны.

Запрос справочника

Переменная Назначение поля Обяз. Формат Описание
object Название метода Да строка Значение должно быть dictionaries
param1 Действие Да строка Единственное допустимое действие — get
param2 Название справочника Да строка Доступные: countries, airports, airlines, agents

Хэш (объект) input:

Переменная Назначение поля Обяз. Формат Описание
what Массив запрашиваемых полей Нет список строк Если не указать, будут выведены все столбцы.
output Структура ответа Нет строка Если не указать, массив variants будет содержать объекты, а не списки.

Ответ

Название поля Назначение поля Формат Описание
target Ссылка на отмененный тур строка URL-адрес для просмотра в браузере.

Получение массива данных по странам:

wget -q -O - 'http://test.fondkamkor.kz' -S --post-file=dict_countries.json --header 'Content-Type: application/json'

Файл dict_countries.json:

{
    "input":{
        "what":["country","countryen","currency"],
        "output":"array"
     },
     "module":"voucher",
     "section":"partner",
     "object":"dictionaries",
     "param1":"get",
     "param2":"countries",
     "agentlogin":"test",
     "agentpass":"test"
}

Ответ сервиса:

  HTTP/1.1 200 OK
  ...
  FastCGI-PID: 17961{"variants":[["Австралия","Australia","USD"],["Австрия","Austria","EUR"],...],"dictname":"countries"}

Получение массива данных по аэропортам:

wget -q -O - 'http://test.fondkamkor.kz' -S --post-file=dict_airports.json --header 'Content-Type: application/json'

Файл dict_airports.json:

{
    "input":{
        "what":["iata","icao","country","countryen"],
        "output":"array"
     },
     "module":"voucher",
     "section":"partner",
     "object":"dictionaries",
     "param1":"get",
     "param2":"airports",
     "agentlogin":"test",
     "agentpass":"test"
}

Получение массива данных по авиалиниям:

wget -q -O - 'http://test.fondkamkor.kz' -S --post-file=dict_airlines.json --header 'Content-Type: application/json'

Файл dict_airlines.json:

{
    "input":{
        "what":["iata","icao","country","airline","companyname","address","airline_url"],
        "output":"array"
     },
     "module":"voucher",
     "section":"partner",
     "object":"dictionaries",
     "param1":"get",
     "param2":"airlines",
     "agentlogin":"test",
     "agentpass":"test"
}

Ссылки на файлы XLS для ручной сверки:

Если вы встретили ошибку «Invalid Country/IATA combination» или «Invalid Country/IATA code», но уверены в данных, обратитесь в техподдержку для обновления справочников.

На правах рекомендации

  1. Введите понятие «туркод» в свою программу.Имеет смысл привязать туркод к туристу/заявке и дать ему статус (активен, испорчен) и причину порчи. Так, один турист может иметь несколько туркодов (старый испорченный, новый действующий), и менеджер сможет управлять этим процессом из программы.
  2. Уделите внимание обработке ошибок.В сезон у менеджеров не будет времени читать тонны писем об ошибках (например, «закончились средства на балансе»). Нужен переключатель, отключающий регулярную посылку данных при получении критических или повторяющихся ошибок, с оповещением ответственных.
  3. Указывайте больше данных об агенте.Если в поле названия агентства (q_touragent) вы будете включать город или email/телефон, это облегчит поиск турагента в случае форс-мажоров и снизит нагрузку на сотрудников туроператора.

Обновления документации:

31.05.2022
Добавлена инфорамация по оформлению дополнительных авиаперелетов в ходе путешествия, поля отелей, БИН турагента.

03.10.2017
Добавлена информация по двум обязательным полям ввода: q_airlines и q_airport_start. Добавлено описание запроса справочника airlines. Обязательность начнет действовать с 1го января 2018 года.

13.12.2016
Удален абзац:

«На сегодня (20.11.2016) остается открытым вопрос о количестве туристов в туре…»

Вместо него добавлена фраза:

«Только один турист допустим в присланном туре, иначе сервис вернет ошибку. ПО туроператора должно присвоить возвращенный туркод каждому туристу и отобразить в соответствующих печатаемых документах для туриста.»