Google Pay API を使用すると、Google アカウントに保存されている支払い情報を使ってどこでも支払いを行えるようになります。このラボでは、ウェブ用の Google Pay クライアント ライブラリを利用して、迅速で便利、安全なエクスペリエンスを実現することで、シンプルなサンプル オンライン ストアの購入手続きを改善し、コンバージョンと顧客満足度の向上を図ります。
Auto T-Shirt Shop は、人工知能の最新の進歩を活かし、スタイル設定、天候、時期、ファッション トレンドなどの情報を使用して、お客様に最も適した商品を提案する革新的な店舗です。
この店舗のエンゲージメントに関する指標は、ルーフで示されています。残念ながら、この指標には購入手続きにおける多くの放棄が反映されています。プロジェクトのオーナーの 1 人が、Google Pay が同様のサイトで有望な結果を示した動画を見たことを思い出し、統合を任せることに決めました。
作業内容
この Codelab では、Google Pay を既存のサイトに統合する方法について説明します。ここでは、Google Pay でサポートされているお支払い方法を使用して支払いができるかどうか、支払いボタンの配置とデザイン、取引の実行などについて説明します。
学習内容
- Google Pay を既存の購入手続きページに統合する方法
- ご希望のお支払い方法を選択する方法
- ユーザーが Google Pay でのお支払いに対応しているかどうかを確認する方法
必要なもの
- インターネットに接続されているパソコン
- JavaScript の基礎知識
glitch.com でサンプルサイトを実行する
できるだけ早く起動して実行できるように、この Codelab は glitch.com で公開されています。Glitch は、ウェブ アプリケーションの構築と配信に使用できるコードエディタ、ホスティング機能、デプロイ機能を備えた、無料のウェブベースの環境です。
はじめに、この Codelab のコピーを設定済みの Glitch で新しい開発環境をプロビジョニングするために、以下のボタンを使用してください。
ここから、Glitch のコードエディタを使用してファイルを変更できます。上部にある [Show] メニューを使用してアプリケーションの配信を開始し、[In a New Window] を選択します。
サンプルサイト間をスクロールする
ご覧のように、リポジトリにはシンプルなファイル構造があります。この Codelab の主な目的は、フレームワーク、ライブラリ、ツールを選択しても、この統合を既存のアプリケーションと将来のアプリケーションに適応できるようにすることです。
サイトにアクセスする
このデモ マーケットプレイスは、購入手段を追加する前に、既存のアプリケーションや潜在的なアプリケーションの外観に似ているように作成されています。実際には、このデモ アプリケーションに取り組むことをおすすめしますが、この Codelab を使用して、Google Pay を既存のアプリケーションに統合することもできます。
まだ開始していない場合は、デモサイトを開きます。それには、Glitch を使用している場合は [Show] ボタンをクリックするか、ローカル ウェブサーバーが動作している URL を開きます。
デモサイトに驚くようなことは何もありません。商品の詳細ページ。画像、価格、説明、いくつかのセレクタ、架空の架空の通常の決済フォームを表示するためのボタンがある。
このラボでは、このフローを Google Pay による 2 クリック エクスペリエンスに置き換えることを目的としています。
計画しましょう!
この統合について理解を深めるため、このプロセスは次の基本的な手順から構成されています。
- ライブラリを読み込む
- Google Pay でのお支払いが可能かどうかを確認する
- Google Pay で支払うボタンを表示する
- 支払いリクエストを作成して送信する
- 結果を収集する
script
タグを追加する
Google Pay API の使用を開始するには、まず JavaScript ライブラリを読み込みます。これを行うには、API を呼び出す予定の HTML ファイルに script
タグを含め、外部 JavaScript ライブラリを指す src
属性を含めます。
この Codelab では、index.html
ファイルを開きます。スクリプトタグがすでに追加されています。
<script async
src="https://pay.google.com/gp/p/js/pay.js"
onload="onGooglePayLoaded()">
</script>
src
に加えて、他の 2 つの属性が追加されました。
async
を使用すると、スクリプトはページの他の部分と並行して読み込まれて実行されるため、ドキュメントの最初の読み込み時間には影響しません。onload
は、スクリプトが読み込まれるまで、このライブラリに依存するコードの実行を遅延させるのに役立ちます。この処理が完了すると、この属性で指定した関数が実行されます。この場合、関数はonGooglePayLoaded
です。
API クライアントをインスタンス化する
スクリプトが読み込まれると、このライブラリを使用するためのすべての準備が整います。まず、クライアント オブジェクトをインスタンス化します。このオブジェクトは、後で Google Pay API を呼び出すために使用します。
index.js
ファイルを編集します。このファイルは、このプロジェクトのファイル構造の一部になっています。onGooglePayLoaded
関数を次のコードに置き換えます。
let googlePayClient;
function onGooglePayLoaded() {
googlePayClient = new google.payments.api.PaymentsClient({
environment: 'TEST'
});
}
支払いクライアントは PaymentOptions
オブジェクトで初期化されます。environment
を TEST
に設定すると、統合全体でダミーのお支払い情報をテストできます。実際のトランザクションをサポートするオペレーションを作成する準備ができたら、environment
プロパティを PRODUCTION
に更新できます。
概要
Google Pay API JavaScript クライアント ライブラリが読み込まれました。ここで、API 呼び出しを行うように構成しましょう。
Codelab の残りの部分では、次のコードの変更をすべて index.js
ファイルに対して行います。
骨格
Google Pay API と通信のたびに、対象の API バージョンなど、さまざまな設定パラメータをリクエストに含める必要があります。この Codelab の目的上、このオブジェクトには、アプリケーションで受け入れられる支払い方法に関する情報も含まれています。最終的な構造は次のようになります。
{
apiVersion: number,
apiVersionMinor: number,
allowedPaymentMethods: Array
}
プロパティ allowedPaymentMethods
はお支払い方法のリストを取得します。お支払い方法ごとに、次のプロパティを含める必要があります。
{
type: 'CARD',
parameters: {
allowedCardNetworks: Array.<string>,
allowedAuthMethods: Array.<string>
}
}
対象のユーザーが Google Pay で支払いを行えるかどうかを判断するには、type
プロパティと parameters
プロパティのみが必要です。
お支払い方法の設定
この例では、1 つの構成のみを受け入れ、Mastercard と Visa のカード支払いを「トークン化」と「メインのアカウント番号」(PAN)の両方の形式で指定します。
index.js
での構成は次のようになります。
const baseCardPaymentMethod = {
type: 'CARD',
parameters: {
allowedCardNetworks: ['VISA','MASTERCARD'],
allowedAuthMethods: ['PAN_ONLY','CRYPTOGRAM_3DS']
}
};
まとめ
まとめ。
ウェブサイトで受け入れるお支払い方法を 1 つ定義し、バージョン 2.0 の API を使用します。結果として、次のような構成になります。
const baseCardPaymentMethod = {
type: 'CARD',
parameters: {
allowedCardNetworks: ['VISA','MASTERCARD'],
allowedAuthMethods: ['PAN_ONLY','CRYPTOGRAM_3DS']
}
};
const googlePayBaseConfiguration = {
apiVersion: 2,
apiVersionMinor: 0,
allowedPaymentMethods: [baseCardPaymentMethod]
};
基本的な構成ができたところで、次は面白い部分を見てみましょう。
Google Pay の主な目的の一つは、より迅速で便利な購入手続きを提供することです。これは、ユーザーが Google Pay を使用できる状況だけでなく、それを利用できない状況にも適用されます。isReadyToPay
リクエストを使用すると、Google Pay での支払いの可否と、それに応じてサイトでエクスペリエンスを変更する機会を判断することができます。
貴社のユーザーは Google Pay でお支払いいただけますか?
まず、サイトで支払いを行う特定のユーザーが Google Pay を使用できるかどうかを確認します。そのためには、Google Pay API のバージョンと、サイトで利用できるお支払い方法を指定する必要があります。これは、前のステップで定義した基本構成オブジェクトの内容と同じです。
index.js
の onGooglePayLoaded()
関数内に次の内容を貼り付けます。
googlePayClient.isReadyToPay(googlePayBaseConfiguration)
.then(function(response) {
if(response.result) {
createAndAddButton();
} else {
alert("Unable to pay using Google Pay");
}
}).catch(function(err) {
console.error("Error determining readiness to use Google Pay: ", err);
});
呼び出しが失敗した場合、またはレスポンスが失敗して返された場合、Google Pay 内ではこれ以上の対応は必要ありません。この場合は、他の支払い方法をサポートする追加の UI を表示することをおすすめします。
一方、レスポンスが成功した場合は、Google Pay の使用をユーザーに許可するための準備が整ったため、ユーザーのアクティベーション(ボタンクリックなど)によって支払いプロセスを開始するためのボタンを追加できます。
Google Pay で支払うボタンを追加する
支払い処理には、Google Pay のブランド ガイドラインに沿ったボタンを使用することもできますが、Google Pay API を使用して生成することをおすすめします。これにより、ブランド ガイドラインが正確に使用されているだけでなく、ローカライズなど、ボタンに組み込まれた他の改善点も活用できます。
ボタンを生成するには、PaymentsClient
オブジェクトの createButton
メソッド(ButtonOptions など)を使用してボタンを構成します。
index.js
の createAndAddButton()
関数内に次の内容を貼り付けます。
function createAndAddButton() {
const googlePayButton = googlePayClient.createButton({
// currently defaults to black if default or omitted
buttonColor: 'default',
// defaults to long if omitted
buttonType: 'long',
onClick: onGooglePaymentsButtonClicked
});
document.getElementById('buy-now').appendChild(googlePayButton);
}
function onGooglePaymentsButtonClicked() {
// TODO: Perform transaction
}
createButton
を使用する場合に必要なプロパティは onClick
だけです。ユーザーがボタンを有効にするたびにトリガーするコールバック オブジェクトまたは関数を決定するために必要です。buttonColor
と buttonType
では、ボタンの外観をカスタマイズできます。アプリのテーマと UI 要件に基づいてそれらを調整します。
このボタンを作成したら、DOM 内の適切なノードに追加するだけです。この例では、buy-now
で識別される div
ノードが使用されます。
ボタンのクリック イベントを処理する関数も定義したとします。次のセクションでは、この関数を使用してお支払い方法をリクエストします。
支払いリクエストを準備する
この時点で、Google Pay API の読み込みが完了しており、サイトのユーザーが Google Pay を使用して支払いを行えることを確認しました。その結果、UI に Google Pay 支払いボタンが表示され、ユーザーは取引を開始する準備が整いました。いよいよ、ログインしている個々のユーザーが利用できるお支払い方法を記載した最終的なお支払いシートを読み込みます。
先ほどと同様に、この呼び出しでは isReadyToPay
リクエストの定義中に、新しい基本オブジェクトに加えて、先ほど定義した基本設定オブジェクト(apiVersion
、apiVersionMinor
、allowedPaymentMethods
)のプロパティも必要となります。今回、お客様のお支払い方法に新しいプロパティ tokenizationSpecification
と parameters
が追加されました。さらに、transactionInfo
と merchantInfo
を追加する必要があります。
お支払い方法に必要なその他の情報を含める
まずは、以前使用したカードのお支払い方法のコピーを作成します。このカードのお支払い方法には、選択したお支払い方法に関連するデータの処理方法と、実際の取引に必要な追加データ要件(この例では完全な請求先住所と電話番号)を定義する tokenizationSpecification
プロパティが必要です。
tokenizationSpecification
プロパティ
トークン化仕様により、ユーザーが選択したお支払い方法の処理方法とトランザクションの完了方法が決まります。
サポートされている処理方法は 2 種類あります。PCI DSS 準拠サーバー内で支払い取引を処理している場合は、DIRECT
仕様タイプを使用します。この例では、支払いゲートウェイを使用して支払いを処理するため、PAYMENT_GATEWAY
仕様タイプを設定します。
index.js
の onGooglePaymentsButtonClicked()
関数内に次の内容を貼り付けます。
const tokenizationSpecification = {
type: 'PAYMENT_GATEWAY',
parameters: {
gateway: 'example',
gatewayMerchantId: 'gatewayMerchantId'
}
};
[parameters
] で、Google Pay API でサポートされているプロバイダのリストからゲートウェイと各ゲートウェイに必要な設定を指定できます。このラボでは、example
ゲートウェイを使用するだけで、実行されたトランザクションのテスト結果を得ることができます。
追加パラメータ
同様に、取引を完了するためにリクエストする必要のある情報について、より詳しい情報を提供できるようになりました。この例では、プロパティ billingAddressRequired
と billingAddressParameters
を追加して、このトランザクションではユーザーの請求先住所が電話番号を含む完全な形式である必要があることを示します。
index.js
の onGooglePaymentsButtonClicked()
関数内に次の内容を貼り付けます。
const cardPaymentMethod = {
type: 'CARD',
tokenizationSpecification: tokenizationSpecification,
parameters: {
allowedCardNetworks: ['VISA','MASTERCARD'],
allowedAuthMethods: ['PAN_ONLY','CRYPTOGRAM_3DS'],
billingAddressRequired: true,
billingAddressParameters: {
format: 'FULL',
phoneNumberRequired: true
}
}
};
取引に関する情報の追加
transactionInfo
プロパティには、トランザクションの財務情報、つまり価格と通貨コード(ISO 4217 アルファ形式)を含む価格のステータスと、取引の性質に応じて最終または見積があります(たとえば、価格は指定された配送先住所によって異なります)。
index.js
の onGooglePaymentsButtonClicked()
関数内に次の内容を貼り付けます。
const transactionInfo = {
totalPriceStatus: 'FINAL',
totalPrice: '123.45',
currencyCode: 'USD'
};
販売者に関する情報の追加
支払いリクエストでは、リクエストを行っている販売者に関する情報が merchantInfo
プロパティで取得されます。この Codelab では、次の 2 つに焦点を当てます。
-
merchantId
では、Google による本番環境での運用が承認されると、アカウントに関連付けられる識別子が想定されます。これは、TEST
環境を使用している間は評価されないことに注意してください。 merchantName
はサイトまたは組織のユーザーに表示される名前です。これは、Google Pay 支払いシート内に表示され、オペレーションをリクエストしているユーザーに関する詳細情報をユーザーに提供できます。
index.js
の onGooglePaymentsButtonClicked()
関数内に次の内容を貼り付けます。
const merchantInfo = {
// merchantId: '01234567890123456789', Only in PRODUCTION
merchantName: 'Example Merchant Name'
};
支払い情報をリクエストして結果を処理する
次に、以前に定義した構成を最終的な paymentDataRequest
オブジェクトに統合します。
index.js
の onGooglePaymentsButtonClicked()
関数内に次の内容を貼り付けます。
const paymentDataRequest = Object.assign({}, googlePayBaseConfiguration, {
allowedPaymentMethods: [cardPaymentMethod],
transactionInfo: transactionInfo,
merchantInfo: merchantInfo
});
この時点で、Google Pay API に有効なお支払い方法を尋ねるために必要な情報がすべてそろいました。そのためには、PaymentsClient
オブジェクトで loadPaymentData
メソッドを使用して、定義した構成を渡します。
index.js
の onGooglePaymentsButtonClicked()
関数内に次の内容を貼り付けます。
googlePayClient
.loadPaymentData(paymentDataRequest)
.then(function(paymentData) {
processPayment(paymentData);
}).catch(function(err) {
// Log error: { statusCode: CANCELED || DEVELOPER_ERROR }
});
loadPaymentData
メソッドを呼び出すと、Google Pay 支払いシートの表示がトリガーされます。設定エラーがない場合は、現在ログインしているアカウントに関連付けられている有効なお支払い方法の一覧が表示されます。
選択すると、シートが閉じ、Promise
が、選択されたお支払い方法に関連する情報を含む PaymentData オブジェクトで処理されます。
{
"apiVersionMinor": 0,
"apiVersion": 2,
"paymentMethodData": {
"description": "Visa •••• 1234",
"tokenizationData": {
"type": "PAYMENT_GATEWAY",
"token": "examplePaymentMethodToken"
},
"type": "CARD",
"info": {
"cardNetwork": "VISA",
"cardDetails": "1234",
"billingAddress": {
"phoneNumber": ...,
...
}
}
}
}
これで、このお支払い方法の情報を使用して実際の取引を行うことができるようになります。
function processPayment(paymentData) {
// TODO: Send a POST request to your processor with the payload
// https://us-central1-devrel-payments.cloudfunctions.net/google-pay-server
// Sorry, this is out-of-scope for this codelab.
return new Promise(function(resolve, reject) {
// @todo pass payment token to your gateway to process payment
const paymentToken = paymentData.paymentMethodData.tokenizationData.token;
console.log('mock send token ' + paymentToken + ' to payment processor');
setTimeout(function() {
console.log('mock response from processor');
alert('done');
resolve({});
}, 800);
});
}
ここまでは、支払い額が固定された取引を確認しました。しかし、トランザクションの特定のプロパティ(送料など)に基づいて価格を更新するとします。そのためには、クライアントの作成時に paymentDataCallback
パラメータを指定します。このコールバックは、トランザクションの変更を処理し、それに応じて変更を適用するために使用されます。選択した配送先住所、配送オプション、お支払い方法に対する変更を聞くことができます。この例では、選択した配送オプションの変更をリッスンします。まず、すべての送料情報を含む変数を定義し、paymentDataRequest
を変更してそれらを含めます。
const shippingOptionParameters = {
shippingOptions: [
{
id: 'shipping-001',
label: '$1.99: Standard shipping',
description: 'Delivered on May 15.'
},
{
id: 'shipping-002',
label: '$3.99: Expedited shipping',
description: 'Delivered on May 12.'
},
{
id: 'shipping-003',
label: '$10: Express shipping',
description: 'Delivered tomorrow.'
}
]
};
// Shipping surcharges mapped to the IDs above.
const shippingSurcharges = {
'shipping-001': 1.99,
'shipping-002': 3.99,
'shipping-003': 10
};
...
// Place inside of onGooglePaymentsButtonClicked()
paymentDataRequest.shippingAddressRequired = true;
paymentDataRequest.shippingOptionRequired = true;
paymentDataRequest.callbackIntents = ['SHIPPING_OPTION'];
paymentDataRequest.shippingOptionParameters = shippingOptionParameters;
次に、googlePayClient
の作成を変更して、paymentDataCallback
を含めます。これは、callbackIntents
に含まれる変更が支払いオペレーションに加えられるたびに呼び出されます。このコールバックには、プロパティが変更されたオブジェクトが含まれます。これらの変更点を使用して、更新された支払い取引を構築できます。
function onGooglePayLoaded() {
googlePayClient = new google.payments.api.PaymentsClient({
paymentDataCallbacks: { onPaymentDataChanged: paymentDataCallback },
environment: 'TEST'
});
...
}
function paymentDataCallback(callbackPayload) {
const selectedShippingOptionId = callbackPayload.shippingOptionData.id;
const shippingSurcharge = shippingSurcharges[selectedShippingOptionId];
const priceWithSurcharges = 123.45 + shippingSurcharge;
return {
newTransactionInfo: {
totalPriceStatus: 'FINAL',
totalPrice: priceWithSurcharges.toFixed(2),
totalPriceLabel: 'Total',
currencyCode: 'USD',
displayItems: [
{
label: 'Subtotal',
type: 'SUBTOTAL',
price: priceWithSurcharges.toFixed(2),
},
{
label: 'Shipping',
type: 'LINE_ITEM',
price: shippingSurcharge.toFixed(2),
status: 'FINAL'
}]
}
}
};
コールバックで新しいオブジェクトが返されると、支払いシートに表示される情報が、トランザクションで行われた変更を反映するように更新されます。
統合が正しく機能していることが確認できたので、Google Pay が使用可能になったらすぐに、お支払い設定をプリフェッチすることができます。これは、ユーザーが Google Pay 支払いボタンを有効(クリック)する前に発生します。
支払いデータをプリフェッチすると、ユーザーが支払いを決めるまでに、スプレッドシートの読み込みに必要な情報があらかじめ利用できるようになるため、読み込み時間が大幅に短縮され、全体的なエクスペリエンスが向上します。
このメソッドは、loadPaymentData
と同じ入力を想定しています。つまり、以前に定義した同じ paymentDataRequest
オブジェクトを使用できます。ここで、ユーザーが isReadyToPay
が正常に返された後に Google Pay を使用できると判断したら、プリフェッチ メソッドの呼び出しを含めるだけで済みます。
googlePayClient.isReadyToPay(googlePayBaseConfiguration)
.then(function(response) {
if(response.result) {
createAndAddButton();
googlePayClient.prefetchPaymentData(paymentDataRequest);
}
});
このように、ユーザーがボタンをクリックする前に支払いデータをプリフェッチすることで、読み込み時間を短縮しました。サイトの応答性が改善すると、コンバージョン率が向上します。
この Codelab または独自のアプリケーションで、サンプルサイトに Google Pay API が正常に統合されました。
これを本番環境に導入するには、統合チェックリストをご確認ください。審査が完了し、審査が完了すると、販売者 ID が送信されてクライアントの設定に追加されます。同様に、サードパーティの決済代行業者またはゲートウェイを利用する予定がある場合は、Google Pay でサポートされているプロバイダのリストを参考に設定してください。Google Pay を直接統合する場合は、このトピックのドキュメント セクションをご覧ください。
学習した内容
- サイトに Google API をインポートして設定します。
- API のサポートを決定し、それに応じて対処します。
- ユーザーが Google Pay を使用して支払うことができるボタンを追加します。
- すでに保存されているユーザーのお支払い情報を読み込んで処理します。
- 支払い情報をプリフェッチして、読み込み時間を最適化します。
次のステップ
- 詳しくは Google Pay についての記事をご覧ください。
- 統合チェックリストを確認し、販売者 ID を取得します。
- 2 つの異なるタイプの統合を見て、どちらが適しているかを決定します。具体的には、直接統合するか、支払いゲートウェイまたは決済代行業者を使用します。
- 支払い手続きを開始し、支払い承認ステータスを確認するには、支払い承認を設定します。(承認または不承認)
詳細
- ライブラリ リファレンスを確認する。
- エラーが見つかった場合は、実装をトラブルシューティングします。
- 詳しくは、Android に Google Pay を統合する方法についての記事をご覧ください。