Разработка мобильного приложения для ж/д билетов
Приложение для продажи железнодорожных билетов требует интеграции с API перевозчика — в случае России это ОАО РЖД через ИС «Экспресс-3» или через посреднические платформы (Tutu.ru API, UFS, Ticketcloud). Прямой доступ к Экспресс-3 доступен только авторизованным агентам, поэтому большинство независимых приложений идёт через агрегаторов.
Особенности интеграции с ж/д API
Поиск маршрутов в Экспресс-3 возвращает поезда со всеми вагонами, типами мест и наличием. Ответ тяжёлый — до 500 Кб XML на популярных направлениях типа Москва–Санкт-Петербург. Десериализация на главном потоке — гарантированное ANR на Android или зависание на iOS. Парсим в background queue: DispatchQueue.global(qos: .userInitiated) на iOS, Dispatchers.IO на Android.
Выбор места в вагоне — интерактивная схема, аналогичная авиа, но с купе, плацкартой и СВ. Каждая схема разная; данные о раскладке вагона приходят из API в виде массива мест с координатами. Рендерим через Canvas — кастомный компонент с поддержкой zoneSelectmode (нижняя/верхняя полка для плацкарты).
// Фильтрация вагонов по типу
data class CarriageFilter(
val type: CarriageType, // PLATZKART, COUPE, SV, SITTING
val onlyLowerBerths: Boolean = false,
val withBedding: Boolean = true
)
// Composable для выбора типа вагона
@Composable
fun CarriageTypeSelector(
available: List<CarriageType>,
selected: CarriageType,
onSelect: (CarriageType) -> Unit
) {
LazyRow(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
items(available) { type ->
FilterChip(
selected = type == selected,
onClick = { onSelect(type) },
label = { Text(type.localizedName()) }
)
}
}
}
Электронный билет и офлайн-доступ
После оплаты пользователь получает маршрутную квитанцию в PDF. Контролёр РЖД принимает QR-код — его нужно хранить локально, доступным без интернета. На iOS — WKWebView с загруженным локально PDF, или нативная отрисовка через PDFKit. На Android — PdfRenderer из android.graphics.pdf.
Push-уведомления через FCM/APNs: изменение расписания, задержка поезда (данные через API статуса поезда РЖД), напоминание за 24 часа до отправления.
Оплата и возврат
СБП — предпочтительный вариант для большинства пользователей: мгновенно, без комиссии для физлиц. ЮKassa или ПСБ (Промсвязьбанк, официальный эквайер РЖД). Apple Pay через PKPaymentRequest и Google Pay через PaymentsClient — обязательны для высокой конверсии.
Возврат билета — отдельный API-вызов с расчётом штрафа по тарифу: до отправления более 8 часов — полный возврат за вычетом сервисного сбора, менее 8 часов — 50% стоимости. Логику расчёта штрафа не реализуем на клиенте — только показываем данные от сервера. Некоторые агрегаторы (UFS, Tutu) возвращают сумму к возврату прямо в ответе на запрос отмены.
Поиск и история поездок
Поиск по маршруту: поле откуда-куда с автодополнением — на Tutu API это GET /v1/cities?q=моск. Справочник станций загружается при первом запуске и кэшируется локально (около 2500 станций РЖД).
Типичный поиск возвращает 10–30 поездов с разными временами отправления. Сортировка: по времени отправления, по времени в пути, по цене (нижнего класса). Фильтрация: тип вагона, только с нижними полками, время отправления (день/ночь).
История поездок в «Моих билетах»: активные (предстоящие), архив. Для каждой поездки — кнопка «Вернуть билет» с расчётом суммы возврата и кнопка «Показать QR» для офлайн-доступа.
Динамические цены и «лотерея» мест
В ИС «Экспресс-3» действует динамическое ценообразование: цена нижней полки в купе растёт по мере уменьшения свободных мест и приближения даты отправления. При поиске «Москва–Адлер» за месяц цена купе может быть 3500 руб., за неделю — 5800 руб., за день — 7200 руб. Показываем эту информацию в карточке поезда.
Сроки
6–8 недель для приложения с поиском, выбором мест, оплатой, возвратом и историей поездок через агрегаторский API. Стоимость рассчитывается индивидуально после анализа требований.







