Update pada Web Payments API

Ikuti terus info terbaru tentang Pembayaran Web.

Danyao Wang
Danyao Wang
Rouslan Solomakhin
Rouslan Solomakhin

Pembayaran Web telah tersedia secara publik di browser sejak tahun 2016. Fitur inti—Payment Request API—kini tersedia di beberapa browser: Chrome, Safari, Edge, dan yang akan datang di Firefox. Jika Anda baru mengenal Pembayaran Web, lihat "Ringkasan Pembayaran Web" untuk memulai.

Sejak peluncuran Payment Request API dan Payment Handler API, ada beberapa perubahan yang dibuat pada spesifikasinya masing-masing. Perubahan ini tidak akan merusak kode yang berfungsi, tetapi sebaiknya Anda waspada. Postingan ini merangkum update tersebut dan akan terus mengakumulasi perubahan API tersebut.

Metode baru: hasEnrolledInstrument()

Pada Payment Request API versi sebelumnya, canMakePayment() digunakan untuk memeriksa keberadaan instrumen pembayaran pengguna. Dalam update spesifikasi terbaru, canMakePayment() telah diganti dengan hasEnrolledInstrument() tanpa mengubah fungsinya.

Metode hasEnrolledInstrument() memiliki konsensus dari semua browser utama. Chrome telah menerapkannya dalam versi 74 dan Webkit serta Gecko memiliki bug pelacakan, tetapi belum menerapkan metode tersebut hingga Juni 2019.

Untuk menggunakan metode hasEnrolledInstrument() baru, ganti kode yang terlihat seperti ini:

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

Dengan kode yang terlihat seperti ini:

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

canMakePayment() tidak lagi memeriksa keberadaan instrumen

Karena hasEnrolledInstrument() sekarang menangani pemeriksaan instrumen pembayaran pengguna, canMakePayment() telah diupdate agar hanya memeriksa ketersediaan aplikasi pembayaran.

Perubahan pada canMakePayment() ini terikat dengan implementasi hasEnrolledInstrument(). Mulai Juni 2019, implementasi ini diterapkan di Chrome 74, tetapi tidak di browser lain. Pastikan untuk memeriksa apakah metode hasEnrolledInstrument() tersedia di browser pengguna sebelum mencoba menggunakannya.

// 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 dihapus dari metode pembayaran basic-card

PaymentAddress.languageCode telah dihapus dari alamat pengiriman dan alamat penagihan untuk basic-card. Alamat penagihan metode pembayaran lainnya (seperti Google Pay) tidak akan terpengaruh.

Perubahan ini telah diterapkan di Chrome 74, Firefox, dan Safari.

PaymentRequest.show() kini menggunakan detailsPromise opsional

PaymentRequest.show() memungkinkan penjual menampilkan UI permintaan pembayaran sebelum total akhir dapat diketahui. Penjual memiliki waktu sepuluh detik untuk me-resolve detailsPromise sebelum waktu tunggu. Fitur ini ditujukan untuk perjalanan bolak-balik sisi server yang cepat.

Fitur ini telah tersedia di Chrome 75 dan 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()

Fitur Payment Handler API PaymentRequestEvent.changePaymentMethod() memungkinkan pengendali pembayaran (misalnya, Google Pay) untuk memicu pengendali peristiwa onpaymentmethodchange. changePaymentMethod() menampilkan promise yang di-resolve menjadi respons penjual dengan informasi harga yang diperbarui (misalnya, penghitungan ulang pajak).

Peristiwa PaymentRequestEvent.changePaymentMethod() dan paymentmethodchange tersedia di Chrome 76 dan Webkit telah menerapkan peristiwa paymentmethodchange dalam Pratinjau Teknologinya.

// 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);
    });
  }));
});

Contoh penjual:

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

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

Pengembangan lokal yang lebih baik

Chrome 76 menambahkan dua peningkatan kecil untuk produktivitas developer. Jika lingkungan pengembangan lokal menggunakan sertifikat yang ditandatangani sendiri, Anda kini dapat menggunakan flag command line --ignore-certificate-errors untuk membuat Chrome mengizinkan Web Payments API di lingkungan pengembangan. Jika mengembangkan aplikasi menggunakan server web lokal yang tidak mendukung HTTPS, Anda juga dapat menggunakan tanda --unsafely-treat-insecure-origin-as-secure=<origin> agar Chrome memperlakukan asal HTTP sebagai HTTPS.