Visa と Mastercard をはじめとする国際ブランドは、それぞれ決まった接頭辞と桁数を持っています。テストカード番号を 1 種類だけ用意して済ませると、ブランドごとの分岐を確かめられません。この記事では、公開されている番号帯の読み方と、Visa・Mastercard などの違いを踏まえてテストデータをそろえる手順を説明します。
ブランドごとに番号の規則が違う
カード番号の先頭部分は、どのブランドのどの範囲かを示します。この範囲は公開されており、桁数もブランドごとに定められています。したがって、番号を見ればブランドを推定できます。逆に言えば、ブランドを判別する処理を正しく試すには、各ブランドの接頭辞を持つ番号が必要になります。
もうひとつ見落とされやすいのが、セキュリティコードの桁数です。多くのブランドは 3 桁ですが、American Express は 4 桁で、しかもカード表面に印字されます。入力欄を 3 桁で作っていると、このブランドのテストだけが途中で止まります。番号だけでなく、コードの桁数までブランドごとに変わるという点を前提にしてください。
公開されている主な番号帯
以下は公開された番号計画に基づく大まかな範囲です。個別の番号が特定の会社に割り当てられていると断定するものではありません。
| ブランド | 接頭辞の範囲 | 桁数の例 | コード |
|---|---|---|---|
| Visa | 4 | 13、16 | 3 桁 |
| Mastercard | 51 から 55、2221 から 2720 | 16 | 3 桁 |
| American Express | 34、37 | 15 | 4 桁 |
| Discover | 6011、65、644 から 649、622126 から 622925 | 16 | 3 桁 |
| JCB | 3528 から 3589 | 16 | 3 桁 |
| Diners Club | 300 から 305、36、38 から 39 | 14 | 3 桁 |
| UnionPay | 62 | 16 から 19 | 3 桁 |
| Maestro | 50、56 から 69 | 12 から 19 | 3 桁 |
この表の使い道は、テストしたい分岐に対してどの範囲から番号を選ぶかを決めることです。表そのものを暗記する必要はありません。
1 つの番号ですべてを兼ねられますか?
兼ねられません。ブランドの判別、桁数の分岐、コードの桁数の分岐は、それぞれ別の入力でしか確認できません。Visa の番号を 1 つ用意しても、Mastercard の接頭辞判定も American Express の 4 桁コードも試せないままです。
さらに、同じブランドの中でも桁数が複数ある場合があります。Visa には 16 桁だけでなく 13 桁の番号も存在し、UnionPay や Maestro はより広い範囲の桁数を取ります。桁数の検証を 1 つの値に固定している実装は、この時点で綻びが表れます。テストデータをそろえる作業は、ブランドと桁数の組み合わせを埋めていく作業だと考えてください。
テストデータをそろえる手順
順序を決めておくと、抜けが減ります。まず、アプリケーションが対応を表明しているブランドを書き出します。次に、各ブランドについて代表的と思われる桁数を 1 つ選びます。続いて、その組み合わせごとに、検証を通る番号を用意します。最後に、ブランドを判別できない番号や、対応外の接頭辞の番号を異常系として加えます。
用意した番号は、どの分岐を確認するためのものかを名前で示しておきます。たとえば「16 桁の Visa」「15 桁の American Express」「未対応の接頭辞」といった具合です。名前があれば、テストが失敗したときに、実装のどこが壊れたのかをすぐに絞り込めます。
番号帯を自作するときの注意?
件数を多く必要とする場合は、接頭辞と桁数を指定して自分で番号を作る方法があります。用意する番号は、桁数と接頭辞が正しく、末尾のチェックディジットが成立していれば、決済フォームの検証を通ります。ただし、これらは構造的に妥当なだけで、いずれも実際には発行されていません。決済が成功することを期待するテストに使ってはいけません。
自作する場合も、公開されている範囲から外れた接頭辞を使わないようにしてください。範囲外の番号を作ると、ブランド判定のテストが意図と違う経路に入ります。桁数も同様で、規格上の上限を超える番号を作っても、検証側が正しく拒否するかの確認にしか使えません。手元で複数のブランドの番号をまとめて用意したいときは、テスト用クレジットカード番号生成 でブランドと桁数を指定して生成できます。
開発者向け: ブランド別のテストマトリクス
テストの一覧は、ブランドを行、確認したい性質を列にした表の形にすると管理しやすくなります。行には Visa、Mastercard、American Express、Discover、JCB、Diners Club、UnionPay、Maestro を並べます。列には、ブランド判定、桁数の下限、桁数の上限、コードの桁数、チェックディジット不一致への反応、といった性質を置きます。
この表を埋めると、対応していると称しているのに実際には未確認の組み合わせが見えてきます。とくに桁数の上限は忘れられがちです。UnionPay や Maestro のように 19 桁まで取り得るブランドでは、19 桁の入力が正しく扱えるかを確かめる必要があります。また、American Express の 4 桁コードは、入力欄の最大長が 3 のままだと必ず失敗します。
実装側では、ブランド判定の結果を単なる表示用の文字列として扱わず、桁数とコード桁数の規則を引くための鍵として使うと、判定と検証の食い違いを減らせます。規則を 1 か所にまとめておけば、新しいブランドを足すときの修正範囲も限定されます。検証の順序そのものは カード番号の検証 に、番号の組み立ては カード番号の構成 にまとめています。
次のステップ
まず、対応を表明しているブランドの一覧と、いま手元にあるテスト番号の一覧を突き合わせてください。片方にしかない行があれば、それが確認漏れです。次に、各ブランドのコード桁数が入力欄で扱えるかを、実際に 4 桁のコードを入力して確かめます。この二つを済ませれば、ブランド別の確認はほぼ完了です。