Año máximo en la fecha de vencimiento de la tarjeta de crédito

149

Varios servicios en línea tienen valores diferentes para el año máximo de vencimiento, cuando se trata de tarjetas de crédito.

Por ejemplo:

  • Campamento base: +15 años (2025)
  • Amazon: +20 años (2030)
  • Paypal: +19 años (2029)

¿Cuál es el máximo razonable aquí? ¿Hay alguna guía oficial?

Arte
fuente
1
La inconsistencia en las principales tiendas en línea apunta bastante fuertemente hacia ninguna directriz oficial.
Matt Ball
10
Me encantan los sitios que solicitan el año de vencimiento con una simple entrada de texto ...
Quentin
1
@Quentin es mejor que una validación defectuosa que impide el envío, a menos que el usuario sepa cómo usar el desarrollador del navegador web. herramientas.
Alastair el
44
@Alastair: mi comentario no fue intencionalmente sarcástico.
Quentin
1
@Quention lo suficientemente justo. Los puntos suspensivos me arrojaron. :-P Para un usuario, esa es claramente la implementación menos molesta, pero desde una perspectiva de desarrollo / negocio, simplemente habría mucha información errónea (y eso podría causar la pérdida de ventas).
Alastair el

Respuestas:

65

No existe una directriz oficial ya que los emisores de tarjetas de crédito pueden elegir cada uno cuando las tarjetas que emiten expirarán. De hecho, han estado emitiendo tarjetas por períodos cada vez más largos. Si está tratando de determinar qué tan lejos en el futuro debe tener en cuenta las fechas de vencimiento, erre en el lado seguro y brinde a sus clientes muchos años para elegir. De esa manera, prepara su solicitud en el futuro.

Para su información, muchos emisores de tarjetas de crédito no usan la fecha de vencimiento para determinar si aprueban o no la compra de una tarjeta de crédito. Entonces, si le preocupa que se proporcione una fecha incorrecta, el procesador finalmente tendrá la última palabra sobre si la transacción se aprueba o no, por lo que no me preocuparía.

Julio de 2017 : Acabo de tener un usuario final con una tarjeta que caducó en casi 50 años a partir de ahora.

John Conde
fuente
2
Pueden aprobar sin un código correcto, pero también pueden cobrarle tarifas más altas en sus transacciones que no tienen los códigos correctos.
BVernon
Eso solo es cierto para la verificación AVS y CVV.
John Conde
Es cierto que la mayoría de los emisores aprobarían la transacción de todos modos, SIN EMBARGO, no proporcionarle al usuario la opción para el año en su tarjeta podría desanimarlo a continuar con la transacción. Solo agregaría 50 años y espero que ningún emisor tenga la intención de mantener un trozo de plástico durante tanto tiempo, incluso si es un menú desplegable largo y un poco molesto.
Mauro
16

Agregaría dinámicamente + 15-20 años al año de la fecha actual O proporcionaría una entrada de cuadro de texto para el año (que personalmente me parece más rápido escribir los dos dígitos que desplazarme por una lista de años).

Bryan Denny
fuente
77
a menos que estés usando un teléfono móvil, tal vez. es posible que prefieras pasar los años. Algo a tener en cuenta.
jedmao
10
Buen punto @sfjedi, y no olvidemos que en la mayoría de los navegadores todavía puede ingresar el número y se seleccionará automáticamente.
Kevin Wiskia
1
Buen punto sobre el ingreso de texto vs select. Siempre he preferido el ingreso de texto, pero últimamente con algunas de mis pruebas de IU en Android e iOS, descubrí que las opciones seleccionadas parecen un poco más fáciles. Sin embargo, el uso del tipo = número de HTML5 abre rápidamente el teclado numérico en los dispositivos móviles, por lo que eso también facilita las cosas. Piensa que se trata de errores de validación; probablemente menos errores con opciones de selección predefinidas.
Clint Pachl
No estoy seguro de si esto funcionaría bien en un dispositivo móvil, pero ¿qué pasa con un menú desplegable / cuadro de texto? Puede ingresar un valor o elegir uno como de costumbre.
The Muffin Man
4

