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

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

Например:

  • Basecamp: +15 лет (2025)
  • Amazon: +20 лет (2030)
  • Paypal: +19 лет (2029)

Какой здесь разумный максимум? Существуют ли какие-либо официальные инструкции?

Ответ 1

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

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

Июль 2017. У меня был только конечный пользователь с картой, срок действия которой истек почти через 50 лет.

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

Хороший звонок, @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>

Ответ 5

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

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

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

Ответ 6

<?php 
$y = gmdate("Y");
$x = 20;
$max = ($y + $x);
while ($y <= $max) {
echo "<option value='$y'>$y</option>";
$y = $y + 1;
}
?>

Ответ 7

Если вам нужно решение, которое не дает трехзначных лет 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";
    }
?>

Ответ 8

Вот фрагмент кода 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>

Ответ 9

После прочтения верхней степени действия OP для 20 лет для Amazon, я написал это простое решение в 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>

Ответ 10

<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>