1. 簡介
本程式碼實驗室是 Google Pay API for Web 101:基礎知識的延續,並依賴該程式碼實驗室中編寫的程式碼。如要完成本程式碼研究室,請務必先完成該程式碼研究室。
課程內容
- 如何自訂 Google Pay 按鈕
- 如何開始付款程序
- 如何確認付款授權狀態
- 如何處理運送地址變更
- 如何處理兌換代碼
軟硬體需求
- 您選擇的文字編輯器,用於編輯 HTML 和 JavaScript 檔案。
- Google Chrome 網路瀏覽器,或測試本機網站的其他方式。
- 如要使用正式版,您需要 Google Pay
merchantId。在 Google Pay 和錢包主控台註冊只需一分鐘,建議您現在就完成註冊。
使用 Firebase Studio 逐步操作
2. 自訂按鈕
這是 ButtonOptions 的簡介。詳情請參閱說明文件
選項 | 必要性 | 值 |
onClick | 必填 | JavaScript 事件處理常式的名稱 |
allowedPaymentMethods | 選用 | |
buttonColor | 選用 | 預設、黑色、白色 |
buttonLocale | 選用 | 兩個字母的 ISO 639-1 代碼。 |
buttonRadius | 選用 | 0 至 100 |
buttonRootNode | 選用 | HTMLDocument 或 ShadowRoot |
buttonSizeMode | 選用 | 靜態、填滿 |
buttonType | 選用 | 預訂、購買、結帳、捐款、訂購、付款、一般、訂閱 |
在 main.js 檔案中找出 renderGooglePayButton() 方法,然後替換成這裡列出的程式碼。
function renderGooglePayButton() {
const button = getGooglePaymentsClient().createButton({
buttonColor: 'default',
buttonType: 'buy',
buttonRadius: 4,
buttonLocale: 'en',
onClick: onGooglePaymentButtonClicked,
allowedPaymentMethods: baseGooglePayRequest.allowedPaymentMethods,
});
document.getElementById(GPAY_BUTTON_CONTAINER_ID).appendChild(button);
}
解釋程式碼
createButton()程式庫方法會採用ButtonOptions設定引數,讓您定義按鈕的外觀和行為。
3. 付款資料回呼
付款用戶端提供機制,讓您註冊函式來處理特定事件。第一個是付款授權,第二個是付款資料變更。
- 在
main.js中找出// todo: paymentDataCallbacks註解,並替換成以下程式碼。paymentDataCallbacks: { onPaymentAuthorized: onPaymentAuthorized, onPaymentDataChanged: onPaymentDataChanged }, - 然後找出
main.js的Event Handlers區段,並在區段結尾附加下列程式碼。function onPaymentAuthorized(paymentData) { // We'll fill this in later } function onPaymentDataChanged(intermediatePaymentData) { // We'll fill this in later } - 最後,在
main.js中找出// todo: callbackIntents註解,並將註解替換為以下程式碼。在本程式碼研究室中,我們將實作所有 4 個意圖。callbackIntents: [ 'PAYMENT_AUTHORIZATION', 'SHIPPING_ADDRESS', 'SHIPPING_OPTION', 'OFFER', ], shippingAddressRequired: true, shippingOptionRequired: true, shippingOptionParameters: { defaultSelectedOptionId: 'shipping-001', shippingOptions: [ { id: 'shipping-001', label: '$0.00: Free shipping', description: 'Free Shipping delivered in 5 business days.' }, { id: 'shipping-002', label: '$1.99: Standard shipping', description: 'Standard shipping delivered in 3 business days.' }, { id: 'shipping-003', label: '$1000: Express shipping', description: 'Express shipping delivered in 1 business day.' }, ], },
解釋程式碼
PaymentDataCallbacks屬性有兩個子屬性,分別用於付款授權回呼和付款資料變更回呼。- 如果實作回呼,則
onPaymentAuthorized為必要。當callbackIntents清單在PaymentDataRequest中包含PAYMENT_AUTHORIZATION時,系統會叫用這個回呼。 onPaymentDataChanged為選填欄位。當callbackIntents清單在PaymentDataRequest中包含OFFER、SHIPPING_ADDRESS或SHIPPING_OPTION時,系統會叫用此回呼。- 在
PaymentDataRequest中設定callbackIntents,觸發本程式碼研究室的兩個回呼。
4. 付款授權
授權付款功能用於啟動付款程序,並確認付款授權狀態。
找出您在上一個步驟中新增的 main.js 函式,然後將其替換為下列程式碼。onPaymentAuthorized()
function onPaymentAuthorized(paymentData) {
return new Promise(function(resolve, reject) {
// Write the data to console for debugging
console.log("onPaymentAuthorized", paymentData);
// Do something here to pass token to your gateway
// To simulate the payment processing, there is a 70% chance of success
const paymentAuthorizationResult = (Math.random() > 0.3)
? {transactionState: 'SUCCESS'}
: {
transactionState: 'ERROR',
error: {
intent: 'PAYMENT_AUTHORIZATION',
message: 'Insufficient funds',
reason: 'PAYMENT_DATA_INVALID'
}
};
resolve(paymentAuthorizationResult);
});
}
解釋程式碼
- 系統會使用
PaymentData引數叫用onPaymentAuthorized()回呼函式,且該函式必須傳回 promise。在本例中,函式會隨機選擇傳回成功或錯誤。在專案中,您會利用這個機會,使用paymentData.paymentMethodData.tokenizationData.token的paymentData中找到的權杖,透過閘道處理交易。
5. 變更付款資料
動態價格更新功能可讓商家依據所選運送地址動態更新運送選項和交易資訊。另外,你也能按照所選運送選項動態更新交易資訊。
找出您在上一個步驟中新增的 main.js 函式,然後將其替換為下列程式碼。onPaymentDataChanged()
function onPaymentDataChanged(intermediatePaymentData) {
return new Promise(function(resolve, reject) {
let paymentDataRequestUpdate = {};
// Write the data to console for debugging
console.log("onPaymentDataChanged", intermediatePaymentData);
switch(intermediatePaymentData.callbackTrigger)
{
case "INITIALIZE":
// Handle initialize
break;
case "SHIPPING_ADDRESS":
// Read intermediatePaymentData.transactionInfo
// Read intermediatePaymentData.shippingAddress
// Update paymentDataRequestUpdate.newTransactionInfo
break;
case "SHIPPING_OPTION":
// Read intermediatePaymentData.transactionInfo
// Read intermediatePaymentData.shippingOptionData
// Update paymentDataRequestUpdate.newTransactionInfo
// Update paymentDataRequestUpdate.newShippingOptionParameters
break;
case "OFFER":
// Read intermediatePaymentData.offerData
// Read intermediatePaymentData.transactionInfo
// Update paymentDataRequestUpdate.newTransactionInfo
// Update paymentDataRequestUpdate.newOfferInfo
break;
default:
// Update paymentDataRequestUpdate.error
}
resolve(paymentDataRequestUpdate);
});
}
解釋程式碼
onPaymentDataChanged()函式會將IntermediatePaymentData做為引數。如果付款畫面中的運送地址或運送選項發生變更,系統就會呼叫這個函式。onPaymentDataChanged()函式必須傳回 Promise,解析指定新交易資訊、運送選項和錯誤的PaymentDataRequestUpdate物件,以更新付款畫面。redemptionCodes是指在付款單中輸入的一組促銷代碼。包括已核准的代碼。
6. 結語
恭喜您完成本程式碼研究室!您已學會如何 ...
執行專案
使用 Google Chrome 測試
使用 Google Chrome 網路瀏覽器開啟 index.html,方法是依序點選 Chrome 主選單中的「檔案」>「開啟檔案...」。以這種方式開啟專案時,Chrome 會執行 main.js。其他網路瀏覽器可能不允許執行 JavaScript。
– 或 –
使用本機網路伺服器進行測試
如果已安裝 Python,請在根 pay-web-101 資料夾的終端機提示中執行 python3 -m http.server。
$ cd /your/path/to/pay-web-101
$ python3 -m http.server
Serving HTTP on :: port 8000 (http://[::]:8000/) ...
然後前往 http://localhost:8000 存取網站。
下一步該做什麼?
其他資源
- 在 Discord 的 #payments 頻道中加入對話
- 在 X 上追蹤 @GooglePayDevs
- 在 YouTube 觀看 Google Pay 相關影片