Web Payments API 更新

即時掌握網路付款的新功能。

Danyao Wang
Danyao Wang
Rouslan Solomakhin
Rouslan Solomakhin

自 2016 年起,網頁付款功能已在瀏覽器中公開提供。核心功能「Payment Request API」現已支援多個瀏覽器,包括 Chrome、Safari、Edge,以及即將推出的 Firefox。如果您是 Web Payments 新手,請參閱「Web Payments 總覽」一文,瞭解如何開始使用。

自推出付款要求 API 和付款處理程式 API 以來,兩者的規格已進行不少變更。這些變更不會破壞您的運作程式碼,但建議您留意這些變更。這篇文章 這些更新,也會繼續累積這些 API 變更。

新方法:hasEnrolledInstrument()

舊版 Payment Request API 中使用了 canMakePayment() 檢查使用者的付款方式是否存在。在規格最新更新中,canMakePayment() 已由 hasEnrolledInstrument() 取代,但功能並未改變。

hasEnrolledInstrument() 方法有所有主要瀏覽器的共識。 Chrome 已在 74 版中導入此方法,而 WebkitGecko 都存在追蹤錯誤,但截至 2019 年 6 月,尚未導入此方法。

如要使用新的 hasEnrolledInstrument() 方法,請替換類似 :

// Checking for instrument presence.
request.canMakePayment().then(handleInstrumentPresence).catch(handleError);

程式碼如下所示:

// Checking for instrument presence.
if (request.hasEnrolledInstrument) {
  // hasEnrolledInstrument() is available.
  request.hasEnrolledInstrument().then(handleInstrumentPresence).catch(handleError);
} else {
  request.canMakePayment().then(handleInstrumentPresence).catch(handleError);
}

canMakePayment()」已不再檢查付款方式是否存在

因為 hasEnrolledInstrument() 現在會處理使用者付款的檢查作業 樂器 canMakePayment() 已更新,現在只會檢查付款應用程式是否可用。

這項對 canMakePayment() 的變更會與 hasEnrolledInstrument() 的實作方式綁定。自 2019 年 6 月起,我們已在 Chrome 74 版中實作這項功能, 在任何其他瀏覽器中皆可使用請務必先確認 hasEnrolledInstrument() 方法是否可在使用者的瀏覽器中使用,再嘗試使用該方法。

// Checking for payment app availability without checking for instrument presence.
if (request.hasEnrolledInstrument) {
  // `canMakePayment()` behavior change corresponds to
  // `hasEnrolledInstrument()` availability.
  request.canMakePayment().then(handlePaymentAppAvailable).catch(handleError);
} else {
  console.log("Cannot check for payment app availability without checking for instrument presence.");
}

languageCode 已從 basic-card 付款方式中移除

PaymentAddress.languageCode 已從 basic-card 的運送地址和帳單地址中移除。其他付款的帳單地址 Google Pay 等付款方式則不受影響。

Chrome 74、Firefox 和 Safari 已實施這項變更。

PaymentRequest.show() 現在會使用選用的 detailsPromise

PaymentRequest.show() 可讓商家在得知最終總價前,先顯示付款要求 UI。商家必須在 10 秒內解決 detailsPromise 逾時。這項功能適用於快速的伺服器端來回傳輸。

這項功能已在 Chrome 75 和 Safari 中推出。

// Not implemented in Chrome 74 and older.
// There's no way to feature-detect this, so check a few
// older versions of Chrome that you're seeing hit your servers.
if (/Chrome\/((6[0-9])|(7[0-4]))/g.exec(navigator.userAgent) !== null) {
  return;
}

// Supported in Chrome 75+.
request.show(new Promise(function(resolveDetailsPromise, rejectDetailsPromise) {
  // Find out the exact total amount and call
  // `resolveDetailsPromise(details)`.
  // Use a 3 second timeout as an example.
  window.setTimeout(function() {
    resolveDetailsPromise(details);
  }, 3000); // 3 seconds.
}))
.then(handleResponse)
.catch(handleError);

PaymentRequestEvent.changePaymentMethod()

Payment Handler API 功能 PaymentRequestEvent.changePaymentMethod()敬上 允許使用付款處理常式 (例如Google Pay) 觸發 onpaymentmethodchange 事件處理常式。changePaymentMethod() 會傳回承諾,將解析為含有更新價格資訊 (例如重新計算稅金) 的商家回應

PaymentRequestEvent.changePaymentMethod()paymentmethodchange 事件皆可在 Chrome 76 中使用,而 WebKit 已在其技術預覽版中實作 paymentmethodchange 事件

// In service worker context, `self` is the global object.
self.addEventListener('paymentrequest', (evt) => {
  evt.respondWith(new Promise((confirmPaymentFunction, rejectPaymentFunction) => {
    if (evt.changePaymentMethod === undefined) {
      // Not implemented in this version of Chrome.
      return;
    }
    // Notify merchant that the user selected a different payment method.
    evt.changePaymentMethod('https://paymentapp.com', {country: 'US'})
    .then((responseFromMerchant) => {
      if (responseFromMerchant === null) {
        // Merchant ignored the 'paymentmethodchange' event.
        return;
      }
      handleResponseFromMerchant(responseFromMerchant);
    })
    .catch((error) => {
      handleError(error);
    });
  }));
});

商家範例:

if (request.onpaymentmethodchange === undefined) {
  // Feature not available in this browser.
  return;
}

request.addEventListener('paymentmethodchange', (evt) => {
  evt.updateWith(updateDetailsBasedOnPaymentMethod(evt, paymentDetails));
});
敬上

改善本機開發作業

Chrome 76 新增了兩項小幅改善,可提高開發人員的工作效率。如果您的當地 開發環境是使用自行簽署的憑證,現在您可以使用 --ignore-certificate-errors 指令列標記,允許 Chrome 允許網頁 開發環境中的 Payments API。如果使用本機網路開發 不支援 HTTPS 的伺服器,您也可以使用 使用 --unsafely-treat-insecure-origin-as-secure=<origin> 標記讓 Chrome 處理 做為 HTTPS 來源