Ano máximo na data de validade do cartão de crédito

149

Vários serviços online têm valores diferentes para o ano máximo de validade, quando se trata de cartões de crédito.

Por exemplo:

  • Baseecamp: +15 anos (2025)
  • Amazônia: +20 anos (2030)
  • Paypal: +19 anos (2029)

Qual é o máximo razoável aqui? Existem diretrizes oficiais?

Arte
fonte
1
A inconsistência nas principais lojas online aponta fortemente para nenhuma diretriz oficial.
Matt Bola
10
Adoro sites que pedem o ano de validade com uma entrada de texto simples ...
Quentin
1
@Quentin é melhor que a validação defeituosa que impede o envio, a menos que o usuário saiba como usar o desenvolvedor do navegador. Ferramentas.
precisa
4
@Alastair - Meu comentário não foi feito de forma sarcástica.
Quentin
1
@ Fair Fair o suficiente. As reticências me jogaram. :-P Para um usuário, essa é claramente a implementação menos irritante, mas do ponto de vista do desenvolvimento / negócios, haveria muitas informações erradas (e isso poderia causar perda de vendas).
precisa

Respostas:

65

Não há diretrizes oficiais, pois os emissores de cartões de crédito podem escolher cada um deles quando os cartões emitidos expirarem. De fato, eles emitem cartões por períodos cada vez maiores. Se você estiver tentando determinar até que ponto do futuro você deve acomodar as datas de validade, erre no lado seguro e dê a seus clientes muitos anos para escolher. Dessa forma, você prova seu aplicativo no futuro.

Para sua informação, muitos emissores de cartões de crédito não usam a data de validade para determinar se devem ou não aprovar uma compra com cartão de crédito. Portanto, se você estiver preocupado com o fornecimento de uma data incorreta, o processador terá a última palavra sobre se a transação é aprovada ou não, para que eu não me preocupe.

Julho de 2017 : tinha apenas um usuário final com um cartão que expiraria daqui a 50 anos.

John Conde
fonte
2
Eles podem aprovar sem um código correto, mas também podem cobrar taxas mais altas em suas transações que não possuem códigos corretos.
BVernon 22/10/14
Isso é verdade apenas para verificação AVS e CVV.
John Conde
É verdade que a maioria dos emissores aprovaria a transação de qualquer maneira, contudo, não fornecer ao usuário a opção para o ano em seu cartão pode desencorajá-lo a continuar com a transação. Eu acrescentaria apenas 50 anos e espero que nenhum emissor pretenda que você mantenha um pedaço de plástico por tanto tempo, mesmo que isso seja um longo e um pouco irritante.
Mauro
16

Eu adicionaria dinamicamente + 15 a 20 anos ao ano da data atual OU forneceria uma entrada de caixa de texto para o ano (que pessoalmente acho mais rápido digitar os dois dígitos do que percorrer uma lista de anos).

Bryan Denny
fonte
7
a menos que você esteja usando um telefone celular, talvez. você pode preferir passar ao longo dos anos. algo a considerar.
jedmao
10
Bom ponto @sfjedi, e não vamos esquecer que, na maioria dos navegadores, você ainda pode digitar o número e ele será selecionado automaticamente.
22411 Kevin Wiskia
1
Bom ponto sobre entrada de texto vs seleção. Eu sempre preferi a entrada de texto, mas ultimamente, com alguns dos meus testes de interface do usuário no Android e iOS, descobri que as opções selecionadas parecem um pouco mais fáceis. No entanto, o uso de type = number do HTML5 puxa rapidamente o teclado numérico em dispositivos móveis, o que facilita as coisas também. Ele se resume a erros de validação; provavelmente menos erros com opções de seleção predefinidas.
Clint Pachl
Não tenho certeza se isso funcionaria bem em um dispositivo móvel, mas e uma caixa de texto suspensa? Você pode inserir um valor ou escolher um como o normal.
The Muffin Man
4

