e-Ticket misunderstanding
Привет! Все больше пассажиров пользуется электронными билетами — это факт. И многие из них состоят в различных бонусных программах и пытаются накопить мили как на земле так и в воздухе. Это прикольно. Для увеличения количества этих миль даже выпускают специализированные банковские карты, расплачиваясь которыми вы приумножаете этот баланс. Интересная особенность обнаружилась на сайте одного перевозчика. Давайте взглянем! ПредысторияЯ несколько раз покупал билеты через online сервис. Ничего необычного и в этот раз, кроме того, что меня несколько раз отвлекали. Я ввел свои реальные данные, нажал «Продолжить» и оказалось, что ошибся в одной букве в фамилии (залипла клавиша).При этом обнаружились очень интересные факты. Эту же ошибку я сформулировал с выдуманными из головы данными.ПроверкаИтак, мы практически на пути к успеху и заполнили все необходимые поля данных: Все данные введены случайно, кроме моего реального номера бонусной карты, который я и использовал при первом появлении этой ошибки.Как видно никакой валидации по номеру карты и ФИО не производится, страница сообщает нам, что все «ok».Это значит, что такой номер бонусной карты действительно существует, и это правда.Жмем далее… и ошибка, собственно такая же, которую я получил, когда ошибся со своей фамилией: Неавторизированное использование карты, о как. Ну все правильно, у выдуманного товарища не может быть карты с номером, который привязан ко мне (как физическому лицу), так же как и самого меня с неправильной фамилией. Справедливости ради стоит отметить такой баннер на странице: «Внимание! Если Вы указываете универсальную карту или карту «РЖД-Бонус» убедитесь, что фамилия, имя и отчество указаны те же самые, что и при регистрации карты. Если при регистрации карты указывалось отчество, то оно обязательно для заполнения на данной странице.» Предупреждение отличное, но от случайных ошибок, как видно, никто не застрахован. Почему не использовать дополнительные механизмы проверки? Но давайте просмотрим весь текст ошибки: Passenger{id='0', lastName='ИВАНОВ', firstName='ПЕТРОВ', middleName='СИДОРОВ', tariffType=Полный, dateOfBirth=Wed Feb 07 00:00:00 MSK 1996, documentType=DocType{id=1, code='ПН', name='Паспорт РФ}, documentNumber='1222567890', citizenship=Country{expressCode=**, isoAlpha3='RUS', isForcedRegistrationAllowed=true, localizedNames='{en={name=Russian Federation}, ru={name=Россия}}'}, gender=Male, universalCardNumber='null', loyaltyCardNumber='*********************', birthplace='Самара', insuranceCompany='null', babyPassenger='null'}, order=OrderBean{id=, saleOrderId=null, departureStationId=2000003, arrivalStationId=2024000, srcStation='МОСКВА КАЗ', dstStation='САМАРА', distance=null, departureTrain=Train{typeId='2', expressCategoryId='1', date=12.03.2015 20:08:00.000, trainDepartureDate=null, comments=null, isOnboardRegistrationAvailable=false, brand=null, departureStationShortName='МОСКВА КАЗ', arrivalStationShortName='САМАРА'}, arrivalTrain=Train{typeId='null', expressCategoryId='null', date=09.03.2015, trainDepartureDate=null, comments=null, isOnboardRegistrationAvailable=false, brand=null, departureStationShortName='null', arrivalStationShortName='null'}, carrierId=1, carriage=ru.tehnosk.chameleon.layer.express.bean.response.buyTicket.Carriage{number='03', owner={type='КБШ', railway=null}, addSigns='У1', serviceClass=1У, isOnboardRegistrationAvailable=false, tripClass=null} SUPER: AbstractCarriage{type=Люкс, number='03', carCarrierGroup=CarCarrierGroup{id='1' name='ФПК', isFoodChoiceAvailable=true, foodChoiceStopHours=48}, carCarrier=Carrier{name='ФПК КУЙБЫШЕВСКИЙ', id=200, isForcedRegistrationAllowed=true, carCarrierGroup=CarCarrierGroup{id='1' name='ФПК', isFoodChoiceAvailable=true, foodChoiceStopHours=48}, isNotForSale=false, locale2fieldName2value={ru={name=ФПК КУЙБЫШЕВСКИЙ}, en={name=ФПК КУЙБЫШЕВСКИЙ}}}, serviceClass='1У', addSigns='У1', foodAvailabilityFlag=true}, tariff=ru.tehnosk.chameleon.layer.express.bean.response.buyTicket.Tariff{type='null'} {cost='7304.0'}, totalCostInEuro=null, totalCostInPoints=null, totalInsuranceCost=0, tickets=[TicketBean{id=128532684, orderId=119344058, ordinal=1, number='71751387597061', reservationNumber=null, passCount=1, seats='010', seatsType='Н', tariffType=Полный, tariffInfo='null', tariffB=3636.6, tariffP=3667.4, tariffBP=7304.0, tariffInsurance=0.0, tariffService=0.0, tariffNDS=1114.17, price=7304.0, priceInEuro=null, priceInPoints=null, priceInPointsMoney=null, status=Забронирован, code2D='null', registrationChangeDate=null, containsDet5=false, refundTariff=null, refundDate=null, refundInfo='null', refundKrs=null, trainmasterLogin='null', Параметр loyaltyCardNumber='*********************' — это номер моей карты. Остальное — это служебная и географическая информация с идентификаторами. Все, что выше вполне соответствует введенной информации. Но как всегда есть подводные камни…Вот этот кусок вызывает отдельный интерес:*/ passengers=[ru.tehnosk.chameleon.layer.express.bean.PassengerBean{id=**********, index=null, middleName='*************ИЧ', firstName='*********Н', lastName='****Е******', tariffType=null, dateOfBirth=**.**.19** 00:00:00.000, documentType=DocType{id=1, code='ПН', name='Паспорт РФ}, documentNumber='1222567890', citizenship=Country{expressCode=20, isoAlpha3='RUS', isForcedRegistrationAllowed=true, localizedNames='{ru={name=Россия}, en={name=Russian Federation}}'}, gender=Male, cardNumber='null', loyaltyCardNumber='null', isFullComp=false, insurance=null}], foodChoice={}}]
*/Здесь я нашел свои законные ФИО и дату рождения… Хорошо хоть паспортные данные оставили выдуманные. Кстати тут параметр бонусной карты такой: loyaltyCardNumber='null'. Получается совсем невеселая история, хорошо, если у вас клавиша залипнет, а если нет? Текст ошибки далее: refundedTicketFromReissuedOrder=null, expiredDate=null, orderNumber='', dbRecordCreateDate=null, createDate=09.03.2015, status=null, statusChangeDate=null, payGateData=ru.tehnosk.chameleon.layer.express.bean.response.buyTicket.PayGateData{payGateOrderId='null', payGateSessionId='null'}, ticketQuantity=1, passengerQuantity=null, seatQuantity=1, paymentForm='null', agentId='1', subagentId='null', seatNumbers='010', timeInfo='КУРИТЬ ЗАПРЕЩЕНО.; ВРЕМЯ ОТПР И ПРИБ МОСКОВСКОЕ; ', attrs='null', terminalNumber='', issueRailway='null', issueCc='null', compCc='null', posNumber='null', login='null', isInternational=false, isCisInternational=false, e3gwNegativeResult=null, directionType=Forward, isRegistrationAvailable=true, isInactive=false, isTeema=false, isAutorackAvailable=false, hasAutorackOrder=false, isDeferredPayment=false, deferredPaymentDeadline=null, isEntireCompartment=false, availableFoodTypes=[], refundedTicketId=null, relatedOrderId=null, ferry=false, busFlag=false, autoRequest=null} Надеюсь, они поправят этот функционал в кратчайшие сроки, т.к. сообщение в РЖД было направлено.P.S. А вот и оперативный ответ: Ответ, конечно занимательный. Я согласен, что бонусная карта индивидуальная, но это никак не коррелирует с тем фактом, что система покупки билетов (связь между данными в бонусной программе и данными вводимыми в форму) является некорректной. Хочу отметить, что номер бонусной карты я вводил исключительно свой. Может моя карта уникальная? P.P. S.Прошла еще неделя, был написан еще один запрос, т.к. ситуация не изменилась. Еще один ответ от РЖД: Получается что никто ни за что не отвечает, покупаете вы на на сайте РЖД, а бонусная программа это вообще что-то третье…Можно конечно успокоится и не пользоваться электронными услугам, т.к.: и Честно говоря, качать политику и ее изучать после прочтения 2-ух строк об общедоступности ПДн большого желания у меня не было.Так все организации могут сделать? Немного мыслей для размышления.Надеюсь информация будет полезной.