Como límite superior teórico, propongo que no necesite considerar más de la vida útil esperada del titular de la tarjeta. Wikipedia hace esto en sus estándares editoriales para biografías de personas vivas :

Cualquier individuo nacido hace menos de 115 años está cubierto por esta política a menos que una fuente confiable haya confirmado la muerte del individuo. Se presume que las personas mayores de 115 años están muertas a menos que estén en la lista de las personas mayores.

Entonces, en su código, busque el año actual, agregue 115 y úselo como su límite superior teórico para la fecha de vencimiento de la tarjeta de crédito. Nunca más tendrás que tocar ese código.

MetaEd
fuente
2
Yo diría que es muy teórico. Alguien con una tarjeta tan antigua la habría emitido en algún momento entre su primer cumpleaños y el día en que nacieron. ¡Y luego tendrían que vivir hasta 115 años!
jimp
40
¡Chico, eso es algo fuerte que ustedes están fumando!
Arte
77
SWIM pensó que parecía una buena idea (en ese momento) analizar la lista de personas más viejas de Wikipedia para restringir el campo de entrada de edad a eso maxen caso de que la persona más vieja usara el formulario una vez que cumplieran 116 ...: [
Alastair
¿Qué pasa con una tarjeta corporativa que no está necesariamente vinculada a un individuo? En ese caso, no hay límite "teórico".
aaronbauman
3
Pero @aaronbauman, según la Corte Suprema de los Estados Unidos, una corporación es una persona. ¡Por lo tanto, la tarjeta solo debe ser válida por 115 años! :-)
Stonetip
1

Aquí hay un fragmento de código Javascript que puede usar para mostrar una lista personalizable de los próximos años para la validación 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
fuente
0

Aquí hay una muestra de los principales minoristas en línea de EE. UU .:

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

Buena llamada, @Alistair.

Aquí está la generación del mes y año en ASP.NET MVC. Agregue esto a su modelo de vista:

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));
    }
}

Y esto a su juicio:

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

Si bien el segundo ejemplo se ejecuta dos veces más rápido que el primero, todavía está obteniendo la fecha y extrayendo el año 20 veces en lugar de 40 veces. Un mejor desenrollamiento del bucle es:

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

Eso será aproximadamente 20 veces más rápido que el ejemplo dos veces más rápido y también soluciona un error menor en el código original en el sentido de que el año podría cambiar de una recuperación de la fecha a la siguiente y generar resultados inesperados, aunque en este caso inofensivos.

usuario3347790
fuente
-2
<?php 
$y = gmdate("Y");
$x = 20;
$max = ($y + $x);
while ($y <= $max) {
echo "<option value='$y'>$y</option>";
$y = $y + 1;
}
?>
Louis Ferreira
fuente
1
Solo una variación de lo mencionado anteriormente, mejor agregar los años para seleccionar y hacer listas desplegables para las selecciones de mes y año. Los usuarios tienden a ingresar las variaciones de mes y año de manera diferente si solo se les presenta un solo campo de texto.
Louis Ferreira
-2

Si desea una solución que no produzca años de tres dígitos 2100+, debe modular la fecha, por lo tanto, debe completar con cero a la izquierda para los años xx00-xx09 para no obtener años de un solo dígito.

Esto será muy 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
fuente
-3

Después de leer la validez superior del OP de 20 años para Amazon, escribí esta solución simple en 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>

Esto ha reducido en gran medida el número de solicitudes de año nuevo para eliminar last yearde un formulario.

Una versión más delgada del bucle se ejecuta ~ dos veces más rápido:

<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
fuente
44
¿Te das cuenta de que llamar date('Y')y date('y')20 veces cada uno es bastante lento?
Alexis Wilke
Relativamente no, @Alexis, pero he agregado una versión que se ejecuta el doble de rápido para usted. : 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
fuente