NEMでおサイフケータイができないか検証してみた

おサイフケータイ良いですよねー。

今使ってるスマホには NFC が搭載されていないのですが、昔は良く使ってました。

タッチだけで決済完了はやっぱり便利ですよね!

というわけで、今回は NEM の決済をおサイフケータイ的にやれないかと調査・検証してみました。

作ったモノ

こちらです。

即席ですが UI も作ってみました。

NFC を使って NEM の支払いデータをスマホに転送してウォレットを立ち上げています。

構成

ソースはまとめて GitHub においてますので、より詳しく知りたい方はそちらをご覧ください。

今回使った ICカードリーダーは Sony の PaSoRi RC-S380 というやつです。3000円くらいで買えます。

課題

端末のロックを解除しておく必要あり

調べてみてわかりましたが、

  • Android で NFC のデータを読み込む場合、最低でもスクリーンをオンにする必要がある。アプリを立ち上げる場合はロックの解除も必要。
  • iOS で NFC のデータを読み込む場合、Core NFC を使う必要があるが、バックグラウンドでの動作はできない。

というわけで、現状では動画のようにあらかじめ端末のロックを解除して上げる必要があります。iOS の場合は専用アプリを立ち上げて貰う必要があります。

このあたりは OS の制限なので、新しい Android/iOS で対応してもらうのを待つほか無いかと。

完全におサイフケータイ、というわけにはいかなそうですね。でも QR コードの読み込みよりは手間が減るかな。

ウォレットの方にも変更が必要

立ち上げている NEM Wallet の Android 版ですが、少し修正しています。(一行足しただけ)

詳細は後述しますが、この修正をウォレットに取り込んでもらわないと、システムは実現できません。

早めに issue立てるかプルリクしようかと思ってますが、それ以前に GitHub に上がっているソースコードが最新じゃないように思うので、まずはそこから突っ込む必要がありそうです。

各部の詳細

ここからかなり技術寄りの話しです。

可能性を感じる部分はいくつかあるので、何かの参考にしてもらえれば。

GitHubのソースも合わせて参照ください。

構成詳細版

システムの構成をもうちょっと詳細に書いたものになります。

ICカードリーダーとAndroid端末の通信内容

PaSoRiとAndroid端末の通信には NDEF というデータ形式を使っています。

NDEF 形式の詳細は下記ページなどが参考になるかと。

正直 NFC のデータ通信のフォーマットは相当ややこしいのですが、とりあえずアプリケーションレベルからは

  • NDEF には Message と呼ばれる領域に複数の Record と呼ばれるデータを入れることができる。
  • 各 Record にはテキスト、URI などの種別がある。

くらい知っておけばどうにかなるような気がします。

任意でテキストを突っ込めるみたいなので、かなり応用範囲が広そうです。

極端な話ですが、秘密鍵を送ることでもできてしまいます。

秘密鍵自体を送るのはセキュリティ的に問題ありそうですが、例えば未署名のトランザクションを NFC で送って端末内で署名作成して送り返す、というのは何かに使えるかなーとも思いました。

タッチで署名。みたいな。

今回のシステムに関しては、テキストの Record を使って、使ってNEM の支払情報の JSON 文字列を渡しています。

JSON 文字列は QR コードの内容と同じ内容で、下記のようなものになります。

もう一つの Record として AAR (Android Application Record) というものを送っています。

これはちょっと特殊で、Android 端末に対して AAR に書かれているアプリの起動を指示する Record になっています。

通常、NFC でデータを受け取った Android 端末は、「どのアプリを使ってこのデータを開くか?」ということをユーザに確認するのですが、この AAR を使うと明示的に起動するアプリを指定することができます。

まとめると、PaSoRi から Android に送っているデータとしては下図のようになります。

Android アプリ

今回作ったアプリは、Android システムから通知された NDEF のデータを解析して支払情報を取り出し、NEM Wallet の支払画面を起動するという簡単なものです。

問題は NEM Wallet の方で、今の NEM Wallet は支払画面を直接外部アプリから起動することはできません。ただし、アプリ内では QR コード読み込み画面から支払情報を入力して画面起動するという遷移が存在しているので、これを他のアプリからでもできるようにしてしまえば結構簡単に解決します。

修正としては下記のように AndroidManifest.xml に一文足すだけです。

この外部起動許可しておいた方が良いんじゃないかと思う理由はもう一つあって、外部起動できると NEM の 支払い用カスタムURLスキームをアプリ外で作れるようになるんですよね。

例えば、nem-invoice://NXXXX....(支払いアドレス)?amount=10&message=msg みたいなリンクをクリックすると、支払情報が入力された状態でウォレットが起動するみたいなやつです。

QR コードはウォレットが入っているスマホとは別の場所に表示されている場合は便利なんですが、スマホの画面に QR コードが表示される状態になると読み取る術がなくなっちゃうんですよね・・・

これ以前解決しようとしたけど、上記設定になってなかったのでペンディングしてました。これもついでに解決できて良いんじゃないかと!

というわけでちょっと提案してみたいと思います。

PaSoRi の制御に関して

PaSoRi の制御は nfcpy という Python のライブラリを使っています。

nfcpy は PaSoRi だけでなくほかの ICカードリーダー/ライター にも対応しているらしいです。

また、PaSoRi の対応 OS は Windows しか記載ありませんが、nfcpy を使うと Mac からでも制御できます。

Raspberry Pi からでも使えるらしい。

NDEF のややこしいバイナリ列の作成を隠蔽してくれているので、初めてでも安心でした。

さいごに

実用化には課題があるので、やれるところから改善していきたいです。

いつものことなんですが、NEM の話より周辺技術の話しが多くなってしまいました。

まぁ、いいのです。既存の技術とうまくからんでいけるのが NEM のはずなので、何かが別の方のインスピレーションにつながれば幸いです。

それにしても今回検証するにあたり、手持ちのカードが

  • NFCチップを積んでいないSIMフリーの Android 端末 × 3 (Zenfone3、MediaPad、Priori3)
  • NFCはあるが、Felica に対応しておらず、Core NFC からも対応を外された iPhone 6s
  • NFCはあるが、タブレットな上に HCE に対応していない、指紋認証もない、完全放電状態で放置された Nexus7 2012

という微妙に足りてないメンツばっかりで途中でくじけそうになりましたが、なんとか検証報告ができて良かったです。


最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。



この記事をシェアする




りゅーた
フリーランスのエンジニアしてます。Android、iOS アプリの開発、対向サーバの開発、C/C++のライブラリ開発が現在のメイン。趣味はテニス。3児の父。 もっと詳しく

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA