まえがき
昨年12月に日本でもローンチしたAndroid Pay。メインの決済機能の他にも、ポイントカード事業者など向けにSave to Android Pay APIを提供している。このAPIを使うと(審査さえ通れば)誰でも、「ユーザが自社のポイントカードをAndroid Payに保存する」ような機能を実装できる。最近だとTカードやDocomoのdポイントが対応していた。
ユーザ目線での具体的な流れとしては以下のような感じ。
- ポイント事業者からのメールやWebサイトなどで "Android Payに保存"ボタンをクリックする
- Android Payがあればアプリが、そうでなければブラウザが開いてカード情報がGoogleサーバに保存される
- カードが保存されたあとは、Android Payアプリ上でバーコード表示したり、ポイント残高を確認したりできる
去年のGoogle I/Oでも紹介してたりしたのだけど、日本語の記事が見当たらないようなので、APIを使ってみた様子を紹介してみる。
(API利用申請の返事を待ってる時間を除けば)半日ほどで保存ボタンを実装するところまでいけた。
Android Payは日本でも一部の端末にプレインストールされ始めている。
事前準備
API利用申請
https://developers.google.com/save-to-android-pay/ から "SIGN UP"ボタンをクリックする。会社名や利用の目的などを聞かれるので適宜回答する。数日後に、API利用に必要な情報がメールで送られてくるはず。以下のプロジェクト作成のステップに進む前に、この申請が承認されるのを待つ必要がある。
プロジェクトの作成
https://developers.google.com/save-to-android-pay/guides/basic-setup
に従ってGoogle API Consoleからプロジェクトの作成、APIの利用設定、OAuthの設定などを行う。
概念の理解: ClassとObject
先に進む前に簡単に概念を整理していく。詳しくは公式サイトを読むのが良い。
Save to Android Pay APIではClass
という概念でポイントカードプログラムなどを扱う。
作成出来るClass
は以下の三種類
- Loyalty Card (ポイントカード、会員証)
- Gift Card (ギフトカード、商品券)
- Offer (クーポン、割引券)
各Class
はプログラムで共通の要素(ポイントプログラム名称など)を規定し、ユーザそれぞれに個別の要素(会員番号など)を規定するのがObject
となる。
また、特定の会員に限定したクーポンなどのためにLoyalty Linked Offerというものも提供されているようだ。
今回はLoyalty Cardを作成してみることにする。
実装編
とりあえずサンプルプロジェクトを動かす
"Android Payに保存"ボタンを実装する方法は二通りある。
- JavaScriptをサイトに埋め込む
- 特別な形式のリンクを作成する
今回はとりあえず試してみることが目的なので、まず(1)のJavaScript方式を、Googleが提供しているサンプルプロジェクトを利用して使ってみる。
サンプルプロジェクトはJava, Python, C#, Ruby, PHPなどなどで提供されているが、積極的にサポートされているのはJava, PHP, Pythonの3つぽい。
今回はJavaのプロジェクトを利用する。
git clone https://github.com/android-pay/s2ap-quickstart-java.git
でプロジェクトを落としてきて、秘密鍵を src/main/resources
にコピーした後、src/main/webapp/WEB-INF/web.xml
をよしなに更新する。
mvn appengine:devserver
でサーバを起動し、 http://localhost:8080/
にアクセスする。
Step1のボタンをクリックするとサンプル Loyalty Class
が保存され、その後Step2のボタンを押すと、会員証のプレビューが表示され、さらにボタンをクリックすると会員証がAndroid Payに保存される。
メールに埋め込めるリンクを作成する
サンプルプロジェクトも無事動いたので、冒頭のスクリーンショットにあったような、Eメールに埋め込めるような形でのボタンを作成していく。Eメールクライアントでは通常JavaScriptは使えないので、上で説明した(2)リンク形式を使うことになる。いずれにせよJson Web Token (JWT)形式でエンコードされたLoyalty Card
情報を取得することが肝になる。
新しいClassを作成する
Loyalty Class
は先に示したようにAPI経由で作成することも出来るが、最初に一度だけ作成すれば良いものなので、[Android Pay Merchant Console](Save to Android Pay Merchant Console)経由で作成するのが良さそう。[Android Pay Merchant Console](Save to Android Pay Merchant Console) にアクセスし、classesから"CREATE CLASS"を選択する。
ここで、Issuer Name
およびProgram Name
は後にユーザ向けに表示されるのでそれを考慮して決めるのが良い。Class ID
はユニークでさえあればなんでも良い。
Class status
は開発中は DRAFT
にしておき、開発が終了したら UNDER_REVIEW
にせよとのことらしいが、実際は最初から UNDER_REVIEW
にしてもいいようなきがする。 DRAFT
状態のClass
は開発用のアカウントからしかアクセス出来ないので、もし情報リークなどが気になるならDRAFT
で開発すると良い。
JWTを取得する
先のサンプルプロジェクトのsrc/main/java/com/google/wallet/objects/verticals/Loyalty.java
およびsrc/main/webapp/WEB-INF/web.xml
をよしなに編集する。ここで上ですでに保存したものとは違うclassIdおよびobjectIdを指定すること。
ふたたびサーバを立ち上げ、http://localhost:8080/jwt?type=loyalty
にアクセスすると、このloyalty cardのJWTが手に入る。
ところでJWTはただの署名付きJSONで特に暗号化などはされていないので、https://jwt.io/ みたいなサイトに突っ込むとデコードして中見を見ることが出来る。
(モザイクをうまくかけれなかった結果異次元なかんじになった)
ともあれ、生成したJWTを利用して、以下のようなURLを作成する。
https://www.android.com/payapp/savetoandroidpay/{jwt_generated}
これをメールに埋め込むと、以下のような事ができる。
という訳でサンプルコードほぼそのままで動かすことができた。ユーザが保存してくれたあとは、REST APIでポイント残高などを更新することができる。