見出し画像

Amazon Pay支払いに対応しました&考慮ポイントあれこれ

こんにちは、Webエンジニアの山本です。
最近買って良かったものは"マーナの極しゃもじ"です。謎テクノロジーによってお米がまったくつかない最高のしゃもじでおすすめです。

さて、タイトルの通りですが先日スペースマーケットの支払い方法としてAmazon Payを新規導入しました。※Amazon Payのサイトでも紹介いただきました・・!
この記事ではさっくり概要の説明とスペースマーケットでの実装面の考慮ポイントなどをつらつら書いていきたいと思います。

Amazon Payって?

Amazon Payは、Amazon.co.jpアカウントに登録された住所情報とクレジットカード情報を使って、商品やサービスの支払いができるサービスです。

まずAmazonログインボタンを設置してAmazon側で認証をしてもらい、そのアクセストークンを使用して専用のウィジェットを描画して支払い、という流れになります。

・ユーザーサイドのうれしい
Amazonに登録しているクレジットカード/住所が使用できるので入力の手間が省ける。

・サービスサイドのうれしい
CVRまでのステップを減らすことができるのでカゴ落ち率の改善が期待できる。

※実際の支払い画面

予約リクエスト___スペースマーケット

Amazon Payの全体像を掴む意味では下記ページのクイックスタートガイドがおすすめです。

Amazon Pay開発者向け情報 

なぜAmazon Pay?

スペースマーケットではサービスの利用上ユーザーの住所は必要としないのでステップ数の面ではさほど恩恵はありませんが、クレジットカードを色々なサービスに登録することに抵抗感があるユーザーの方をキャッチできるというメリットは大きく、導入を決めました。

Amazon Payの仕様

# クレジットカード決済の前提知識
・オーソリ: クレジットカードが有効か、利用限度額を越えていないかなど決済可否のチェック&決済可能であれば指定した金額分の利用枠を確保する処理
・キャプチャ: オーソリした金額の請求(売上)を確定する処理
・払い戻し: キャプチャした請求について払い戻す処理

支払い方式
Amazon Payでは2種類の支払い方式をサポートしています。

・ワンタイムペイメント
支払いの度にサービス上でAmazonログイン&クレジットカードの選択などユーザーが操作を行う方式です。いわゆる一般的なECサイトに適しています。

・Auto Pay
初めに支払い契約を締結し、その契約に対して請求をたてる方式です。
初回の支払い時はワンタイムペイメントと同様Amazonログイン&クレジットカードの選択を行いますが、以降の請求発生のタイミングではユーザーの操作を必要とせず、事業者側が任意のタイミングで請求処理を行うことが可能です。月々の定期支払いが発生するようなサブスク系サービスなどに適しています。

スペースマーケットは定期支払いのサービスではありませんが、スペースの予約から利用までの間に請求金額が変更される可能性があり、支払いの都度ユーザーの操作を必須とするのはUX面で望ましくない等いくつかの理由でAuto Payを採用しました。

オブジェクトモデル
支払い契約に関するオブジェクト(BillingAgreement)を使用するのはAuto Payのみですが、その他はワンタイムペイメントと同様です。
Amazon Payオブジェクト

管理コンソール

セラーセントラルという事業者向けのWebアプリケーションが用意されています。売上の管理に加えてAPI KeyやAmazonログインのコールバックURLなど開発周りの設定もここで行います。

API周り

各オブジェクトのREST APIが用意されています。
SDKについても各種言語揃っており、スペースマーケットでは今までのRails環境に合わせる形でRubyで実装しました。

レスポンスデータフォーマット
最近では珍しく(?)レスポンスがXMLで返ってきます。
そのままでは若干扱いずらい部分もあったのでJSONに変換して処理しています。

リクエスト制限
Amazon Payではスロットリングという方式でAPIリクエストが制限されています。
スロットの上限を超えてリクエストが行われた場合にはエラーが発生しますが、公式のSDKであれば内部でリトライ処理が行われます。
そして僕はそんなことには気づかず、自前でリトライ処理を書いたあとにSDKのソースコードを読んで悲しい気持ちになりました^^

IPN(インスタント支払通知メッセージ)

CaptureやRefundのステータス更新など特定のイベントが発生した時にセラーセントラルで設定したURLに対して変更内容がWebhookで送信される機能です。

開発支援ツール

Code Generator
Amazon Payの支払いウィジェット表示に必要なスクリプトを生成することが出来るツールです。
時折設定した項目がスクリプトに反映されない時があったので注意が必要。

ScratchPad
Amazonログインや各種APIを実行出来るツールです。

考慮ポイントあれこれ

ネイティブアプリの対応
重要な点ですが、Amazon Payはアプリネイティブ環境では原則サポートされておらず、ウィジェット表示などはWebViewで表示する必要があります。
また、Amazonの推奨するセキュリティのレギュレーションにより標準のWebViewではなくiOSはSFSafariViewController、AndroidはChrome Custom Tabsを利用しています。

契約(BillingAgreement)のクローズ
承認された支払い契約には有効期限が存在しないため、適切にクローズ処理を行う必要があります。

・エラー発生時
契約の承認→オーソリという処理順になるので、オーソリ時に問題が発生→ユーザー離脱となると契約のみが残留する可能性があります。基本的にエラーが発生した場合は都度BillingAgreementをクローズし、再作成する形が推奨とされています。(参考フロー図

・サービス利用終了時
スペースマーケットでは予約と契約を1対1としているため、スペース利用完了後や予約キャンセル等契約が不要になったタイミングでクローズしています。

Capture、Refundの非同期処理
CaptureとRefundについては、リクエストすると必ずPendingステータスで返却され、非同期で処理されます。Amazon側の内部処理でエラーが発生する可能性があるので前述のIPNで検知する形が望ましいです。
またドキュメントには記載がありませんがBillingAgreementについてもステータス更新時などにIPNが送られます。

FAQが大事

FAQはAmazon Payの日本チームが運用されているそうで、細かい仕様やだいたいの疑問点に回答されているので、何かわからないことがあればまずそちらに目を通すのが良いと思います。
Amazon Pay FAQ

この記事が気に入ったらサポートをしてみませんか?