Максимальный год истечения срока действия кредитной карты

149

Различные онлайн-сервисы имеют разные значения максимального срока годности, когда речь идет о кредитных картах.

Например:

  • Basecamp: +15 лет (2025)
  • Амазонка: +20 лет (2030)
  • Paypal: +19 лет (2029)

Какой здесь разумный максимум? Есть ли официальные рекомендации?

Искусство
источник
1
Несоответствие между крупными интернет-магазинами указывает на отсутствие официального руководства.
Мэтт Болл
10
Я люблю сайты, которые просят год истечения с простым вводом текста ...
Квентин
1
@Quentin это лучше, чем ошибочная проверка, которая запрещает отправку, если пользователь не знает, как использовать dev веб-браузера. инструменты.
Аластер
4
@Alastair - Мой комментарий не был саркастичным.
Квентин
1
@ Достаточно справедливо. Многоточие бросило меня. :-P Для пользователя это явно наименее раздражающая реализация, но с точки зрения развития / бизнеса, было бы так много ошибочных входных данных (и это могло привести к потере продаж).
Аластер

Ответы:

65

Официального руководства не существует, поскольку эмитенты кредитных карт могут выбрать каждый из них по истечении срока действия выдаваемых ими карт. На самом деле они выпускали карты на все более длительные периоды времени. Если вы пытаетесь определить, как далеко в будущем вы должны учитывать сроки годности, допустите ошибку и дайте своим клиентам много лет на выбор. Таким образом, вы подтвердите свое будущее.

К вашему сведению, многие эмитенты кредитных карт не используют дату истечения срока действия при определении, следует ли одобрить покупку кредитной карты. Поэтому, если вы беспокоитесь о том, что указана неправильная дата, обработчик в конечном итоге получит окончательное решение о том, одобрена ли транзакция или нет, поэтому я не стал бы беспокоиться об этом.

Июль 2017 : у конечного пользователя только одна карта, срок действия которой истек почти через 50 лет.

Джон Конде
источник
2
Они могут одобрить без правильного кода, но они могут также взимать более высокие ставки за ваши транзакции, которые не имеют правильных кодов.
BVernon
Это верно только для проверки AVS и CVV.
Джон Конде
Это правда, что большинство эмитентов в любом случае одобрили бы транзакцию, ОДНАКО не предоставляя пользователю возможность выбора года на его карточке, это может отговорить его продолжить транзакцию. Я бы просто добавил 50 лет и ожидал, что ни один эмитент не намерен держать у вас кусок пластика так долго, даже если это долгий и немного раздражающий спад.
Мауро
16

Я бы либо динамически добавил + 15-20 лет к году текущей даты, либо предоставил бы текстовое поле для ввода года (что, лично я считаю, быстрее ввести две цифры, чем прокручивать список лет).

Брайан Денни
источник
7
возможно, если вы не используете мобильный телефон. Вы могли бы предпочесть пролистывать через годы. что-то рассмотреть.
Джедмао
10
Хороший вопрос @sfjedi, и давайте не будем забывать, что в большинстве браузеров вы все равно можете ввести номер, и он будет автоматически выбран.
Кевин Виския,
1
Хороший вопрос о вводе текста против выбора. Я всегда предпочитал ввод текста, но в последнее время с некоторыми из моих тестов пользовательского интерфейса на Android и iOS, я обнаружил, что некоторые опции кажутся немного проще. Тем не менее, использование HTML5 type = number быстро увеличивает числовую клавиатуру на мобильных устройствах, что также облегчает задачу. Кажется, это сводится к ошибкам валидации; возможно меньше ошибок с предопределенными опциями выбора.
Клинт Пахл
Я не уверен, что это будет хорошо работать на мобильном устройстве, но как насчет выпадающего / текстового поля? Вы можете либо ввести значение, либо выбрать его как обычно.
The Muffin Man
4

В качестве теоретического верхнего предела я предлагаю вам не рассматривать больше, чем ожидаемый срок службы держателя карты. Википедия делает это в своих редакционных стандартах для биографий живых людей :

Эта политика распространяется на любого человека, родившегося менее 115 лет назад, если только надежный источник не подтвердил его смерть. Люди старше 115 лет считаются мертвыми, если они не указаны в списке пожилых людей.

Итак, в своем коде найдите текущий год, добавьте 115 и используйте его в качестве теоретического верхнего предела к дате истечения срока действия кредитной карты. Вам никогда не придется больше трогать этот код.

MetaEd
источник
2
Я бы сказал, что это очень теоретически. Кто-то с такой старой карточкой мог бы быть выпущен в какое-то время между первым днем ​​рождения и днем ​​рождения. И тогда им придется прожить до 115 лет!
августа
40
Парень, это что-то сильное, что вы, ребята, курите!
Art
7
SWIM посчитал хорошей идеей (в то время) проанализировать список старейших людей Википедии, чтобы ограничить поле ввода возраста тем, maxчто на случай, если самый старый человек использовал форму, когда им исполнилось 116 ...: [
Alastair
А как насчет корпоративной карты, которая не обязательно привязана к человеку? В этом случае нет «теоретического» предела.
Аарон Бауман
3
Но @aaronbauman, по мнению Верховного суда США, корпорация - это человек. Таким образом, карта должна быть хороша только на 115 лет! :-)
Stonetip
1

