Année maximum à la date d'expiration de la carte de crédit

149

Divers services en ligne ont des valeurs différentes pour l'année d'expiration maximale, en ce qui concerne les cartes de crédit.

Par exemple:

  • Basecamp: +15 ans (2025)
  • Amazon: +20 ans (2030)
  • Paypal: +19 ans (2029)

Quel est le maximum raisonnable ici? Existe-t-il des directives officielles?

Art
la source
1
L'incohérence entre les principaux magasins en ligne indique assez fortement l'absence de directive officielle.
Matt Ball
10
J'adore les sites qui demandent l'année d'expiration avec une simple saisie de texte…
Quentin
1
@Quentin c'est mieux qu'une validation erronée qui empêche la soumission, à moins que l'utilisateur ne sache comment utiliser le développement du navigateur Web. outils.
Alastair
4
@Alastair - Mon commentaire n'était pas intentionnel.
Quentin
1
@ Quention Assez juste. Les points de suspension m'ont jeté. :-P Pour un utilisateur, c'est clairement la mise en œuvre la moins ennuyeuse, mais du point de vue du développement / des entreprises, il y aurait tellement d'entrées erronées (et cela pourrait entraîner une perte de ventes).
Alastair

Réponses:

65

Il n'y a pas de directive officielle car les émetteurs de cartes de crédit peuvent choisir chacun quand les cartes qu'ils émettent expireront. En fait, ils émettent des cartes depuis de plus en plus longtemps. Si vous essayez de déterminer jusqu'où vous devriez tenir compte des dates d'expiration dans le futur, faites preuve de prudence et donnez à vos clients le choix entre plusieurs années. De cette façon, vous pérennisez votre application.

Pour info, de nombreux émetteurs de cartes de crédit n'utilisent pas la date d'expiration pour décider d'approuver ou non un achat par carte de crédit. Donc, si vous craignez qu'une date incorrecte ne soit fournie, le processeur aura finalement le dernier mot sur l'approbation ou non de la transaction afin que je ne m'inquiète pas à ce sujet.

Juillet 2017 : Je viens d'avoir un utilisateur final avec une carte expirée dans près de 50 ans.

John Conde
la source
2
Ils peuvent approuver sans un code correct, mais ils peuvent également vous facturer des taux plus élevés sur vos transactions qui n'ont pas de bons codes.
BVernon
Cela n'est vrai que pour la vérification AVS et CVV.
John Conde
Il est vrai que la plupart des émetteurs approuveraient la transaction de toute façon, TOUTEFOIS, ne pas donner à l'utilisateur l'option pour l'année sur sa carte pourrait le décourager de poursuivre la transaction. J'ajouterais simplement 50 ans et je m'attendrais à ce qu'aucun émetteur n'ait l'intention que vous gardiez un morceau de plastique aussi longtemps, même si c'est une longue et un peu ennuyeuse liste déroulante.
Mauro
16

J'ajouterais dynamiquement + 15-20 ans à l'année de la date actuelle OU fournirais une entrée de zone de texte pour l'année (ce que je trouve personnellement plus rapide pour taper les deux chiffres que pour faire défiler une liste d'années).

Bryan Denny
la source
7
sauf si vous utilisez un téléphone portable, peut-être. vous préférerez peut-être parcourir les années. quelque chose à considérer.
jedmao
10
Bon point @sfjedi, et n'oublions pas que dans la plupart des navigateurs, vous pouvez toujours saisir le numéro et il sera automatiquement sélectionné.
Kevin Wiskia
1
Bon point sur la saisie de texte par rapport à la sélection. J'ai toujours préféré la saisie de texte, mais dernièrement, avec certains de mes tests d'interface utilisateur sur Android et iOS, j'ai trouvé que les options de sélection semblaient légèrement plus faciles. Cependant, l'utilisation de type = number de HTML5 fait rapidement remonter le clavier numérique sur les appareils mobiles, ce qui facilite également les choses. Il pense que cela revient à des erreurs de validation; probablement moins d'erreurs avec des options de sélection prédéfinies.
Clint Pachl
Je ne sais pas si cela fonctionnerait bien sur un appareil mobile, mais qu'en est-il d'une liste déroulante / zone de texte? Vous pouvez entrer une valeur ou en choisir une comme d'habitude.
The Muffin Man
4

