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



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



например:




  • Basecamp: +15 лет (2025)

  • Амазонка: +20 лет (2030)

  • Paypal: +19 лет (2029)


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

599   10  

10 ответов:

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

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

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

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

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

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

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

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

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

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>

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

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

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

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

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

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

прочитав верхний срок действия 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>
<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> 

Comments

    Ничего не найдено.