こんにちは、またくです。
ハンドメイドマーケット minne のプロダクトチームでエンジニアをしています。
v6.0.0 のアップデートにて minne Android アプリでのお支払い方法として Google Pay を追加しました。今回は minne Android アプリに Google Pay でのお支払いを実装するにあたり、どのように進めていったかを紹介します。
Google Pay について
Google Pay とは、簡単で安全な支払いサービスの1つです。Google アカウントに登録されたクレジットカードを使って支払うことができるため、支払いごとのクレジットカードの入力が不要になります。
Android アプリでの使用であれば、OS 4.4以上の端末で Google Pay を使うことができます。会員カードやポイントカードを集約して管理できる仕組みもあるのですが、ここでは触れません。
ついつい楽しくなってしまう紹介ページがありますので、よろしければこちらをご覧ください。https://pay.google.com/about/
実装
Tutorial - Google Pay API にサンプルコードとともにチュートリアルが載っており、基本的にここを見るとテスト環境において実装にまで到達できるような内容になっています。そのため、実装に至る過程におけるポイントを紹介したいと思います。
決済に至るまでに押さえるべきポイントは以下の通りです。
- Google Pay API とのやりとりをするための
PaymentsClient
のインスタンスを作成
// 例
paymentsClient = Wallet.getPaymentsClient(
this, // context
new Wallet.WalletOptions.Builder()
.setEnvironment(
// `ENVIRONMENT_PRODUCTION` はリリースビルドで指定しないと
// ERROR_CODE_MERCHANT_ACCOUNT_ERROR (405) が返ります
BuildConfig.DEBUG ? WalletConstants.ENVIRONMENT_TEST : WalletConstants.ENVIRONMENT_PRODUCTION)
.build()
);
- Transaction を作成するために価格や通貨コード等をセットして
PaymentDataRequest
を作成
private PaymentDataRequest createPaymentDataRequest() {
PaymentDataRequest.Builder request =
PaymentDataRequest.newBuilder()
.setTransactionInfo(
TransactionInfo.newBuilder()
// 金額が確定している場合、こちらを指定します
// もし注文確定後に金額が変わるような仕組みがあるならば
// FINAL でなく ESTIMATED を指定します
.setTotalPriceStatus(WalletConstants.TOTAL_PRICE_STATUS_FINAL)
// ここに支払うべき金額がセットされます
.setTotalPrice("1000")
// 日本円は "JPY" で指定します
.setCurrencyCode("JPY")
.build())
.addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_CARD)
.addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD)
.setCardRequirements(
CardRequirements.newBuilder()
.addAllowedCardNetworks(
Arrays.asList(
WalletConstants.CARD_NETWORK_AMEX,
WalletConstants.CARD_NETWORK_DISCOVER,
WalletConstants.CARD_NETWORK_VISA,
WalletConstants.CARD_NETWORK_MASTERCARD))
.build());
PaymentMethodTokenizationParameters params =
PaymentMethodTokenizationParameters.newBuilder()
.setPaymentMethodTokenizationType(
WalletConstants.PAYMENT_METHOD_TOKENIZATION_TYPE_PAYMENT_GATEWAY)
.addParameter("gateway", "exampleGatewayName")
.addParameter("gatewayMerchantId", "exampleGatewayMerchantId")
.build();
request.setPaymentMethodTokenizationParameters(params);
return request.build();
}
- 作成した PaymentDataRequest を用いて, PaymentsClient の
loadPaymentData
メソッドを呼ぶ
loadPaymentData メソッドによる結果は onActivityResult で取得できます。そこで支払いに関する認証情報(トークン) が渡されます。
そのトークンを用いて Google Pay を受け付けている決済会社とやりとりをするのですが、そもそも Google Pay API は決済を行うためのトークン取得までを責務としています。そのためトークンを使った決済処理に関しては範囲ではありません。
トークンを使って決済する処理は、対応している決済会社のドキュメントに従って実装を進めるようにしてください。
ブランドガイドライン
Brand guidelines - Google Pay にブランドガイドラインに関する詳細および使用するべきアセットが示されておりますので、それに沿った実装を心がけました。
このガイドラインとともに、Google の方に実際にアプリをレビューしていただいたことでスムーズに実装を行うことができました。
minne アプリ内でアセットをどう扱っているか
支払い方法一覧画面
ブランドマークがいくつか用意されている中で、支払い方法としてクレジットカードと並べて表示する際に、違和感がより少ないであろう枠付きのロゴを minne では使っています。
支払い方法選択画面
ガイドラインに沿って Google Pay のロゴを支払い方法として表示する際に、既存の選択画面でロゴを表示すると唐突な印象を受けてしまいました。そのためデザイナーの 鹿さんに全面的に相談に乗っていただき、レイアウトを以下のように変更しています。
既存の画面にロゴをシンプルに入れた案 | 調整後の画面 |
---|---|
注意点
Google Pay 利用時における端末の OS バージョンの制限
Google Pay を利用できる端末は OS 4.4 以上です。
Google Pay でのリクエスト時のモーダル表示時に、もし端末が OS 4.4 未満であれば利用できないようなメッセージが Google 側で出るようになっています。
そうはいっても、ようやく確認画面まで行って使えないことを知らされたとしたら、なんとも言えない徒労感がありますね。
もしアプリが 4.4 未満のバージョンもサポートしているのであれば、支払い方法としてまず選択できないようにしておくのが良いと思います。
クレジットカード会社の制限
受け付けられるクレジットカードの種類は、ホワイトリストとしてコード側で制御できます。 もしそのリストにないクレジットカードの場合、まず選択ができないように Google 側で制御してくれます。
サービスで利用できるカードブランドのみを書いておくと、購入時における選択時や処理で混乱がなくなりますね。
まとめ
今回は minne Android アプリにおける Google Pay の導入についてお話させていただきました。
今後も Android アプリを通じて様々な形で、minne を支える技術をお伝えしていきますのでご期待ください!!!!