Розробка мобільного додатку для залізничних квитків
Додаток для продажу залізничних квитків вимагає інтеграції з API перевізника—у Росії це ОАО РЖД через ІС «Експрес-3» або через посередницькі платформи (Tutu.ru API, UFS, Ticketcloud). Прямий доступ до Експрес-3 доступний лише уповноважених агентів, тому більшість незалежних додатків використовує агрегаторів.
Особливості інтеграції з ж/д API
Пошук маршрутів в Експрес-3 повертає поїзди зі всіма вагонами, типами місць та наявністю. Відповідь важка—до 500 KB XML на популярних напрямках типу Москва–Санкт-Петербург. Десеріалізація на головному потоці—гарантована ANR на Android або зависання на iOS. Парсимо в background queue: DispatchQueue.global(qos: .userInitiated) на iOS, Dispatchers.IO на Android.
Вибір місця у вагоні—інтерактивна схема, аналогічна авіа, але з купе, плацкартою та СВ. Кожна схема різна; дані про розкладку вагона надходять з API у вигляді масиву місць з координатами. Рендеримо через Canvas—кастомний компонент з підтримкою zone select mode (нижня/верхня полиця для плацкарти).
// Фільтрування вагонів за типом
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 години до відправлення.
Оплата та повернення
СБП—бажаний варіант для більшості користувачів: миттєво, без комісії для фізичних осіб. YooKassa або ПСБ (Промсвязьбанк, офіційний еквайєр РЖД). Apple Pay через PKPaymentRequest та Google Pay через PaymentsClient—обов'язкові для високої конверсії.
Повернення квитка—окремий API-виклик з розрахунком штрафу за тариф: більше 8 годин до відправлення—повне повернення мінус сервісний збір, менше 8 годин—50% вартості. Логіку розрахунку штрафу не реалізуємо на клієнті—лише показуємо дані від сервера. Деякі агрегатори (UFS, Tutu) повертають суму повернення прямо у відповіді на запит скасування.
Пошук та історія поездок
Пошук за маршрутом: поле звідки-куди з автодоповненням—для Tutu API це GET /v1/cities?q=mosk. Довідник станцій завантажується при першому запуску та кешується локально (близько 2500 станцій РЖД).
Типовий пошук повертає 10–30 поїздів з різними часами відправлення. Сортування: за часом відправлення, за часом у подорожі, за ціною (нижчого класу). Фільтрація: тип вагона, лише з нижніми полицями, час відправлення (день/ніч).
Історія поездок у «Мої квитки»: активні (майбутні), архів. Для кожної поїздки—кнопка «Повернути квиток» з розрахунком суми повернення та кнопка «Показати QR» для офлайн-доступу.
Динамічні ціни та «лотерея» місць
В ІС «Експрес-3» діє динамічне ціноутворення: ціна нижньої полиці в купе зростає в міру зменшення вільних місць та наближення дати відправлення. При пошуку «Москва–Адлер» за місяць ціна купе може бути 3500 руб., за тиждень—5800 руб., за день—7200 руб. Показуємо цю інформацію в карточці поїзда.
Терміни
6–8 тижнів для додатку з пошуком, вибором місць, оплатою, поверненням та історією поездок через агрегаторський API. Вартість розраховується індивідуально після аналізу вимог.







