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», но уверены в данных, обратитесь в техподдержку для обновления справочников.
На правах рекомендации
- Введите понятие «туркод» в свою программу.Имеет смысл привязать туркод к туристу/заявке и дать ему статус (активен, испорчен) и причину порчи. Так, один турист может иметь несколько туркодов (старый испорченный, новый действующий), и менеджер сможет управлять этим процессом из программы.
- Уделите внимание обработке ошибок.В сезон у менеджеров не будет времени читать тонны писем об ошибках (например, «закончились средства на балансе»). Нужен переключатель, отключающий регулярную посылку данных при получении критических или повторяющихся ошибок, с оповещением ответственных.
- Указывайте больше данных об агенте.Если в поле названия агентства (
q_touragent) вы будете включать город или email/телефон, это облегчит поиск турагента в случае форс-мажоров и снизит нагрузку на сотрудников туроператора.
Обновления документации:
31.05.2022
Добавлена инфорамация по оформлению дополнительных авиаперелетов в ходе путешествия, поля отелей, БИН турагента.
03.10.2017
Добавлена информация по двум обязательным полям ввода: q_airlines и q_airport_start. Добавлено описание запроса справочника airlines. Обязательность начнет действовать с 1го января 2018 года.
13.12.2016
Удален абзац:
«На сегодня (20.11.2016) остается открытым вопрос о количестве туристов в туре…»
Вместо него добавлена фраза:
«Только один турист допустим в присланном туре, иначе сервис вернет ошибку. ПО туроператора должно присвоить возвращенный туркод каждому туристу и отобразить в соответствующих печатаемых документах для туриста.»