技術記事
かんたんに実現する非接触決済
チップカードがどれほど「ストレスの種」になり得るかは、誰もが知るところでしょう。カードを挿し込み、足踏みしながら待ち、チップの読み取りに失敗してくれて磁気スワイプで済むようにと祈る… まあ、少々大げさかもしれません。しかし、おわかりいただけるはずです。標準的な「接触型EMV」は、遅く、複雑で、ミスを許さないため、顧客をいらだたせ、決済アプリ開発者を酒に走らせるほどの状況に追い込んできました。
非接触EMVなら、これらすべてが変わります。「タップ&ゴー」取引は通常500ミリ秒未満で完了し、スマートフォン(プラスチックカードを取り出すよりはるかに便利)でも行えます。そして、開発者にとっても扱いやすいのです。非接触取引は、わずか数行のコードで実行できます。しかも、必要であればすべてJavaScriptで完結します。Visual StudioやXcodeを立ち上げる必要はありません。コンパイルサイクルも、リンクライブラリも、面倒な依存関係もなし。まさに迅速な開発の極みです。
以下のJavaScriptコード4行を見てみましょう。
信じがたいかもしれませんが、この4行で、ID TECHが提供するコンパクトかつ低価格なVP3300シリーズのカードリーダー(上に示したVP3300など)を使って、非接触EMV取引を実行できます。この4行が実行されると、スマートフォン(あるいはタップカード)をリーダーにかざすだけで、リーダーがビープ音を鳴らし、NFC通信を開始し、取引データを(USB経由で)出力します。
もちろん、これらのコードが実際に機能するためには、まずUSBデバイスと通信するNodeスクリプト(およびNode JS本体)をインストールする必要があります。 前回の投稿で説明したとおり。(実行可能なスクリプトとNode本体を1つのアーカイブにまとめてダウンロードできます こちら。)また、上記のコードはFirefoxまたはChromeから、以下のアプリを使って実行するのが望ましいでしょう。 こちらから入手可能.
ViVOpay Explorerとは何か? それは、JSコンソールといくつかのプリロード済みコマンドを備えた、非常にシンプルなHTMLページにすぎません。このWebページは、HTML 50行とJavaScript 400行(前回紹介したTLVパーサールーチンを含む)で構成されています。 以前の投稿)。ChromeまたはFirefoxでViVOpay Explorerを使用すると(Internet Explorerでは試さないでください)、次のようなブラウザページが表示されます。
「Console」の下にある灰色のエリアは、ライブの REPL (この場合はjQuery Terminal)で、任意のJavaScriptコードをリアルタイムで実行できます。右上には、「http://localhost」と「9901」を表示するテキストエリアがあり、その隣に 接続 ボタンがあります。このボタンを押すと、ViVOpay Explorerが127.0.0.1のポート9901でWebsocket接続を探します。ページ下半分はログエリアで、コマンドに応じて各種ステータス情報(USB通信の内容など)がリアルタイムに表示されます。
ドロップダウンメニューの横にある小さな疑問符をクリックすると、ViVOpay Explorerの使い方を説明する小さなヘルプパネルが表示されます。要点をまとめると、行うべきことは次のとおりです。
1. 以下をダウンロード: Nodeドライバー (11MBのZipアーカイブ)をローカルのWindowsマシンに解凍します。(node.exeのコピー、スクリプト、サポートファイルが同梱されており、必要なものはすべてアーカイブに含まれています。ただし、MacやLinuxでの実行は試みないでください。これはWindows専用のNodeビルドです。)
2. 解凍したZipフォルダー内で、 start.bat を見つけて実行します。(そのまま起動したままにしておき、ウィンドウを閉じないでください。)これにより、USBと通信するNodeベースのドライバーが起動し、同時にWebsocketsサーバーも立ち上がります。
3. ID TECHのVP3300シリーズのクレジットカードリーダー(UniPay III、BTPay Miniなど)をUSBポートに接続します。Nodeドライバーがデバイスを自動検出して接続します。
4. Connectボタン(右上)をクリックします。下に「Connected to the driver on port 9901.」というメッセージが表示されるはずです。これは、ブラウザが以下経由でWebsocketsを通じてドライバーと通信していることを意味します。 http://localhost:9901.
5. ドロップダウンメニューから リーダーへの Ping コマンドを選択します。これにより、接続されたUSBデバイスに対してpingを送るスクリプトが実行されます。
ステップ5が成功すると、メイン画面のコンソール下に、次のようなログ応答が表示されるはずです。
OUT:
{
"source":"client"
"data":"5669564f74656368320018010000b3cd"
"type":"raw command"
}
IN:
{
"source":"usb"
"data":"5669564f74656368320018000000fa83″
"type":"data"
}
これらは、ping中にWebsockets経由で(USBデバイスへ)送信され、(ブラウザへ)受信されたJSONメッセージです。独自のJSONオブジェクトが非常にシンプルなスキーマに従っていることに注目してください。source、data、typeという3つのフィールドがあります。送信(ブラウザからドライバ)メッセージの場合、sourceプロパティの値は「client」とし、dataフィールドにはUSBデバイスへ送信するコマンドを表す16進文字列を含め、typeフィールドには「raw command」を含めて、dataコマンドをそのままUSBデバイスへ渡すべきであることをドライバに伝えます。
JSONオブジェクト(またはその他のメッセージ)をブラウザからドライバへ送信するのは簡単です。ブラウザのコードで次のように記述するだけです。 socket.emit( 'echo', myObject )ドライバからデータを受信するには、リスナーを設定するだけです。 socket.on( 'message', myListener )(ここで myListener は次のような匿名関数でも構いません) function( m ) { log( m ); }当然ながら、ドライバに何かを送信する前に、まずリスナーを設定すべきです。そうしないと、応答を受け取る準備ができる前にドライバが応答してしまう可能性があります。
非接触トランザクションの開始方法:戦略1
リーダーをNFCモードにして非接触カードまたはウォレットを読み取らせるには、適切なファームウェアコマンドを(16進文字列として)発行するだけです。
最初の行ではコマンドを文字列として宣言しています。こうしたコマンドの構築方法を知るには、お使いのリーダーの技術ドキュメントを参照する必要があります。(ID TECHのドキュメントは ID TECH Public Knowledge BaseのDownloadsページからダウンロードできます。)この特定のコマンドにはデフォルトのAmountとして$1.00と(現時点では)古い日付が含まれているため、明らかにこのコード(動作はします!)はプロダクション品質ではなく、概念実証レベルのものと考えるべきです。本番コードであれば、実際のAmountや実際のTransaction Dateなどを含むように作成する必要があります。
コマンドをリーダーに届けるには2段階のプロセスが必要です。まず、Websockets経由でJSONオブジェクトとしてドライバに送信し、次にドライバがそれをUSBリーダーに伝達します。ドライバが処理できるJSONオブジェクトにコマンドをパッケージ化するのは非常に簡単です。上記コードの2行目と3行目をご覧ください。4行目でデータオブジェクトをソケットに送出しています。
繰り返しになりますが、これを行う前に、必ずソケットにリスナー(またはコールバック)を接続して、リーダーからの応答を処理できるようにしてください。それは次のように単純なものでも構いません。
非接触トランザクションの開始方法:戦略2
トランザクションを開始するためのもう1つの戦略があります。先ほど開始は2段階のプロセスであると述べたことを思い出してください。
1. ブラウザからドライバへメッセージを送信する。
2. ドライバからUSBデバイスへメッセージを伝える。
「メッセージ」とは、大きくて醜いファームウェアの16進文字列です。
ここでの「ドライバ」は、Nodeのプロセス空間内で実行されているNodeスクリプト(約350行のJavaScript)にすぎません。ドライバのソースコードはdriverフォルダ内にあります。次のファイルを探してください。 usb-websocket-shim.js.
ドライバコードを簡単に変更して、トランザクションを開始する魔法のファームウェアコマンド(または文字列を作成する関数)を(既に文字列としてキャッシュした状態で)含めることができます。これにより、選択したAPIの背後に魔法のファームウェアコマンドを隠すことができ、決済アプリ(ここではViVOpay Explorerで表されています)は、トランザクションを開始するために非常にシンプルな(選択した)メッセージをドライバに送信するだけで済むようになります。
そうする意味は何でしょうか?ファームウェアコマンドをドライバ自体の中に隠す意味は何でしょうか?
これを行う理由としていくつかの良い理由が考えられます。
第一に、決済アプリからデバイス依存性を取り除き、論理的にデバイスに非常に近いデバイスドライバに移すことは理にかなっています。考えてみてください。決済アプリにファームウェアコマンドの詳細な知識を持たせたいでしょうか?アプリをハードウェアの詳細な知識から解放した方が良いのではないでしょうか?アプリはビジネスロジックだけを知っているべきではないでしょうか?
第二に、魔法のコマンドをドライバへ押し下げることで、そのコマンドに対する独自のAPIを書くことができ、決済アプリが利用できる大幅に簡素化されたAPIを導入する機会が得られます。(以下に例を示します。)
これを超えて、スコープ削減も考慮すべきです。現実的な問題として、ほとんどの決済アプリやPOSシステムは、POSや決済アプリがトランザクションサブシステムにトランザクション金額程度しか提供せず、(カードリーダーと通信する)トランザクションサブシステムが認証コードと印刷可能なレシート情報を返す、というように記述されています。機密性の高いカードデータが決済アプリに届くことは決してありません。
そこで「スコープ削減」のケースでは、ドライバ内に次のような受信Websocketsメッセージに応答するコードを置きたくなります。
そして実際、これは既に当社のNodeドライバに実装されています。(ドライバコードのリストについては、 前回の投稿 を参照してください。)つまり、決済アプリ(またはViVOpay Explorer)から非接触トランザクションを開始するために必要なのは、次のことだけです。
ViVOpay Explorerでは、必要なすべてのコード(トランザクションからのTLVデータを解析して画面に表示するコールバックのコードを含む)を、次の関数にラップしてあります。 startContactlessTransaction().
NodeベースのドライバがどのようにUSB接続を可能にするかについての詳細は、以前の投稿(リンクは下にスクロール)を参照してください。また、製品の追加ドキュメント、ホワイトペーパー、SDKドキュメントなどについては、ID TECHの無料の Downloadsページ を必ずご確認ください。
ID TECHのカードリーダーを含む評価キットの入手をご希望の方は、下記の番号までいつでもお電話ください。