Вот фрагмент кода Javascript, который можно использовать для отображения настраиваемого списка предстоящих лет для проверки CC:

    var yearsToShow = 20;
    var thisYear = (new Date()).getFullYear();
    for (var y = thisYear; y < thisYear + yearsToShow; y++) {
      var yearOption = document.createElement("option");
      yearOption.value = y;
      yearOption.text = y;
      document.getElementById("expYear").appendChild(yearOption);
    }
          <label for="expiration">Expiration Date</label>
          <span id="expiration">
            <select id="expMonth" name="expMonth">
              <option disabled="true">Month</option>
              <option value="1">Jan</option>
              <option value="2">Feb</option>
              <option value="3">Mar</option>
              <option value="4">Apr</option>
              <option value="5">May</option>
              <option value="6">Jun</option>
              <option value="7">Jul</option>
              <option value="8">Aug</option>
              <option value="9">Sep</option>
              <option value="10">Oct</option>
              <option value="11">Nov</option>
              <option value="12">Dec</option>
            </select>
            <select id="expYear" name="expYear">
            </select>
          </span>

abd3721
источник
0

Вот выборка лучших американских интернет-магазинов:

RETAILER        WINDOW IN YEARS
Amazon          20
Walmart         10
Apple           NA (TEXT FIELD)
Home Depot      19
Best Buy        10
Target          NA (TEXT FIELD)
eBay            NA (TEXT FIELD)
Google          19
Том Ховард
источник
-1

Хороший звонок, @Alistair.

Вот поколение месяца и года в ASP.NET MVC. Добавьте это к вашей модели представления:

public IList<SelectListItem> Months = new List<SelectListItem>() { 
    new SelectListItem() { Text="Jan", Value="01" },
    new SelectListItem() { Text="Feb", Value="02" },
    new SelectListItem() { Text="Mar", Value="03" },
    new SelectListItem() { Text="Apr", Value="04" },
    new SelectListItem() { Text="May", Value="05" },
    new SelectListItem() { Text="Jun", Value="06" },
    new SelectListItem() { Text="Jul", Value="07" },
    new SelectListItem() { Text="Aug", Value="08" },
    new SelectListItem() { Text="Sep", Value="09" },
    new SelectListItem() { Text="Oct", Value="10" },
    new SelectListItem() { Text="Nov", Value="11" },
    new SelectListItem() { Text="Dec", Value="12" },
};
public IEnumerable<SelectListItem> Years
{
    get
    {
        return new SelectList(Enumerable.Range(DateTime.Today.Year, 15));
    }
}

И это на ваш взгляд:

<fieldset>
    <legend>Card expiration</legend>
    <div style="float: left;">
        <div class="editor-label">
            @Html.LabelFor(model => model.ExpirationMonth)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.ExpirationMonth, Model.Months)
            @Html.ValidationMessageFor(model => model.ExpirationMonth)
        </div>
    </div>
    <div style="float: left;">

        <div class="editor-label">
            @Html.LabelFor(model => model.ExpirationYear)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.ExpirationYear, Model.Years)
            @Html.ValidationMessageFor(model => model.ExpirationYear)
        </div>
    </div>
</fieldset>
Рэп
источник
-1

Хотя второй пример выполняется в два раза быстрее первого, вы все равно получаете дату и извлекаете год из нее 20, а не 40 раз. Лучшее развертывание цикла:

$StartDate=date('Y');
$EndDate=$StartDate+21;
for($i=$StartDate;$i<$EndDate;$i++){
    echo "<option value='".$i."'>".substr($i,2)."</option>\n";

Это будет примерно в 20 раз быстрее, чем в два раза быстрее, а также устраняет небольшую ошибку в исходном коде, заключающуюся в том, что год может измениться от одной выборки даты к следующей, что приведет к неожиданным, хотя и в этом случае безвредным результатам.

user3347790
источник
-2
<?php 
$y = gmdate("Y");
$x = 20;
$max = ($y + $x);
while ($y <= $max) {
echo "<option value='$y'>$y</option>";
$y = $y + 1;
}
?>
Луи Феррейра
источник
1
Просто вариант вышеупомянутого, лучше добавить годы для выбора и сделать выпадающие для выбора месяца и года. Пользователи склонны вводить вариации месяца и года по-разному, если их просто представить в одном текстовом поле.
Луи Феррейра
-2

Если вам нужно решение, которое не дает трехзначных лет 2100+, вы должны модулировать дату, соответственно, вы должны заполнить начальным нулем для xx00-xx09 лет, чтобы не получить однозначные годы.

Это будет очень важно, начиная с 2080 года.

<?php
    for($i=0;$i<=20;$i++){
        $aktDate = sprintf("%02d", ((date('y')+$i)%100));
        echo "<option value=\"{$aktDate}\">{$aktDate}</option>\n";
    }
?>
Хендрик
источник
-3

Прочитав верхний срок действия OP для Amazon на 20 лет, я написал это простое решение на PHP:

<select name='Expiry-Year'>
    <option value="">yy</option>
    <?php
    for($i=0;$i<21;$i++){
        echo "<option value='".(date('Y')+$i)."'>".(date('y')+$i)."</option>\n";
    }
    ?>
</select>

Это значительно сократило количество этих новогодних запросов на удаление last yearиз формы.

Более простая версия цикла выполняется в два раза быстрее:

<select name='Expiry-Year'>
    <option value="">yy</option>
    <?php
    for($i=date('Y');$i<date('Y')+21;$i++){
        echo "<option value='".$i."'>".substr($i,2)."</option>\n";
    }
    ?>
</select>
Аластер
источник
4
Понимаете ли вы , что вызов date('Y')и в date('y')20 раз каждый довольно медленно?
Алексис Вилке
Относительно нет, @Alexis, но я добавил версию, которая работает в два раза быстрее для вас. : P
Аластер
-6
<script type="text/javascript">
  var select = $(".card-expiry-year"),
  year = new Date().getFullYear();

  for (var i = 0; i < 20; i++) {
      select.append($("<option value='"+(i + year)+"' "+(i === 0 ? "selected" : "")+">"+(i + year)+"</option>"))
  }
</script> 
Rollox
источник