En tant que limite supérieure théorique, je propose que vous n'ayez pas besoin de considérer plus que la durée de vie prévue du titulaire de la carte. Wikipédia le fait dans ses normes éditoriales pour les biographies de personnes vivantes :

Toute personne née il y a moins de 115 ans est couverte par cette police à moins qu'une source fiable n'ait confirmé le décès de la personne. Les personnes de plus de 115 ans sont présumées mortes à moins qu'elles ne figurent sur les personnes les plus âgées.

Donc, dans votre code, recherchez l'année en cours, ajoutez 115 et utilisez-la comme limite supérieure théorique de la date d'expiration de la carte de crédit. Vous n'aurez plus jamais à toucher à ce code.

MetaEd
la source
2
Je dirais que c'est très théorique. Quelqu'un avec une carte aussi ancienne l'aurait été entre son premier anniversaire et le jour de sa naissance. Et puis ils devraient vivre jusqu'à 115 ans!
jimp
40
Mec, c'est un truc fort que vous fumez!
Art
7
SWIM a pensé que cela semblait être une bonne idée (à l'époque) d'analyser la liste des personnes les plus âgées de Wikipédia pour limiter le champ de saisie de l'âge maxau cas où la personne la plus âgée utiliserait le formulaire une fois qu'elle aurait eu 116 ans ...: [
Alastair
Qu'en est-il d'une carte d'entreprise qui n'est pas nécessairement liée à un individu? Dans ce cas, il n'y a pas de limite «théorique».
aaronbauman
3
Mais @aaronbauman, selon la Cour suprême des États-Unis, une société est une personne. La carte ne doit donc être valable que 115 ans! :-)
Stonetip
1

Voici un extrait de code Javascript que vous pouvez utiliser pour afficher une liste personnalisable des années à venir pour la validation 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
la source
0

Voici un échantillon des meilleurs détaillants en ligne américains:

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
la source
-1

Bon appel, @Alistair.

Voici la génération du mois et de l'année dans ASP.NET MVC. Ajoutez ceci à votre modèle de vue:

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

Et ceci à votre avis:

<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
la source
-1

Alors que le deuxième exemple s'exécute deux fois plus vite que le premier, vous obtenez toujours la date et en extrayez l'année 20 fois au lieu de 40 fois. Un meilleur déroulement de la boucle est:

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

Ce sera environ 20 fois plus rapide que l'exemple deux fois plus rapide et résout également un bogue mineur dans le code d'origine en ce que l'année pourrait changer d'une récupération de la date à la suivante, entraînant des résultats inattendus, bien que dans ce cas inoffensifs.

user3347790
la source
-2
<?php 
$y = gmdate("Y");
$x = 20;
$max = ($y + $x);
while ($y <= $max) {
echo "<option value='$y'>$y</option>";
$y = $y + 1;
}
?>
Louis Ferreira
la source
1
Juste une variation de ce qui précède, mieux vaut ajouter les années pour sélectionner et faire des listes déroulantes pour les sélections de mois et d'année. Les utilisateurs ont tendance à saisir les variations de mois et d'année différemment s'ils ne sont présentés qu'avec un seul champ de texte.
Louis Ferreira
-2

Si vous voulez une solution qui ne donne pas des années à trois chiffres 2100+, vous devez moduler la date, vous devez donc remplir avec un zéro non significatif pendant xx00-xx09 ans pour ne pas obtenir d'années à un chiffre.

Ce sera très important à 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
la source
-3

Après avoir lu la validité supérieure de l'OP de 20 ans pour Amazon, j'ai écrit cette solution 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>

Cela a considérablement réduit le nombre de ces demandes de retrait last yeardu nouvel an d'un formulaire.

Une version allégée de la boucle s'exécute ~ deux fois plus vite:

<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
la source
4
Vous rendez-vous compte qu'appeler date('Y')et date('y')20 fois chacun est plutôt lent?
Alexis Wilke
Relativement non, @Alexis mais j'ai ajouté une version qui s'exécute deux fois plus vite pour vous. : 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
la source