透過 Google Pay 在網路上快速結帳

Google Pay API 可讓使用者使用儲存在 Google 帳戶中的付款資訊,隨時隨地進行付款。在這個研究室中,您運用 Google Pay 的用戶端程式庫,改善簡化版網路商店的結帳體驗,進而打造更快、更便利、更安全的使用體驗,進而帶來更多轉換、提升客戶滿意度。

這個商店的互動指標是透過屋頂計算。不過,這些指標也反映了結帳過程中的放棄率。我們十分樂意處理這項專案的負責人,他們發現影片顯示 Google Pay 為類似的網站創造出的驚人成效,因此他們決定採用這項做法,並且值得您信任整合服務。

建構目標

這個程式碼研究室會逐步引導您將 Google Pay 整合至現有的網站,包括確定使用者是否能使用 Google Pay 支援的付款方式付款、付款按鈕的位置和設計,以及執行交易。

課程內容

  • 如何將 Google Pay 整合至現有的結帳頁面
  • 如何選擇您偏好的付款方式
  • 如何判斷使用者是否準備好使用 Google Pay 付款

您需要準備的項目

  • 可上網的電腦
  • JavaScript 基本知識

在 glitch.com 執行範例網站

為了盡快讓遊戲上線,這個程式碼研究室已在 glitch.com 上推出。Glitch 是免費的網頁式環境,提供程式碼編輯器,以及代管和部署功能,可協助您建構和提供網路應用程式。

如要開始設定,請使用下方按鈕,在 Glitch 上佈建已用這個程式碼研究室所編寫的新開發環境。

在 Glitch.com 上啟動開發環境

之後,您可以使用 Glitch 的程式碼編輯器來修改檔案。如要開始使用您的應用程式,請使用頂端的 [顯示] 選單,然後選擇 [在新視窗中開啟]

透過範例網站進行瀏覽

如您所見,這個存放區具備未合併的檔案結構。本程式碼研究室的主要目標是讓您,能夠將這項整合調整套用至現有和未來的應用程式,不受您選擇的架構、程式庫或工具影響。

探索網站

此示範市集的建立方式與現行應用程式或潛在應用程式可能類似。在新增購買方式之前,這項流程看起來很類似。事實上,雖然我們建議您以本示範應用程式為基礎,也可以直接使用此程式碼研究室將 Google Pay 整合至您現有的應用程式中。

現在,如果尚未開啟示範網站,請先開啟。方法是在執行 Glitch 的情況下按一下 [顯示] 按鈕,或是開啟您執行本機網路伺服器的網址。

示範網站沒什麼驚喜,對吧?產品詳細資料頁面,有相片、價格、說明、部分選取器,並提供可前往虛構和一般付款方式的按鈕。

本研究室的目標是以由 Google Pay 技術提供的雙鍵體驗來取代這個流程。

讓我們來規劃一下!

為了進一步瞭解這類整合作業,相關程序分為下列基本步驟:

  1. 載入程式庫
  2. 決定使用 Google Pay 付款的功能
  3. 顯示透過 Google Pay 付款的按鈕
  4. 建立並傳送付款要求
  5. 收集結果

加入 script 標記

如要開始使用 Google Pay API,您必須先載入 JavaScript 程式庫。方法是在您要呼叫 API 的 HTML 檔案中加入 script 標記,包括指向外部 JavaScript 程式庫的 src 屬性。

針對這個程式碼研究室,開啟 index.html 檔案。您應該已經看到指令碼已經加入:

<script async
  src="https://pay.google.com/gp/p/js/pay.js"
  onload="onGooglePayLoaded()">
</script>

除了 src 以外,您還新增了另外兩個屬性。

  • 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 呼叫。

以下程式碼對程式碼其餘部分所做的所有變更,都將套用至 index.js 檔案。

骨骼

每次與 Google Pay API 進行通訊時,您需要在要求中加入一些設定參數,例如您指定的 API 版本。我們在此程式碼研究室中,此物件還包含應用程式中接受的付款方式相關資訊。最終的結構如下所示:

{
  apiVersion: number,
  apiVersionMinor: number,
  allowedPaymentMethods: Array
}

allowedPaymentMethods 屬性內含付款方式清單。無論採用哪一種付款方式,您都必須提供下列屬性:

{
  type: 'CARD',
  parameters: {
    allowedCardNetworks: Array.<string>,
    allowedAuthMethods: Array.<string>
  }
}

只有必要的屬性 typeparameters 才能判斷使用者是否能透過 Google Pay 付款。

付款方式設定

