クレジットカード番号から発行者検索機能実装
クレジットカード番号について
http://melfina.org/wiki/?%A5%AF%A5%EC%A5%B8%A5%C3%A5%C8%A5%AB%A1%BC%A5%C9%C8%D6%B9%E6
クレジットカード番号には法則があり、先頭6桁でカードの種類を識別、分類することができる。
先頭の6桁を銀行識別番号(Bank Identification Number、略称:BIN)ないしは発行者識別番号(Issuer Identification Number、略称:IIN)と呼び、この先頭6桁でカード発行会社(イシュア、issuer)が判るようになっている。
…らしい。
無料でクレジット番号から発行者を識別できる情報を提供してるサイト
Free BIN/IIN Lookup Web Service - binlist.net
下記のページから「archived/iin-user-contributions.csv」ファイルをダウンロードする。 github.com
DB構築
CREATE TABLE `mt_credit_card_iin`( `id` int(11) NOT NULL AUTO_INCREMENT, `iin` CHAR(6) NOT NULL, `card_brand` VARCHAR(64) NOT NULL, `card_sub_brand` VARCHAR(64), `card_type` VARCHAR(64) NOT NULL, `card_category` VARCHAR(64), `country_code` VARCHAR(128) NOT NULL, `bank_name` VARCHAR(128), `bank_url` VARCHAR(200), `bank_phone` VARCHAR(128), `bank_city` VARCHAR(64), PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
エンコードなどが原因で、MySQL上のINFILEコマンド実行時に最初の1行しか読み込めない場合、一度ファイルをエクセルで開いてからCSV形式で「名前を付けて保存」をすると直る。
mysql> LOAD DATA LOCAL INFILE 'C:\\util\\binlist-data-master\\binlist-data-master\\credit_card_iin.csv' -> INTO TABLE mt_credit_card_iin -> FIELDS TERMINATED BY ',' -> LINES TERMINATED BY '\r\n' -> (iin,card_brand,card_sub_brand,card_type,card_category,country_code,bank_name,bank_url,bank_phone,bank_city);
django rest frameworkでの実装例
クレジットカードの先頭の6桁の番号から発行者の情報を返す
Python
class CreditCardIinViewSet(viewsets.ViewSet): queryset = mt_credit_card_iin.objects.all() def list(self, request): iin_val = request.query_params.get('iin') if iin_val is not None and iin_val.isdigit() is True and 6 == len(iin_val) : if 0 is not mt_credit_card_iin.objects.filter(iin=iin_val).count(): iin_infos = mt_credit_card_iin.objects.filter(iin=iin_val)[:1] elif 0 is not mt_credit_card_iin.objects.filter(iin__startswith=iin_val[:4]).count(): iin_infos = mt_credit_card_iin.objects.filter(iin__startswith=iin_val[:4])[:1] else: return Response({'message': 'No results for {0}. Make sure you enter a valid BIN/IIN number.'.format(iin_val)}, status=status.HTTP_400_BAD_REQUEST) else: return Response({'message': 'No results for {0}. Make sure you enter a valid BIN/IIN number.'.format(iin_val)}, status=status.HTTP_400_BAD_REQUEST) serializer = CreditCardIinSerializer(iin_infos, many=True) serializer.data[0]['iin'] = iin_val return Response(serializer.data)