JavaScript:クレジットカード番号からカードブランドを取得する関数

JavaScript:クレジットカード番号からカードブランドを取得する関数

かつて自分が使うために作ったものですが、誰かの役にたてばと公開しておきます。

関数(TypeScript / JavaScript) #

TypeScript で記載しています。型定義があるのは引数部分のみですので、JavaScript として使いたい場合は引数部分の型を削除してください。

本体は getCardBrand 関数です。それが内部的に rangeAsString および range を使用しています。

/** 指定された開始点から終了点までの数値の配列を生成する。開始点と終了点はいずれも配列に含まれる。 */
const range = (start: number, end: number) => {
  const amount = end - start + 1;
  return Array(amount)
    .fill(null)
    .map((_, i) => i + start);
};

/** 指定された開始点から終了点までの数値文字列の配列を生成する。開始点と終了点はいずれも配列に含まれる。 */
const rangeAsString = (start: number, end: number) => {
  const numbers = range(start, end);
  return numbers.map(String);
};

/** クレジットカード番号からカードブランドを取得する。 */
const getCardBrand = (cardNumber: string) => {
  const first1 = cardNumber.slice(0, 1);
  const first2 = cardNumber.slice(0, 2);
  const first3 = cardNumber.slice(0, 3);
  const first4 = cardNumber.slice(0, 4);

  const visaIds = ["4"];
  const amexIds = ["34", "37"];
  const dinersIds = ["36"];
  const unionpayIds = ["62"];
  const jcbIds = rangeAsString(3528, 3589);
  const mastercardIds = [
    ...rangeAsString(51, 55),
    ...rangeAsString(2221, 2720),
  ];
  const discoverIds = ["65", ...rangeAsString(644, 649), "6011"];

  if (visaIds.includes(first1)) {
    return "visa";
  }
  if (amexIds.includes(first2)) {
    return "amex";
  }
  if (dinersIds.includes(first2)) {
    return "diners";
  }
  if (unionpayIds.includes(first2)) {
    return "unionpay";
  }
  if (jcbIds.includes(first4)) {
    return "jcb";
  }
  if (mastercardIds.includes(first2) || mastercardIds.includes(first4)) {
    return "mastercard";
  }
  if (
    discoverIds.includes(first2) ||
    discoverIds.includes(first3) ||
    discoverIds.includes(first4)
  ) {
    return "discover";
  }
  return "unknown";
};

説明 #

以下のメジャーなカードブランドのみを対象にしています。

  • American Express: amex
  • Diners Club: diners
  • Discover: discover
  • JCB: jcb
  • MasterCard: mastercard
  • UnionPay: unionpay
  • Visa: visa

上記に該当しなければ unknown を返します。

クレジットカード番号とブランドの対応は以下を参考にしました。

https://en.wikipedia.org/wiki/Payment_card_number

実行結果 #

以下を実施したところ期待通りの結果となりました。

getCardBrand("4242424242424242"); // 'visa'
getCardBrand("4000056655665556"); // 'visa'
getCardBrand("5555555555554444"); // 'mastercard'
getCardBrand("2223003122003222"); // 'mastercard'
getCardBrand("5200828282828210"); // 'mastercard'
getCardBrand("5105105105105100"); // 'mastercard'
getCardBrand("378282246310005"); // 'amex'
getCardBrand("371449635398431"); // 'amex'
getCardBrand("6011111111111117"); // 'discover'
getCardBrand("6011000990139424"); // 'discover'
getCardBrand("36227206271667"); // 'diners'
getCardBrand("3566002020360505"); // 'jcb'
getCardBrand("6200000000000005"); // 'unionpay'
getCardBrand("9999999999999999"); // 'unknown'