在此範例中,您只能接受一項設定,也就是使用代碼化和主要帳號 (PAN) 表單,允許以 Mastercard 和 Visa 卡支付卡片費用。

以下是您在 index.js 中配置的設定方式:

const baseCardPaymentMethod = {
  type: 'CARD',
  parameters: {
    allowedCardNetworks: ['VISA','MASTERCARD'],
    allowedAuthMethods: ['PAN_ONLY','CRYPTOGRAM_3DS']
  }
};

整合所有資訊

我們來複習一下。

您定義了可在網站上接受的一種付款方式,而您使用的是 API 2.0 版。實際結果如下:

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 的情況,同時也適用於他們無法使用 Google Pay 的情況。使用 isReadyToPay 要求,您就能判斷自己是否準備好使用 Google Pay 付款,以及有機會據此修改網站體驗。

您的使用者是否能透過 Google Pay 付款?

首先,您必須確認網站上即將付款的使用者是否能使用 Google Pay。您必須指定 Google Pay API 的版本,並為您的網站設定付款方式。而此步驟是在上一個步驟中定義的基本設定物件。

在「onGooglePayLoaded()」函式中的「index.js」中,貼上以下內容:

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 將不會採取進一步的行動。此時,最適當的步驟就是顯示其他支援使用者介面的其他使用者介面。

另一方面,如果回應成功,您現在可以讓使用者開始使用 Google Pay 了。因此,您即可新增一個按鈕,啟用使用者啟動程序 (例如按下按鈕)。

新增按鈕以透過 Google Pay 付款

雖然您可以使用任何符合 Google Pay 品牌規範的按鈕開始進行付款程序,但我們建議您透過 Google Pay API 產生一組按鈕。如此一來,您不但可以正確使用品牌規範,還能受惠於直接內建於按鈕上的其他改善功能,例如本地化。

如要產生按鈕,請使用 PaymentsClient 物件中的 createButton 方法,包括 ButtonOptions 設定按鈕。

在「createAndAddButton()」函式中的「index.js」中,貼上以下內容:

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,這是決定使用者每次啟用按鈕時觸發回呼物件或函式的必要屬性。buttonColorbuttonType 可讓您自訂按鈕的外觀。請根據應用程式的主題和使用者介面需求,據此進行微調。

建立按鈕後,您只需在按鈕中加入 DOM 中適當的節點即可。在這個範例中,使用 buy-now 識別的 div 節點可用於此目的。

假設您也定義了用來處理按鈕點擊事件的函式。在下一節中,您將使用這個函式來要求付款方式。

準備付款要求

到目前為止,您已經載入 Google Pay API,並確定您網站的使用者可以透過 Google Pay 付款。因此,您已在使用者介面中顯示 Google Pay 付款按鈕,使用者現在可以展開交易了。現在請載入最後一筆付款畫面,其中列出不同登入使用者可用的付款方式。

和先前一樣,在 isReadyToPay 要求的定義中,這項呼叫也必須對先前定義的基礎設定物件中的屬性 (apiVersionapiVersionMinorallowedPaymentMethods) 以及部分新物件。這次你的付款方式中有一項新屬性「tokenizationSpecification」,以及與你的要求相關的「parameters」相關要求。此外,您也必須加入transactionInfomerchantInfo

在您的付款方式中加入其他必要資訊

首先,請建立先前使用的基本卡片付款方式複本。此卡片付款方式現在需要一個 tokenizationSpecification 屬性,以便定義如何處理所選付款方式的相關資料,以及實際交易所需的其他資料規定:本例中為完整的帳單地址和電話號碼。

tokenizationSpecification 屬性

代碼化規格會決定客戶使用的付款方式,以及如何完成交易。

系統支援兩種不同類型的處理策略。如果您是透過 PCI DSS 相容伺服器處理付款交易,請使用 DIRECT 規格類型。在此範例中,您將使用付款閘道來處理付款,因此需設定 PAYMENT_GATEWAY 規格類型。

在「onGooglePaymentsButtonClicked()」函式中的「index.js」中,貼上以下內容:

const tokenizationSpecification = {
  type: 'PAYMENT_GATEWAY',
  parameters: {
    gateway: 'example',
    gatewayMerchantId: 'gatewayMerchantId'
  }
};

parameters 部分中,您可以指定 Google Pay API 支援的供應商清單以及各閘道所需要的其他設定。就本研究室而言,使用 example 閘道就足以為執行的交易產生測試結果。

其他參數

此外,您現在可以針對需提供交易所需的資訊,提供更多詳細資訊。在此範例中,您必須新增 billingAddressRequiredbillingAddressParameters 屬性,以指出這筆交易中必須指定使用者的完整帳單地址,包括電話號碼。