Como limite superior teórico, proponho que você não precise considerar mais do que a vida útil esperada do titular do cartão. A Wikipedia faz isso em seus padrões editoriais para biografias de pessoas vivas :

Qualquer pessoa nascida há menos de 115 anos é abrangida por esta política, a menos que uma fonte confiável confirme a morte da pessoa. Presume-se que pessoas com mais de 115 anos estejam mortas, a menos que listadas nas pessoas mais velhas.

Portanto, em seu código, procure o ano atual, adicione 115 e use-o como seu limite superior teórico para a data de validade do cartão de crédito. Você nunca precisará tocar nesse código novamente.

MetaEd
fonte
2
Eu diria que é muito teórico. Alguém com um cartão tão antigo teria sido emitido em algum momento entre o primeiro aniversário e o dia em que nasceram. E então eles teriam que viver até 115 anos!
jimp
40
Garoto, isso é algo forte que vocês estão fumando!
Art
7
A SWIM achou que era uma boa ideia (na época) analisar a lista de pessoas mais velhas da Wikipedia para restringir o campo de entrada de idade àquele max, caso a pessoa mais velha usasse o formulário quando completasse 116 anos ...: [
Alastair
Que tal um cartão corporativo que não esteja necessariamente vinculado a um indivíduo? Nesse caso, não há limite "teórico".
aaronbauman
3
Mas @aaronbauman, de acordo com a Suprema Corte dos EUA, uma corporação é uma pessoa. Portanto, o cartão deve ser válido apenas por 115 anos! :-)
Stonetip
1

Aqui está um trecho de código Javascript que você pode usar para exibir uma lista personalizável dos próximos anos para validação de 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
fonte
0

Aqui está uma amostra dos principais varejistas on-line dos EUA:

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
Tom Howard
fonte
-1

Boa chamada, @Alistair.

Aqui está a geração do mês e do ano no ASP.NET MVC. Adicione isso ao seu 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));
    }
}

E isso na sua opinião:

<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>
Rap
fonte
-1

Enquanto o segundo exemplo é executado duas vezes mais rápido que o primeiro, você ainda está obtendo a data e extraindo o ano dela 20 vezes em vez de 40 vezes. Um melhor desenrolar do loop é:

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

Isso será cerca de 20 vezes mais rápido que o exemplo duas vezes mais rápido e também aborda um bug menor no código original, pois o ano pode mudar de uma busca da data para a próxima, levando a resultados inesperados, embora neste caso inofensivos.

user3347790
fonte
-2
<?php 
$y = gmdate("Y");
$x = 20;
$max = ($y + $x);
while ($y <= $max) {
echo "<option value='$y'>$y</option>";
$y = $y + 1;
}
?>
Louis Ferreira
fonte
1
Apenas uma variação do mencionado acima, melhor adicionar os anos para selecionar e fazer listas suspensas para as seleções de mês e ano. Os usuários tendem a inserir variações de mês e ano de maneira diferente se apenas apresentarem um único campo de texto.
Louis Ferreira
-2

Se você deseja uma solução que não produza os anos de três dígitos com mais de 2100 anos, module a data; portanto, preencha com zero à esquerda por anos xx00-xx09 para não obter anos com um dígito.

Isso será muito importante a partir de 2080.

<?php
    for($i=0;$i<=20;$i++){
        $aktDate = sprintf("%02d", ((date('y')+$i)%100));
        echo "<option value=\"{$aktDate}\">{$aktDate}</option>\n";
    }
?>
Hendrik
fonte
-3

Depois de ler a validade superior do OP de 20 anos para a Amazon, escrevi esta solução simples em 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>

Isso reduziu bastante o número dessas solicitações de ano novo para remover last yearde um formulário.

Uma versão mais enxuta do loop é executada ~ duas vezes mais rapidamente:

<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>
Alastair
fonte
4
Você percebe que chamar date('Y')e date('y')20 vezes cada um é bastante lento?
Alexis Wilke # 03
Relativamente não, @Alexis, mas adicionei uma versão que é executada duas vezes mais rapidamente para você. : P
Alastair
-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
fonte