読者です 読者をやめる 読者になる 読者になる

IT業界のすみっこ暮らし

ふと気がついたときの記録

クレジットカード番号から発行者検索機能実装

クレジットカード番号について

クレジットカード番号 - ISAF 286th TFS

クレジットカード番号には法則があり、先頭6桁でカードの種類を識別、分類することができる。
先頭の6桁を銀行識別番号(Bank Identification Number、略称:BIN)ないしは発行者識別番号(Issuer Identification Number、略称:IIN)と呼び、この先頭6桁でカード発行会社(イシュア、issuer)が判るようになっている。


…らしい。

無料でクレジット番号から発行者を識別できる情報を提供してるサイト

binlist.net - Free BIN/IIN Lookup Web Service

下記のページから「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)