在「onGooglePaymentsButtonClicked()」函式中的「index.js」中,貼上以下內容:

const cardPaymentMethod = {
  type: 'CARD',
  tokenizationSpecification: tokenizationSpecification,
  parameters: {
    allowedCardNetworks: ['VISA','MASTERCARD'],
    allowedAuthMethods: ['PAN_ONLY','CRYPTOGRAM_3DS'],
    billingAddressRequired: true,
    billingAddressParameters: {
      format: 'FULL',
      phoneNumberRequired: true
    }
  }
};

新增交易相關資訊

transactionInfo 屬性包含一個物件,內含關於交易的財務詳細資料,也就是 price [價格]currency code (ISO 4217 Alpha 格式) 以及價格狀態 (可能是最終預估,視交易性質而定 (例如,價格可能會因指定的運送地址而異)。

在「onGooglePaymentsButtonClicked()」函式中的「index.js」中,貼上以下內容:

const transactionInfo = {
  totalPriceStatus: 'FINAL',
  totalPrice: '123.45',
  currencyCode: 'USD'
};

新增商家相關資訊

付款要求會針對在 merchantInfo 屬性下執行要求的商家提供相關資訊。在本程式碼研究室中,您將專注於兩個項目:

  • 您的網站獲准在 Google 實際執行後,「merchantId」預期與帳戶相關聯的 ID 相同。請注意,這在使用 TEST 環境時不會進行評估。
  • merchantName 是使用者可看見的網站或機構名稱。這項資訊可能會顯示在 Google Pay 付款畫面中,以便向使用者顯示更多資訊。

在「onGooglePaymentsButtonClicked()」函式中的「index.js」中,貼上以下內容:

const merchantInfo = {
  // merchantId: '01234567890123456789', Only in PRODUCTION
  merchantName: 'Example Merchant Name'
};

要求付款資訊並處理結果

現在,請將先前定義的設定合併成最後一個 paymentDataRequest 物件。

在「onGooglePaymentsButtonClicked()」函式中的「index.js」中,貼上以下內容:

const paymentDataRequest = Object.assign({}, googlePayBaseConfiguration, {
  allowedPaymentMethods: [cardPaymentMethod],
  transactionInfo: transactionInfo,
  merchantInfo: merchantInfo   
});

屆時,您便可以向 Google Pay API 提出有效的付款方式要求。方法是在 PaymentsClient 物件中使用 loadPaymentData 方法,並傳遞您剛剛定義的設定。

在「onGooglePaymentsButtonClicked()」函式中的「index.js」中,貼上以下內容:

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 物件。現在,您只需確定使用者可以使用 Google Pay,系統就會在 isReadyToPay 成功傳回要求之後,立即呼叫預先擷取方法:

googlePayClient.isReadyToPay(googlePayBaseConfiguration)
  .then(function(response) {
    if(response.result) {
      createAndAddButton();
      googlePayClient.prefetchPaymentData(paymentDataRequest);
    }
  });

和此一樣,在使用者點擊按鈕之前預先擷取付款資料,以縮短載入時間。改善網站回應速度應該可以提升轉換率。

您已成功將 Google Pay API 整合至本程式碼研究室或您自己的應用程式中。

現在,如要瞭解實際執行情況,請參閱整合檢查清單。完成並通過審查後,您會收到要新增至用戶端設定的商家 ID。同樣地,如果您打算使用 (或已經使用) 第三方付款處理方或閘道的功能,請前往 Google Pay 查看支援的供應商清單,並在其中設定您的服務供應商。如果您直接與 Google Pay 進行整合,請參閱這個主題的說明文件

報表主題

  • 匯入您的網站並設定 Google API。
  • 判斷對 API 的支援並做出相應的回應。
  • 新增按鈕,允許使用者透過 Google Pay 付款。
  • 載入及處理先前儲存的使用者付款資訊。
  • 預先擷取付款資訊,以縮短載入時間。

後續步驟

  • 進一步瞭解 Google Pay
  • 查看整合檢查清單並取得商家 ID。
  • 查看兩種整合類型,並判斷哪一種最適合您:直接整合或使用付款閘道或處理方。
  • 設定授權付款以啟動付款程序,並確認付款的授權狀態。(驗證或拒絕)

瞭解詳情

您覺得這實用嗎?

非常實用! 充分滿足你的期望不太對喔。

是否要查看其他程式碼研究室,協助您進行其他整合 (Android、直接整合、會員 API)?

那當然沒問題!我很滿意這項功能。