磁気カード スワイパーから入力されたクレジット カード文字列を解析する方法を知っている人はいますか?
JavaScript パーサーを試しましたが、うまくいきませんでした。入力はこんな感じ。
%BNNNNNNNNNNNNNNNN^DOE/JOHN
^1210201901000101000100061000000?;NNNNNNNNNNNNNNNN=12102019010106111001?
Nはクレジットカード番号です。
磁気カード スワイパーから入力されたクレジット カード文字列を解析する方法を知っている人はいますか?
JavaScript パーサーを試しましたが、うまくいきませんでした。入力はこんな感じ。
%BNNNNNNNNNNNNNNNN^DOE/JOHN
^1210201901000101000100061000000?;NNNNNNNNNNNNNNNN=12102019010106111001?
Nはクレジットカード番号です。
ウィキペディアの磁気ストライプ カードのエントリを参照してください。
トラック 1、フォーマット B:
- センチネルの開始 — 1 文字 (通常は「%」)
- Format code="B" — 1 文字 (アルファベットのみ)
- プライマリ アカウント番号 (PAN) — 最大 19 文字。必ずというわけではありませんが、通常は、カードの表面に印刷されているクレジット カード番号と一致します。
- フィールド区切り文字 — 1 文字 (通常は「^」)
- 名前 — 2 ~ 26 文字
- フィールド区切り文字 — 1 文字 (通常は「^」)
- 有効期限 — YYMM 形式の 4 文字。
- サービスコード — 3 文字
- 任意データ — ピン検証キー インジケーター (PVKI、1 文字)、PIN 検証値 (PVV、4 文字)、カード検証値またはカード検証コード (CVV または CVK、3 文字) を含む場合があります。
- センチネルの終了 — 1 文字 (通常は「?」)
- Longitudinal Redundancy Check (LRC) — 1 文字 (ほとんどのリーダー デバイスは、カードがプレゼンテーション レイヤーにスワイプされたときにこの値を返さず、リーダーへの内部的な入力を検証するためにのみ使用します。)
データが偽物であることを願っています。
よくわかりませんが、クレジット カード番号 (または可能性のある数) は LRC を使用して計算できると思います。
ASP.Net/c# でこれを正確に行う方法を示すビデオを作成しました。
http://www.markhagan.me/Samples/CreditCardSwipeMagneticStripProcessing
おそらく気になるコードのセクションは次のとおりです。
protected void CardReader_OTC(object sender, EventArgs e)
{
bool CaretPresent = false;
bool EqualPresent = false;
CaretPresent = CardReader.Text.Contains("^");
EqualPresent = CardReader.Text.Contains("=");
if (CaretPresent)
{
string[] CardData = CardReader.Text.Split('^');
//B1234123412341234^CardUser/John^030510100000019301000000877000000?
PersonName.Text = FormatName(CardData[1]);
CardNumber.Text = FormatCardNumber(CardData[0]);
CardExpiration.Text = CardData[2].Substring(2, 2) + "/" + CardData[2].Substring(0, 2);
}
else if (EqualPresent)
{
string[] CardData = CardReader.Text.Split('=');
//1234123412341234=0305101193010877?
CardNumber.Text = FormatCardNumber(CardData[0]);
CardExpiration.Text = CardData[1].Substring(2, 2) + "/" + CardData[1].Substring(0, 2);
}
}
完全なコードは、上でリンクした Web サイトにあります。
私が覚えていることから:
これは 2 トラックの磁気ストリップ データです。最初のトラックは で始まり で%
終わり?
、2 番目のトラックは で始まり で;
終わり?
ます。これらは開始/終了マーカーです。
最初のトラックは英数字、2 番目のトラックは数字、3 番目のトラックも数字です (記憶が正しければ)。
開始/終了マーカー間のデータは、磁気ストリップの記録密度に応じて可変にすることができます。密度が高いほど、1 つのトラックに多く記録できます。
正規表現を使用してデータを取得することは、必要な情報を選択するための信頼できる方法ではない場合があります。
また、すべてのクレジット カードに正確に 2 つのトラックがあるわけではなく、3 つのトラックを使用するカードもあります。
これを試してください: https://github.com/pdamer/CardReader/blob/master/CardReader.js またはこれ: http://blog.cnizz.com/2008/10/16/javascript-snippet-for-handling-credit -カードリーダー/
私はあなたが必要なものだと思います
通常、カードを提示しないトランザクション (つまり、MOTO トランザクション) では、cc#、有効期限、および場合によっては CVV (別名 CVC2 など) が必要になります。カードスワイプで最初の2枚を獲得できるのはトラックデータのとおり。CVVはカードに印刷されています。
カードの名前はあまり関係ありません。アクワイアラとカード所有者がアドレス検証を使用していない限り、^^ の間に空白が含まれている可能性がありますが、これは削除できます。
必要な部分は track2 NNNNNNNNNNNNNNNN=1210 です。ここで、NNNNN はカード番号 PAN、1210 は有効期限です。
track1 が空であっても (処理に使用されない場合もあります)、 ;? が返されるので、2 番目の ; のインデックスを使用できます。を文字列の先頭として、= を cc# 文字列の末尾として使用します。= の後の 4 文字を有効期限として使用します。
カード所有者に取引の記録に何か署名してもらうことをお勧めします。そうしないと、カードに異議を唱えてチャージバックを行うことができます.
また、すべてのクレジット カードに正確に 2 つのトラックがあるわけではなく、3 つのトラックを使用するカードもあります。
track2 のみが処理に使用され、フォーマットは標準化されています。
通常、デビット カードは処理できません (Visa デビット カードなどを持っている場合を除きます)。
PS ccデータをプレーンテキストで保存しないでください。すべてをメモリまたは強力な暗号化に保管してください。