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

### まえがき

昨年12月に[日本でもローンチ](https://japan.googleblog.com/2016/12/android-pay.html)したAndroid Pay。メインの決済機能の他にも、ポイントカード事業者など向けに[Save to Android Pay API](https://developers.google.com/save-to-android-pay/)を提供している。このAPIを使うと(審査さえ通れば)誰でも、「ユーザが自社のポイントカードをAndroid Payに保存する」ような機能を実装できる。最近だと[Tカード](http://tsite.jp/r/app/al/androidpay.html)やDocomoの[dポイントが対応](http://getnews.jp/archives/1863631)していた。

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

1. ポイント事業者からのメールやWebサイトなどで "Android Payに保存"ボタンをクリックする
1. Android Payがあればアプリが、そうでなければブラウザが開いてカード情報がGoogleサーバに保存される
1. カードが保存されたあとは、Android Payアプリ上でバーコード表示したり、ポイント残高を確認したりできる


![Screen Shot 2017-08-30 at 8.59.16 PM.png](https://qiita-image-store.s3.amazonaws.com/0/6000/a8ccc1dd-dadf-93f3-869e-322bd14fc6fe.png)


去年のGoogle I/Oでも[紹介してた](https://youtu.be/Z4iXOmtHTIc?t=4m14s)りしたのだけど、日本語の記事が見当たらないようなので、APIを使ってみた様子を紹介してみる。
(API利用申請の返事を待ってる時間を除けば)半日ほどで保存ボタンを実装するところまでいけた。

Android Payは日本でも[一部の端末にプレインストール](https://japan.googleblog.com/2017/06/android-one-x1.html)され始めている。


### 事前準備

#### 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
先に進む前に簡単に概念を整理していく。詳しくは[公式サイト](https://developers.google.com/save-to-android-pay/guides/loyalty/concepts)を読むのが良い。

Save to Android Pay APIでは`Class`という概念でポイントカードプログラムなどを扱う。

作成出来る`Class`は以下の三種類

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

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

また、特定の会員に限定したクーポンなどのために[Loyalty Linked Offer](https://developers.google.com/save-to-android-pay/guides/loyalty/loyalty-linked-offers)というものも提供されているようだ。

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

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

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

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

今回はとりあえず試してみることが目的なので、まず(1)のJavaScript方式を、Googleが提供しているサンプルプロジェクトを利用して使ってみる。
サンプルプロジェクトは[Java, Python, C#, Ruby, PHPなどなどで提供されている](https://github.com/android-pay)が、積極的にサポートされているのはJava, PHP, Pythonの[３つぽい](https://developers.google.com/save-to-android-pay/samples/quickstart-java)。
今回は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/` にアクセスする。

![Screen Shot 2017-09-05 at 10.02.27 PM.png](https://qiita-image-store.s3.amazonaws.com/0/6000/ddd0c34a-7038-3ed8-4207-18ec172dde5a.png)

Step1のボタンをクリックするとサンプル `Loyalty Class` が保存され、その後Step2のボタンを押すと、会員証のプレビューが表示され、さらにボタンをクリックすると会員証がAndroid Payに保存される。

![sketch-1504675021984.png](https://qiita-image-store.s3.amazonaws.com/0/6000/2530ce4b-dba2-37ed-d54d-82aca7d6b05f.png)


#### メールに埋め込めるリンクを作成する
サンプルプロジェクトも無事動いたので、冒頭のスクリーンショットにあったような、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`で開発すると良い。

![sketch-1504675970979.png](https://qiita-image-store.s3.amazonaws.com/0/6000/08a5a485-d9ea-34ed-7fba-e11dd47e38aa.png)


##### 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/ みたいなサイトに突っ込むとデコードして中見を見ることが出来る。

![sketch-1504673588866.png](https://qiita-image-store.s3.amazonaws.com/0/6000/3fee2d4d-93b2-9ae4-5397-532ef4684fcd.png)
（モザイクをうまくかけれなかった結果異次元なかんじになった）

ともあれ、生成したJWTを利用して、以下のようなURLを作成する。
> https://www.android.com/payapp/savetoandroidpay/{jwt_generated}

これをメールに埋め込むと、以下のような事ができる。

![output.gif](https://qiita-image-store.s3.amazonaws.com/0/6000/486ba946-e160-e4a4-f44b-f6ddea80ef65.gif)

という訳でサンプルコードほぼそのままで動かすことができた。ユーザが保存してくれたあとは、[REST API](https://developers.google.com/save-to-android-pay/reference/v1/)でポイント残高などを更新することができる。