Срок действия — самая незаметная часть карты и одновременно самая коварная для разработчика. Формат срока действия карты предельно прост: на пластике печатают месяц и год, каждый двумя цифрами, разделённые наклонной чертой. Однако за этой простотой прячется правило, из-за которого форма может отказать действующей карте: карта считается действительной до конца указанного месяца, а не до его начала. Ниже — как читать этот срок, что происходит с ним внутри системы и какие ошибки при вводе встречаются чаще всего.
Что означает срок на карте
Две цифры месяца и две цифры года говорят одно: до какого момента банк обещает обслуживать этот пластик. Дата выпуска на карте обычно не печатается, поэтому по надписи нельзя понять, новая она или ей уже пять лет. Важна только правая граница.
Действие заканчивается в последний день указанного месяца. Карта с отметкой месяца 9 и года 26 работает всё первое сентября, второе и так далее — до последнего дня сентября включительно. Первого октября та же карта становится недействительной, хотя надпись на ней не изменилась ни на цифру. Это единственное правило, которое действительно нужно помнить, и именно его чаще всего реализуют неправильно.
Почему форма иногда отвергает действующую карту?
Причина почти всегда в одной из двух ошибок реализации. Первая: сравнение делается по началу месяца. Тогда карта перестаёт приниматься уже первого числа того месяца, который указан на ней как последний, — то есть ровно на тридцать дней раньше положенного.
Вторая ошибка связана с годом. На карте напечатаны только две последние цифры года, и разработчик иногда подставляет к ним первые две цифры текущего столетия, не учитывая перехода через границу веков, а иногда просто хранит год как есть и сравнивает значения между собой. Оба подхода ломаются на краевых случаях.
Есть и третья, самая обидная: форма считает карту просроченной по локальному времени пользователя, а сервер — по своему часовому поясу. Для человека, который платит в последний день месяца поздно вечером, это может закончиться отказом. Если вы пишете платёжный сервис, договаривайтесь о едином часовом поясе заранее.
Как хранить срок внутри системы?
Здесь важно развести два разных представления, которые часто путают. То, что напечатано на карте, — это формат отображения: две цифры месяца и две цифры года. То, что удобно хранить и передавать, — это, как правило, полный год из четырёх цифр и номер месяца отдельно.
Разница не косметическая. Если сохранить год двумя цифрами, вы теряете однозначность, и любой отчёт, в котором нужно отсортировать карты по дате окончания, потребует дополнительных догадок. Если сохранить только строку с наклонной чертой, вы получите лишнюю зависимость от формата отображения и будете разбирать её в каждом месте, где срок нужно сравнить с текущей датой.
Хорошее правило звучит так: на входе принимайте привычную человеку запись, внутри держите отдельные числовые значения месяца и полного года, а на выходе показывайте то, что напечатано на карте. Тогда сравнение с текущей датой сводится к одной понятной операции.
Что подставлять в форму при тестировании
Для проверки формы нужны не один, а несколько сроков, и все они должны быть заранее известны.
- Далёкий будущий срок. Обычная карта, никаких вопросов.
- Текущий месяц. Действующая карта, которую неверная реализация отвергнет. Это главный тест.
- Прошлый месяц. Просроченная карта, форма должна сообщить об этом понятным текстом.
- Последний месяц года. Проверка перехода между годами.
- Первый месяц следующего года. Проверка того же перехода с другой стороны.
Набор для такой проверки вместе с номерами удобно получить в генераторе. Все значения в нём структурно корректны, но никогда не выпускались ни одним банком и не принадлежат никому: это материал для тестов интерфейса, а не способ оплатить что-либо.
Бывает ли срок действия короче года?
Бывает, и это отдельный сюрприз для формы. Виртуальные карты, выпускаемые для одной покупки, иногда живут всего несколько месяцев, а карты, выпущенные на короткий срок, встречаются в корпоративных программах. Никакого правила «минимум год» не существует, поэтому форма не должна отвергать близкий срок только потому, что он кажется ей подозрительно коротким.
Отдельно стоит держать в голове перевыпуск. Когда пластик перевыпускают, номер может остаться прежним, а срок действия — измениться: старый перестаёт действовать, новый начинает. Для системы это означает, что сохранённый ранее срок нужно уметь обновлять, а не считать однажды записанное значение вечной истиной. Если вы храните срок вместе с номером, добавьте понятный способ его замены: иначе покупатель с обновлённой картой будет получать отказ, пока кто-нибудь не догадается посмотреть в базу.
Что важно разработчику
Поле ввода для месяца и года стоит делать с раздельными частями, а не одной длинной строкой: так пользователь не запутается, что куда вводить. Не переусердствуйте с автопереходом между полями — он мешает, когда человек исправляет уже введённое. И обязательно подписывайте поля так, как они подписаны на карте: человек смотрит на пластик, а не на документацию.
Логику «просрочено или нет» лучше вынести в одно место и покрыть тестами на краевые значения. Проверять нужно четыре случая минимум: последний день текущего месяца, первый день следующего месяца, декабрь и январь. Если срок хранится как пара чисел «месяц и полный год», сравнение получается прямым и не зависит от строковых форматов.
Отдельно подумайте о том, где стоит проверка. Проверка в браузере нужна для мгновенной подсказки, но решение о том, принимать ли карту, принимает сервер. Если карта просрочена, сообщение должно быть корректным и не раскрывать лишнего: «срок действия истёк» — понятный и достаточный текст, подробности о внутренних правилах банка покупателю не нужны.
И последнее: не забудьте про автозаполнение. Браузер часто подставляет срок из сохранённого профиля, и если автозаполнение вставит значение в другом порядке, форма может отвергнуть верные данные. Полезно проверить этот сценарий отдельно, поскольку пользователь считает, что ничего не вводил, и не понимает, откуда взялась ошибка.
Что делать дальше
Возьмите свою форму и введите в неё срок, равный текущему месяцу. Если она отказывается принимать такую карту — вы нашли дефект, который стоит исправить до того, как его найдёт покупатель. Затем прогоните все пять краевых случаев из списка выше и сверьте остальные проверки с чек-листом платёжной формы. Понимание того, как устроен сам номер, поможет разбирать ошибки быстрее — об этом в материале про формат номера карты.