ポイントカードやクーポンを半日でAndroid Pay対応する - Save to Android Pay APIガイド


まえがき

昨年12月に日本でもローンチしたAndroid Pay。メインの決済機能の他にも、ポイントカード事業者など向けにSave to Android Pay APIを提供している。このAPIを使うと(審査さえ通れば)誰でも、「ユーザが自社のポイントカードをAndroid Payに保存する」ような機能を実装できる。最近だとTカードやDocomoのdポイントが対応していた。

ユーザ目線での具体的な流れとしては以下のような感じ。

  1. ポイント事業者からのメールやWebサイトなどで "Android Payに保存"ボタンをクリックする
  2. Android Payがあればアプリが、そうでなければブラウザが開いてカード情報がGoogleサーバに保存される
  3. カードが保存されたあとは、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は以下の三種類

  1. Loyalty Card (ポイントカード、会員証)
  2. Gift Card (ギフトカード、商品券)
  3. Offer (クーポン、割引券)

Classはプログラムで共通の要素(ポイントプログラム名称など)を規定し、ユーザそれぞれに個別の要素(会員番号など)を規定するのがObjectとなる。

また、特定の会員に限定したクーポンなどのためにLoyalty Linked Offerというものも提供されているようだ。

今回はLoyalty Cardを作成してみることにする。

実装編

とりあえずサンプルプロジェクトを動かす

"Android Payに保存"ボタンを実装する方法は二通りある。

  1. JavaScriptをサイトに埋め込む
  2. 特別な形式のリンクを作成する

今回はとりあえず試してみることが目的なので、まず(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経由で作成するのが良さそう。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でポイント残高などを更新することができる。