Start · Sprachen · JavaScript · Referenz · CanMakePaymentEvent.respondWith()

CanMakePaymentEvent.respondWith()

Methode

Teilt dem Browser im <code>canmakepayment</code>-Handler eines Service Workers mit, ob die Payment-Handler-App die angefragte Zahlung verarbeiten kann.

seit JavaScript Experimentell: Chromium-basierte Browser (Chrome/E Kategorie: webapi

Signatur

CanMakePaymentEvent.prototype.respondWith(response)

Beschreibung

Die Methode respondWith() gehört zur Schnittstelle CanMakePaymentEvent der Payment Handler API. Ruft eine Händlerseite new PaymentRequest(...) auf und fragt danach mit canMakePayment() oder show() ab, ob Zahlungen möglich sind, löst der Browser im Service Worker einer registrierten Zahlungs-App (Payment Handler) das Ereignis canmakepayment aus. Mit respondWith() antwortet der Service Worker darauf mit true („ich kann zahlen“) oder false.

Übergeben wird entweder direkt ein Boolean oder ein Promise, das zu einem Boolean aufgelöst wird. Mit einem Promise kann der Handler asynchron prüfen, etwa ob ein Nutzerkonto hinterlegt ist, ob in IndexedDB gespeicherte Zahlungsmittel vorhanden sind oder ob die Zahlungs-App grundsätzlich einsatzbereit ist.

respondWith() muss synchron im Event-Handler aufgerufen werden, also bevor der Handler zurückkehrt. Wird es erst nach einem await aufgerufen, ist das Ereignis schon abgeschlossen und es wird eine InvalidStateError-Ausnahme geworfen. Asynchrone Arbeit gehört deshalb in das übergebene Promise.

Aus Datenschutzgründen liefert das Ereignis in aktuellen Chromium-Versionen nur wenige Informationen (z. B. topOrigin, paymentRequestOrigin, methodData) und wird nicht in jedem Kontext ausgelöst. Man sollte also nicht darauf bauen, die Händlerseite genauer zu identifizieren.

Parameter

Name Typ Default Beschreibung
$response Pflicht boolean | Promise<boolean> true, wenn der Payment Handler die Zahlung verarbeiten kann, sonst false. Alternativ ein Promise, das zu einem dieser Werte aufgelöst wird.

Rückgabewert

Typ
void
Beschreibung
Kein Rückgabewert (undefined). Wird die Methode ungültig aufgerufen (z. B. doppelt oder zu spät), wirft sie eine DOMException vom Typ InvalidStateError.

Beispiele

Einfache Antwort im Service Worker

// service-worker.js
self.addEventListener('canmakepayment', (event) => {
  // Die Zahlungs-App ist immer bereit
  event.respondWith(true);
});

Asynchrone Prüfung mit Promise

// service-worker.js
const hasStoredCard = async () => {
  const cache = await caches.open('wallet-v1');
  const res = await cache.match('/wallet/cards.json');
  if (!res) return false;
  const cards = await res.json();
  return cards.length > 0;
};

self.addEventListener('canmakepayment', (event) => {
  // respondWith synchron aufrufen, die Prüfung selbst läuft im Promise
  event.respondWith(
    hasStoredCard().catch(() => false)
  );
});

Nach unterstützter Zahlungsmethode filtern

// service-worker.js
const SUPPORTED = 'https://pay.example.com/methode';

self.addEventListener('canmakepayment', (event) => {
  const methods = (event.methodData ?? []).map((m) => m.supportedMethods);
  console.log('Angefragte Methoden:', methods);
  event.respondWith(methods.includes(SUPPORTED));
});
Angefragte Methoden: ["https://pay.example.com/methode"]

Falsch: respondWith nach await

self.addEventListener('canmakepayment', async (event) => {
  // FEHLER: Nach await ist das Ereignis bereits abgeschlossen
  const ok = await Promise.resolve(true);
  try {
    event.respondWith(ok);
  } catch (err) {
    console.error(err.name);
  }
});

// Richtig:
// event.respondWith(Promise.resolve(true));
InvalidStateError

// Wichtig · Fallstricke

  • Experimentell und nur in Chromium: Die Payment Handler API wird von Chrome und Edge unterstützt, aber nicht von Firefox und Safari. Vor dem Einsatz sollte man z. B. mit 'PaymentManager' in self bzw. registration.paymentManager prüfen, ob die API vorhanden ist.
  • Nur im Service-Worker-Kontext verfügbar und nur über HTTPS (sicherer Kontext).
  • respondWith() muss synchron im Handler aufgerufen werden und darf nur einmal aufgerufen werden, sonst folgt InvalidStateError.
  • Wird das Promise abgelehnt, wertet der Browser die Antwort als false. Fehler sollte man daher bewusst mit .catch(() => false) abfangen.
  • Ohne Handler für canmakepayment nimmt Chrome je nach Version an, dass die App zahlen kann. Besser ist es, immer ausdrücklich zu antworten.
  • Datenschutz: Chrome gibt in diesem Ereignis bewusst nur eingeschränkte Daten heraus. modifiers und Details zur Händlerseite sind unter Umständen leer oder fehlen ganz.